Docker跨主机网络——overlay

3、Winform界面层对业务的调用 

由于Winform界面层,直接调用BLL层的相应接口,进行多少的操作的,因此我们啊得以界面层创建相应的工作对象,然后于界面层操作工作。

界面层调用事务处理,操作代码如下所示。

            using (DbTransaction trans = BLLFactory<Function>.Instance.CreateTransaction())
            {
                try
                {
                    if (trans != null)
                    {
                        bool sucess = BLLFactory<Function>.Instance.Insert(mainInfo, trans);
                        if (sucess)
                        {
                            FunctionInfo subInfo = null;
                            int sortCodeIndex = 1;

                            #region 子功能操作
                            if (chkAdd.Checked)
                            {
                                subInfo = CreateSubFunction(mainInfo);
                                subInfo.SortCode = (sortCodeIndex++).ToString("D2");
                                subInfo.ControlID = string.Format("{0}/Add", mainInfo.ControlID);
                                subInfo.Name = string.Format("添加{0}", mainInfo.Name);

                                BLLFactory<Function>.Instance.Insert(subInfo, trans);
                            }
                            if (chkDelete.Checked)
                            {
                                subInfo = CreateSubFunction(mainInfo);
                                subInfo.SortCode = (sortCodeIndex++).ToString("D2");
                                subInfo.ControlID = string.Format("{0}/Delete", mainInfo.ControlID);
                                subInfo.Name = string.Format("删除{0}", mainInfo.Name);
                                BLLFactory<Function>.Instance.Insert(subInfo, trans);
                            }
                            ......................//其他事务操作
                            #endregion

                            trans.Commit();
                            ProcessDataSaved(this.btnSave, new EventArgs());

                            //this.DialogResult = System.Windows.Forms.DialogResult.OK;
                            MessageDxUtil.ShowTips("保存成功");
                        }
                        else
                        {
                            MessageDxUtil.ShowTips("保存失败");
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (trans != null)
                    {
                        trans.Rollback();
                    }

                    LogTextHelper.Error(ex);
                    MessageDxUtil.ShowError(ex.Message);
                }
            }

以上就是是我对不同分支中应用工作对象开展各种操作的拍卖,由于业务对象会对表进行某种锁定操作,因此数据库的完好性能可能装有回落,但是以确保某种组合操作的原子性,以及批量数据库操作就有限栽办法,该出手时还是使出手,这样能重好增长完整性和处理的高效性。

 

1.1 Sandbox

Sandbox 是容器的网络栈,包含容器的 interface、路由表和 DNS 设置。 Linux
Network Namespace 是 Sandbox 的规范落实。Sandbox 可以涵盖来自不同
Network 的
Endpoint。也就是说Sandbox将一个容器与其余一个器皿通过Namespace进行隔离,一个器皿包含一个sandbox,每一个sandbox可以来多独Endpoint隶属于不同的大网。

1.2 在DAL层自定义函数的工作操作

是因为在IBaseDAL里面都定义了诸多事务性的接口,因此数据访问层的基类里面为就落实了森连锁的基本功操作。

故此数据访问层DAL层里面,如自己定义之兑现函数,调用这些基础函数进行拍卖就得了。自定义函数对事情的操作处理,代码如下所示。

        /// <summary>
        /// 调整客户的组别
        /// </summary>
        /// <param name="customerId">客户ID</param>
        /// <param name="groupIdList">客户分组Id集合</param>
        /// <returns></returns>
        public bool ModifyCustomerGroup(string customerId, List<string> groupIdList)
        {
            bool result = false;
            DbTransaction trans = base.CreateTransaction();
            if (trans != null)
            {
                string sql = string.Format("Delete from T_CRM_CustomerGroup_Customer where Customer_ID='{0}' ", customerId);
                base.SqlExecute(sql, trans);

                foreach (string groupId in groupIdList)
                {
                    sql = string.Format("Insert into T_CRM_CustomerGroup_Customer(Customer_ID,CustomerGroup_ID) values('{0}', '{1}') ", customerId, groupId);
                    base.SqlExecute(sql, trans);
                }

                try
                {
                    trans.Commit();
                    result = true;
                }
                catch
                {
                    trans.Rollback();
                    throw;
                }
            }
            return result;
        }

 

二、Docker overlay 网络

2、业务逻辑层的工作操作

工作逻辑层BLL层是针对数码访问层的再度胜一交汇的包装,它吗应和提供相应的事体对象接口,以方便外部的调用。

其的业务类里面,自定义函数对工作的调用操作如下所示。

        /// <summary>
        /// 把报价单转换为销售订单
        /// </summary>
        /// <param name="quotationNo">报价单编号</param>
        /// <returns></returns>
        public bool ConvertToOrder(string orderNo, int userId)
        {
            bool result = false;

            DbTransaction trans = baseDal.CreateTransaction();
            if (trans != null)
            {
                SellInfo sellInfo = ConvertSellInfo(orderNo, userId, trans);
                List<OrderDetailInfo> detailList = new List<OrderDetailInfo>();
                if (sellInfo != null)
                {
                    detailList = ConvertOrderDetal(sellInfo, orderNo, trans);
                }

                bool success = BLLFactory<Sell>.Instance.Insert(sellInfo, trans);
                if (success)
                {
                    foreach (OrderDetailInfo info in detailList)
                    {
                        BLLFactory<OrderDetail>.Instance.Insert(info, trans);
                    }                    
                }

                try
                {
                    trans.Commit();
                    result = true;
                }
                catch
                {
                    trans.Rollback();
                    throw;//重新抛出异常
                }
            }
            return result;
        }

其它一样例子如下所示。

        /// <summary>
        /// 删除报价单及明细信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool DeleteQuotationRelated(string id)
        {
            bool result = false;
            DbTransaction trans = CreateTransaction();
            if (trans != null)
            {
                QuotationInfo info = baseDal.FindByID(id, trans);
                if (info != null)
                {
                    List<QuotationDetailInfo> detailList = BLLFactory<QuotationDetail>.Instance.FindByOrderNo(info.HandNo, trans);
                    foreach (QuotationDetailInfo detailInfo in detailList)
                    {
                        BLLFactory<QuotationDetail>.Instance.Delete(detailInfo.ID, trans);
                    }

                    //最后删除主表订单数据
                    baseDal.Delete(id, trans);

                    try
                    {
                        trans.Commit();
                        result = true;
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        LogTextHelper.Error(ex);
                        throw;
                    }
                }
            }
            return result;
        }
    }

 

2.3 overlay 网络原理

再创了一个overlay网络之后,通过docker network ls好望网中不但多矣一个我们创建的
ov_net2 (类型也overlay、scope为global),还能够看一个称吧
docker_gwbridge (类型为bridge、scope为local)。这实在就算是 overlay
网络的劳作规律所在。

经过brctl
show可以视,每创建一个网项目为overlay的容器,则docker_gwbridge下都见面挂载一个vethxxx,这说明确实overlay容器是经过之网桥进行对外连接的。

简短的游说 overlay 网络数据还是于 bridge
网络docker_gwbridge出来的,但是由consul的意(记录了overlay网络的endpoint、sandbox、network等消息),使得docker知道了这个网是
overlay
类型的,这样这个overlay网络下的差主机里便可知互为看,但其实说或在docker_gwbridge网桥。

鉴于自家介绍的有关框架,主要是运用了微软的Enterprise
Library的数据库访问模块,因此其会好好抽象各种数据库的工作,以适应各种不同数据库的事务处理。使用微软的Enterprise
Library模块,可以挺好支持SQLSever、Oracle、Mysql、Access、SQLite等数据库。

前言

在Docker网络——单host网络相同温软被,我哉大家总结了Docker的单机网络有关文化以及操作,单机网络比较便于。本文自吗大家总结Docker跨主机通信相关文化。同样本文大部分情节为CloudMan的系课程为底蕴。

每当过剩状态下,事务是个老有因此底东西,可以把同层层之操作组合成一个原子粒度的操作,一旦组合被有地方串,可以全方位干净之拓滚回,不见面留印迹数据;除此之外,事务还能加强批量操作的效率,如在地头SQLite数据库里,批量安插1万修数据,那么用工作和尚未动工作,速度高达至少别几十及博倍的歧异。既然事情有完整性和速度性的差距,因此,基于上述原因,我们在过剩场面下最为好用工作进行操作。本文主要介绍于支付框架中如何整合工作之操作,并介绍在逐一分支中的事务使用案例。

三、总结

本文简单总结了 overlay
跨主机网络通信的实现原理和以办法。后续会总结其他跨主机通信大网。

1、数据访问层中之业务操作

1.1 数据访问层的事务接口定义

由下工作操作,因此当底层的模块里面,也就算是这里的数量访问层,一般需一个作业对象的参数。如下代码是一个数目访问层的接口定义。

    /// <summary>
    /// 数据访问层的接口
    /// </summary>
    public interface IBaseDAL<T> where T : BaseEntity
    {
        /// <summary>
        /// 插入指定对象到数据库中
        /// </summary>
        /// <param name="obj">指定的对象</param>
        /// <param name="trans">事务对象</param>
        /// <returns>执行成功返回True</returns>
        bool Insert(T obj, DbTransaction trans = null);

        /// <summary>
        /// 根据指定对象的ID,从数据库中删除指定对象
        /// </summary>
        /// <param name="key">指定对象的ID</param>
        /// <param name="trans">事务对象</param>
        /// <returns>执行成功返回<c>true</c>,否则为<c>false</c>。</returns>
        bool Delete(object key, DbTransaction trans = null);

        /// <summary>
        /// 更新对象属性到数据库中
        /// </summary>
        /// <param name="obj">指定的对象</param>
        /// <param name="primaryKeyValue">主键的值</param>
        /// <param name="trans">事务对象</param>
        /// <returns>执行成功返回<c>true</c>,否则为<c>false</c>。</returns>
        bool Update(T obj, object primaryKeyValue, DbTransaction trans = null);

        /// <summary>
        /// 查询数据库,检查是否存在指定ID的对象
        /// </summary>
        /// <param name="key">对象的ID值</param>
        /// <param name="trans">事务对象</param>
        /// <returns>存在则返回指定的对象,否则返回Null</returns>
        T FindByID(object key, DbTransaction trans = null);

        .....................//其他操作

    }

由地方的代码上,我们得以视,里面的增删改查等操作,最后都带一个trans的业务对象参数,这个参数默认为null,也即是可选参数的做法,这个方法就是提供了少数只重载的方供我们利用。

看来此间,可能略人提出疑义,为什么找方法吗传播事务对象,这个为业务是一个排斥性操作,一旦启动了事情,可能这个发明的任何操作会被锁定,但每当这个事情内操作确实可允许的,如果您以SQLite这种单机版的数据库,在一个地方使用事务操作一个表,在作业中就不行使工作进行说明底另外操作将未会见受允许,数据库提示出错信息的。

据悉此由,所有表操作的接口,都应该提供事务性的操作接口,也不怕是供一个事务性的对象参数。在接口的实现中,判断事务对象是否也空,然后进行相应的拍卖即可。

1.2 Endpoint

Endpoint 的作用是用 Sandbox 接抱 Network。Endpoint 的卓越实现是 veth
pair。一个 Endpoint 只能属于一个大网,也不得不属于一个 Sandbox。

1.3 Network

Network 包含一组 Endpoint,同一 Network 的 Endpoint
可以直接通信。Network 的落实可是 Linux Bridge、VLAN 等。

图片 1

图截至CLOUDMAN博客。

libnetwork下涵上述原生的driver以及另第三正在driver。

none、bridge网络前面都介绍。bridge就是网桥,虚拟交换机,通过veth连接该与sandbox。

2.2 创建 overlay 网络

创办 overlay 网络以及前面创建 bridge
网络基本相同,唯一不同之是用-d参数设置为overlay。如下:

docker network create -d overlay ov_net2

docker network create -d overlay ov_net3 --subnet 172.19.0.0/24 --gateway 172.19.0.1

单独待在一个节点受到开展上述创建进程,其他节点自动会识别到该网,原因正是在consul的服务意识效果。

尔后创立容器的时刻才待指定–network参数为ov_net2即可。

docker run --network ov_net2 busybox

这么虽以不同之主机及使用同一 overlay
网络创建的器皿,相互之间也能一直看。

2.1 启动 key-value 数据库 Consul

Docerk overlay 网络要一个 key-value 数据库用于保存网络状态信息,包括
Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的
key-vlaue 软件。

consul是千篇一律种植key-value数据库,可以为此其存储系统的状态信息等,当然这里我们并不需要写代码,只需要安装consul,之后docker会自动进行状态存储等。最简便易行的安装consul数据库的章程是直接运用
docker 运行 consul 容器。

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

起先后可透过 host ip的8500端口查看consul服务。

为让 consul 发现各个 docker
主机节点,需要以逐一节点上开展配备。修改各个节点 docker daemon
的配置文件/etc/systemd/system/docker.service。在 ExecStart 最后加加

--cluster-store=consul://<consul_ip>:8500 --cluster-advertise=ens3:2376

中间 表示运行 consul
容器的节点IP。ens3吗当前节点的ip地址对应之网卡,也得直接填ip地址。

上述是单机版 consul
的装置方式,建议以集群模式,集群模式安装方式表现https://www.consul.io/intro/getting-started/join.html。

一样、Docker 跨主机通信

Docker跨主机网络方案包括:

  1. docker 原生的 overlay 和 macvlan。
  2. 老三着方案:常用的席卷 flannel、weave 和 calico。

docker 通过 libnetwork 以及 CNM 将上述各种方案与docker集成于一块。

libnetwork 是 docker 容器网络库,最核心的内容是那定义之 Container
Network Model (CNM),这个模型对容器网络进行了纸上谈兵,由以下三类似组件组成:

发表评论

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