WinFrom开发小案例

运行图:

管理 1

管理 2

各节点的效用

虽然您熟习Hadoop的话,可以如此做一下类比:

Hadoop Storm
JobTracker Nimbus(只有一个)
TaskTracker Supervisor(有很多个)
MapReduce任务 Topology

可以看出Nimbus是调度器,WorkerTask的容器,Task是职责的的确实施者。

按钮:

次第中的btn按钮:保存、重置、退出、添加、查询,要想实现他们的法力,就得双击他们接下来在其间打上代码,才能加之他们效能,这里要小心按钮的命名规范。

从节点(Slave node)

Storm集群上有六个从节点,他们从Nimbus上下载拓扑的代码,然后去真正实施。Slave上的Supervisor过程是用来监督和管制实际运行工作代码的历程。在Storm
0.9自此,又多了一个历程Logviewer,可以用Storm
UI来查看Slave节点上的log文件。
在布置文件storm.yaml中,决定了一台机械上运行多少个worker:

supervisor.slots.ports:
- 6700
- 6701
- 6702

运行图:

管理 3

 

ZooKeeper的作用

ZooKeeper在Storm上不是用来做音讯传输用的,而是用来提供协调服务(coordination
service),同时储存拓扑的状态和总结数据。

  • ZooKeeper相当于一块黑板,SupervisorNimbus和worker都在地点留下约定好的信息。例如Supervisor启动时,会在ZooKeeper上注册,Nimbus就足以窥见SupervisorSupervisor在ZooKeeper上留下心跳音信,Nimbus通过那几个心跳音讯来对Supervisor开展正规检测,检测出坏节点
  • 由于Storm组件(component)的事态音讯存储在ZooKeeper上,所以Storm组件就足以无状态,可以kill -9来杀死
    • 例如:Supervisors/Nimbus的重启不影响正在运行中的拓扑,因为状态都在ZooKeeper上,从ZooKeeper上再次加载一下就好了
  • 用来做心跳
    • Worker通过ZooKeeper把孩子executor的图景以心跳的款型报告给Nimbus
    • Supervisor进程经过ZK把温馨的境况也以心跳的花样反映给Nimbua
  • 仓储最近任务的谬误处境(拓扑截至时会删除)

保存按钮代码:

                if (checkinput())//调用检测输入的完整性方法
                {
                using (SqlConnection con = new SqlConnection(conStr))//创建连接对象,指定连接字符串
                {
                    con.Open();//打开连接
                    string sql = "insert B(name,sex) values  (@name,@sex)";//SQL语句,在数据库里要执行的操作
                    SqlCommand cmd = new SqlCommand(sql, con);//Cmand命名对象执行操作
                    cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));//指定参数跟对应的数据匹配
                    cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));//指定参数跟对应的数据匹配
                    int fh = cmd.ExecuteNonQuery();//ExecuteNonQuery(),这个方法在执行增、删、改的时候就调用它
                    if (fh > 0) MessageBox.Show("添加成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    sj();//调用这个方法更新DGV表格中的数据
                    rs();//调用这个方法更行lbl总人数的数据
                }
            }

硬件要求

付出环境:

Storm的容错(Fault Tolerance)机制

正如“搭建一个Storm集群”一文介绍的一致,必须用工具如daemontools或者monit来监督Nimbus和Supervisor的后台进程。这样一旦Nimbus或者Supervisor经过挂掉,会被daemontools检测到,并展开重启。

NimbusSupervisor过程被规划成很快退步(fail
fast)的(当碰着特此外状态,进程就会挂掉)并且是无状态的(状态都保存在Zookeeper或者在磁盘上)。

最根本的是,worker进程不会因为Nimbus或者Supervisor挂掉而受影响。这跟Hadoop是不相同的,当JobTracker挂掉,所有的任务都会没了。

  1. 当Nimbus挂掉会如何?

    只要Nimbus是以引进的方法处于进程监管(例如通过supervisord)之下,这它会被重启,不会有其余影响

    否则当Nimbus挂掉后:

    • 现已存在的拓扑可以继续健康运作,不过不可以交到新拓扑
    • 正在运行的worker进程依旧可以继承工作。而且当worker挂掉,supervisor会一向重启worker。
    • 挫折的天职不会被分配到任何机器(是Nimbus的任务)上了
  2. 管理,当一个Supervisor(slave节点)挂掉会怎么着?

    若果Supervisor是以引进的法门处于进程监管(例如通过(supervisord)[supervisord.org/])之下,这它会被重启,不会有任何影响

    要不然当Supervisor挂掉:
    分配到这台机械的装有任务(task)会晚点,Nimbus会把这么些任务(task)重新分配给任何机器。

  3. 当一个worker挂掉会怎么?

    当一个worker挂掉,supervisor会重启它。倘诺开行一向失利那么此时worker也就无法和Nimbus保持心跳了,Nimbus会重新分配worker到其余机器

  4. Nimbus算是一个单点故障吗?
    假设Nimbus节点挂掉,worker进程仍旧可以持续工作。而且当worker挂掉,supervisor会一贯重启worker。不过,没有了Nimbus,当需要的时候(假设worker机器挂掉了)worker就不可以被重新分配到此外机器了。
    于是答案是,Nimbus在“某种程度”上属于单点故障的。在事实上中,这种场所没什么大不断的,因为当Nimbus进程挂掉,不会有悲惨的事务时有暴发

SQLserver2008

转载请保留作者和原文出处

ExcuteScalar():

以此办法只回去查询结果集的第一行第一列

本文是Storm连串之一,紧要介绍Storm的架构设计,推荐读者在翻阅Storm介绍(一)的基本功之上,阅读这一篇。本文只是作者的读书笔记,偏重于浅层次的架构介绍,虽然想的确了然里面设计时候的衡量,还亟需更多的去阅读Storm源码。

rs();方法的代码:

            private void rs()
           {
            using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=sa;database=YG"))
            {
                con.Open();
                string sql = "select count(*)from B";
                SqlCommand cmd = new SqlCommand(sql, con);
                object cx = cmd.ExecuteScalar();
                //lblRS.Text = cx.ToString(); 将查询到的结果同步标签
                lblrs.Text = cx.ToString(); //将查询到的结果同步到lbl标签
            }
        }

启航拓扑

为了在集群上启动一个拓扑,需要首先把代码打包成一个“胖jar包”–必须包含所有的依赖性代码,除了Storm它自身,因为Storm集群会提供。然后在一台设置了storm命令行的机器上通过storm jar指令来交给拓扑:

storm jar my-topology-version-with-dependency.jar com.corp.MyTopology arg1 arg2

以此命令会连到Nimbus,上传jar包。接下来Nimbus会把拓扑的代码运送到多台不同的机器或者JVM上。只有当拓扑在机器上配备成功了同时在JVM中开首化了后头,才能真的开头拍卖信息。

运行图:

管理 4

在TextBox文本框中,依照性别查询这里输入了一个:男
DGV表格中显示了富有性别为男的音讯。

作者:Jack47

保留按钮代码:

                if (checkinput())
                {
                using (SqlConnection con = new SqlConnection(conStr))
                {
                    con.Open();
                    string sql = "insert B(name,sex) values  (@name,@sex)";
                    SqlCommand cmd = new SqlCommand(sql, con);
                    cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));
                    cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));
                    int fh = cmd.ExecuteNonQuery();
                    if (fh > 0) MessageBox.Show("添加成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    sj();
                    rs();
                }
            }

此地调用了检测输入的完整性方法:checkinput,假若姓名TextBox文本框或性别TextBox文本框中,姓名没输入,程序会提示请输入姓名,性别没输入,程序会指示请输入性别。

架构

先上一张Storm的架构图,假设领会GFS和Hadoop的架构,会发现这么些类其余架构图都很类似。
管理 5

Storm架构图

查询按钮代码:

            SqlConnection con = new SqlConnection(conStr);//创建连接对象指定连接字符串
            //string sql = "select * from B where name like '%"+ txtcx.Text + "%'";
            string sql = string.Format("select*from B where name like'%{0}%' or sex like'%{1}%' or id like'%{2}%'",txtcx.Text,txtcx.Text,txtcx.Text);//SQL语句根据TextBox输入的查询条件进行模糊查询
            DataTable b1 = new DataTable();//创建表对象
            SqlDataAdapter cx1 = new SqlDataAdapter(sql, con);//连接数据库并执行sql语句
            cx1.Fill(b1);//将查询的内容填充到表对象
            dataGridView1.DataSource = b1;//设置DGV表的数据来源

迎接关注本身的微信公众账号程序员Jack,两边的稿子会共同,也足以添加我的RSS订阅源

注释:

Master结点(Master node)

在分布式系统中,调度服务相当关键,它的统筹,会平昔关乎到系统的运转效能,错误復苏(fail
over),故障检测(error detection)和水准扩大(scale)的力量。

集群上职责(task)的调度由一个Master节点来担负。这台机械上运行的Nimbus经过负责任务的调度。此外一个过程是Storm
UI,可以界面上查看集群和兼具的拓扑的运行状态。

充足按钮代码:

            添加人员 a = new 添加人员();//创建窗体对象
            a.ShowDialog();//以对话框模式弹出
            sj();//调用sj();这个方法来更新添加的人员数据到DGV表格中

此间丰盛按钮的功能跟保存按钮的效能是相仿的,目标都是为了抬高人士数量,只不过大家在那边做了一些代码知识的恢宏。

略知一二Storm的架构,有助于帮衬我们精通大型分布式系统设计中需要缓解的题目,以及缓解问题的思绪,援救咱们更好的开展Storm性能调优化。

VisualStudio2015

Storm安全性

本来设计Storm时,完全没有把安全性考虑在内
前天安全性能相关的功效在一步步加进去
Storm 0.9.x本子上的安全问题:

  1. 一向不认证机制(authentication),没有授权机制(authorization)
  2. 传输的数码(例如worker之间)没有加密
  3. ZooKeeper上囤积的多少尚未访问限制
  4. 假诺Nimbus的Thrift端口没有锁住,任意的用户代码都可以在节点上执行

更多Storm安全性方面的提议见这里

题外话:
在触发Storm之后,有个问题在自己的脑英里升起,国内的大公司,比如Baidu,Ali,腾讯,都是有出生Storm这类实时总计框架的土壤的,不过为啥平素不做出来啊?

Apache Storm Basic
Training

Fault
tolerance

Storm in pictures

Storm 0.9 Basic
Training


一旦您看了本篇博客,觉得对你拥有收获,请点击右下角的“推荐”,让更四个人见状!

辅助杰克47写作,打赏一个鸡蛋灌饼钱呢

管理 6

微信打赏

管理 7

支付宝打赏

运行图:

管理 8

输入的信息不完全的话,会指示请输入完整的音讯,这里也得写一个检测输入完整性的措施,音讯输入完整后就足以点击保存了,保存按钮的代码和方面的接近,点击重返按钮后当前窗体就会关闭重返到人士管理主界面。

ZooKeeper

  1. 引进精心设计过的机器,因为ZooKeeper是Storm的瓶颈
    • 各样机器使用一个ZK的实例
    • 专注因为同一台机械上的别样进程或者虚拟机他们是共享这台机器的,所以可能会影响ZK的属性(来源)
  2. I/O是ZooKeeper的瓶颈
  • 把ZooKeeper的贮存放到自己的磁盘上
  • 运用SSD会显然提高性能
  • 例行状态下,Zookeeper的每一遍写操作都会共同到磁盘,这就招致了三遍磁盘寻址操作(三次是数码,四回是数额的日志)。当所有的worker都发心跳给ZooKeeper时,可能会明确影响属性(来源)。
    • 需要监控ZooKeeper节点的I/O负载
  1. 推介在生养环境上运行的ZooKooper集群有至少3个节点,这样即使有一个ZooKeeper服务器挂掉了(例如举办保障),也是足以的。

lbl标签:

程序中的lbl标签:编号、人数、姓名、性别、请输入要询问的音讯,这里他们只起到了验证效益,所有命名一般为默认,只修改Text文本。

先后中的lbl标签:编号后边的0,他起到了同步表中选中人士的id(编号)
人数前边的0,他的法力是随时更新表中总人数,他们的命名要标准,后边的代码才能编写更方便。

运行图:

管理 9

输入好音信后,点击重置按钮就会清空输入的音信

管理 10

 那么效用都差不多快到家了,大家会发觉有了新增,却少了删除跟修改的功力!!!

将SQL数据库中的数据读取到程序的DGV表格中代码:

            private void sj()
            {
            SqlConnection con = new SqlConnection(conStr);//创建连接对象指定连接字符串
            string sql = "select*from B";//sql查询语句
            SqlDataAdapter cx = new SqlDataAdapter(sql, con);//连接数据库并执行sql语句
            DataTable ta = new DataTable();//创建表对象
            cx.Fill(ta);//将查询的内容填充到表对象
            dataGridView1.DataSource = ta;//设置DGV表的数据来源
        }

实际上这些主意在后边就曾经冒出过了,当我们新增一个人口的时候,就得调用sj();那么些艺术来更新DGV表格中的数据。

右键菜单中修改按钮的代码:

            添加人员 a = new 添加人员();//创建窗体对象
            a.Text = "修改人员";//将添加人员的窗体Text文本修改为“修改人员”
            a.Tag = dataGridView1.SelectedRows[0].Cells["id"].Value.ToString();//将选中的数据传递给修改人员窗体
            a.txtname.Text = dataGridView1.SelectedRows[0].Cells["name"].Value.ToString();//DGV表中选中的人员名字传递到修改人员窗体
            a.txtsex.Text = dataGridView1.SelectedRows[0].Cells["sex"].Value.ToString();///DGV表中选中的人员性别传递到修改人员窗体
            a.ShowDialog();//以对话框模式弹出

运行图:

管理 11

运行图:

管理 12

在TextBox文本框中,依据姓查询那里输入了一个:刘
 DGV表格中就会彰显所有姓刘的人手信息

重置按钮的代码:

 

            lblid.Text = "0";//lbl文本默认为0
            txtname.Clear();//将Text文本框的内容清空
            txtsex.Clear();//将Text文本框的内容清空
            txtname.Focus();//设置焦点

 

右键菜单中除去按钮的代码:

                   if (dataGridView1.SelectedRows.Count > 0)
                   {
                   string xz = dataGridView1.SelectedRows[0].Cells["id"].Value.ToString();
                   using (SqlConnection con = new SqlConnection(conStr))
                   {
                    con.Open();
                    string sql = string.Format("delete from B where id='{0}'", xz);
                    SqlCommand cmd = new SqlCommand(sql, con);
                    int fh = cmd.ExecuteNonQuery();
                    if (fh > 0)
                    {
                        MessageBox.Show("删除成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        sj();
                        rs();
                    }
                    else
                    {
                        MessageBox.Show("删除失败!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        sj();
                        rs();
                    }
                }

增、删、改、查,的代码流程都大致相同:首先成立连接对象指定连接字符串,打开连接、sql语句在数据库里要做什么样操作(增、删、改、查)、然后成立Command命令对象连接数据库并执行sql语句,定义一个变量来采纳模式的重返值,增、删、改操作时,调用ExecuteNonQuer这多少个点子,查询操作时,一般调用的是Excute里德(Reade)r这个主意,要做的操作不同,调用的形式也会不同,定义变量时也得定义匹配这些艺术的变量。

封存按钮功效:

程序运行时,在姓名TextBox文本框中、性别TextBox文本框中,分别输入人士的姓名、性别,然后按保存按钮,人士的音讯就被存到了数据库中。

C\

新加一个人口运行图:

管理 13

音信输入完整添加事业有成,我们看人数后边的数字是:12,当自身按确定今后,神奇的事体就暴发了!

管理 14

人数前边的数字12成为了13,这里就是因为保存按钮里调用了,rs();这多少个方法所以才有更新数据的效果

数据库:

检测输入的完整性方法代码:

            private bool checkinput()
            {
            if (txtname.Text == null || txtname.Text == "")
            {
                MessageBox.Show("请输入姓名", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtname.Focus();
                return false;
            }
            if (txtsex.Text == null || txtsex.Text == "")
            {
                MessageBox.Show("请输入性别", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtsex.Focus();
                return false;
            }
            return true;
        }

ExcuteReader():

询问多行多列

新保存的人员数量,即刻就能在DGV表格中找到:

管理 15

这是因为保存按钮代码里调用了,sj();这些法子,将新保存的人手信息更新到了DGV表格中。

音信输入不完整运作效果图:

管理 16

管理 17

保存按钮的代码里还调用了,sj();rs();这两个主意,sj();这么些办法起到了刷新添加人士的信息到DGV表格中,rs();这多少个点子起到了履新lbl人数标签前面的数码效能,更新了总人数的数额信息。

次第主界面:

 管理 18

运行图:

管理 19

 

在此处大家可以在DGV表格里加一个上下文菜单,来实现修改和删除的功效。

修改人口窗体中保留按钮代码:

                    if (checkinput())
                    {
                    if (this.Text == "添加人员")
                    {
                    using (SqlConnection con = new SqlConnection(conStr))
                    {
                        con.Open();
                        string sql = "insert B(name,sex) values  (@name,@sex)";
                        SqlCommand cmd = new SqlCommand(sql, con);
                        cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));
                        cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));
                        int fh = cmd.ExecuteNonQuery();
                        if (fh > 0) MessageBox.Show("添加成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        this.Close();
                    }
                    }
                    else
                    {
                    using (SqlConnection con = new SqlConnection(conStr))
                    {
                        con.Open();
                        //update<修改对象所在表> set < 修改对象 >=< 值 > where < 条件对象 >=< '条件内容' >
                       string sql = "update B set name=@name,sex=@sex where id=@id";
                        SqlCommand cmd = new SqlCommand(sql, con);
                        cmd.Parameters.Add(new SqlParameter("@id", this.Tag.ToString()));
                        cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));
                        cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));
                        int fh = cmd.ExecuteNonQuery();
                        if (fh > 0) MessageBox.Show("修改成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        this.Close();
                    }
                }
            }

修改人口中的保存按钮代码,跟点击添加按钮弹出的窗体中保留按钮代码一致,逻辑可能一时不便领会,多看四回就熟能生巧了!

ExcuteNonQuery():

执行一个SQL语句,再次来到受影响的行数,这多少个主意重要用以实践对数据库执行扩张、修改、删除操作

 SqlCommand对象的四个情势:

 运行图:

管理 20

修改人口的窗体与点击添加按钮弹出的窗体是同一个窗体,那里只但是是用代码修改了窗体的Text文本而已,DGV表中当选的数据也一头到了改动人口窗体对应的Text文本框中,在那边我们只需要一贯改动那多少个要修改的地点就KO了。

一个简约的主次案例就讲解完了,写这篇博客也不求什么好处,只是希望能带给初学者一个启示意义,也许多年从此学了多门语言的祥和,连最初的C#编程语言结构逻辑思考全都忘光了,还足以在博客上回顾一下,只要你直接在。

 退出按钮的代码:

  Application.Exit();

点击退出后,程序就会被关闭。

sj();方法的代码:

            private void sj()
            {
            SqlConnection con = new SqlConnection(conStr);//创建连接对象指定连接字符串
            string sql = "select*from B";//sql查询语句
            SqlDataAdapter cx = new SqlDataAdapter(sql, con);//连接数据库并执行sql语句
            DataTable ta = new DataTable();//创建表对象
            cx.Fill(ta);//将查询的内容填充到表对象
            dataGridView1.DataSource = ta;//设置DGV表的数据来源
        }

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注