(五):C++分布式实时应用框架——微服务架构的多变

C++分布式实时应用框架——微服务架构的变异

 技术交流合作QQ群:436466587 欢迎讨论交流

上一篇:(四):C++分布式实时应用框架——状态为主模块

 

版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等作为保留法律追究的权!

 

  OCS(online charging
system,在线计费系统)在开展云化改造的历程被,从实用主义角度出发,微服务架构并无是咱们的对象。虽然咱啊对系进行了容器化改造(Docker),并冲工作经过的职能以系统分为了几许近乎的器皿,但迅即通多是由对网被的少数处理节点开展动态扩缩容的急需,跟微服务半点关系远非。随着系统改造
的深深,系统的通讯关系复杂程度开始越我们事先的估计。如果说多少很多之机能节点还有人好勉强掌握,这些节点内错综复杂的报导关系并线已经超过程序员可以驾驶的范畴。在讨论哪边简化程序员实现任何体系各项节点的报导关系的布局过程中,节点微服务化的见识日益进入我们的脑际中……

  下面先被大家介绍下我们所面临的泥沼,下面的图是我们系有节点的简报关系总图(注意,只是内一些):

 

  还记得第二篇《基于ZeroMQ的实时报道平台》中很我们引以为傲的报导配置文件也,就是程序中负有的简报连接关系不再是形容死于代码中,而是通过AppInit.json配置文件进行布局,程序启动的时更由CDRAF进行实时加载。当初酷炫的功用,现在倒是成我们的噩梦。此时AppInit.json这个文件都抵达1700多推行,你未曾看错,一个配置文件1700基本上执行,并且还免是全方位,还会持续变充分。

 

"OLC" : {
      "AUTO_START" : "YES",
      "ENDPOINTS" : [
         {  // 用于与SmartMonitor建立心跳
            "name" : "MonitorSUB",   
            "zmq_socket_action" : "CONNECT",  // ZMQ的连接模式
            "zmq_socket_type" : "ZMQ_SUB"     // ZMQ的通讯模式
         },
         { // 下发消息给OCDis,这边存在转发功能,支持业务实现按条件转发
            "downstream" : [ "OCDis2OLC"],
            "name" : "NE2OLC",                // 根据这个名字在业务代码中实现转发
            "zmq_socket_action" : "BIND",
            "zmq_socket_type" : "ZMQ_STREAM" 
         },
         { // OLC到OCDis的链路
            "name" : "OCDis2OLC",
            "statistics_on" : true,
            "zmq_socket_action" : "CONNECT",
            "zmq_socket_type" : "ZMQ_DEALER"
         },
         { // OCDis回OLC的链路,之所以来去分开,主要用于实现优雅启停功能(启停节点保证不丢消息)
            "name" : "OCDis2OLC_Backway",
            "statistics_on" : true,
            "zmq_socket_action" : "CONNECT",
            "zmq_socket_type" : "ZMQ_DEALER",
            "backway_pair" : "OCDis2OLC"
         },
         {  // 用于与SmartMonitor的命令消息链路
            "name" : "OLC2Monitor",
            "zmq_socket_action" : "CONNECT",
            "zmq_socket_type" : "ZMQ_DEALER"
         },
      ],
      "ENDPOINT_TO_MONITOR" : "OLC2Monitor",
      "INSTANCE_GROUP" : [
         {
            "instance_endpoints_address" : [
               {
                  "endpoint_name" : "NE2OLC",
                  "zmq_socket_address" : "tcp://*:6701"
               },
               {
                  "endpoint_name" : "OCDis2OLC",
                  "zmq_socket_address" : [
                     "tcp://127.0.0.1:7201"   // 跨机的IP地址与端口,配合状态中心可实现自动管理,无需人工参与配置
                  ]
               },
               {
                  "endpoint_name" : "OCDis2OLC_Backway",
                  "zmq_socket_address" : [
                     "tcp://127.0.0.1:7202"
                  ]
               },
               {
                  "endpoint_name" : "OLC2Monitor",
                  "zmq_socket_address" : "ipc://Monitor2Business_IPC"
               },
               {
                  "endpoint_name" : "MonitorSUB",
                  "zmq_socket_address" : "ipc://MonitorPUB"
               }
            ],
            "instance_group_name" : "1"
         }
      ]
   },

 

  一个事务程序员如果要调动系统面临有程序的通讯连接,一定得目不转睛在地方那副图研究半龙,并且使打出明白“CONNECT”、“BIND”、”ZMQ_ROUTER”、“ZMQ_DEALER”等等这些zeromq专业词汇的含义,才可能展开准确配置,我们隐隐觉得这既是一个mission
impossible。如何简化这布局文件,如何对系统的复杂度进行分层,让不同层级的人口就只是待关注自我层级情况,再经过我们的CDRAF最终将这些散落的配备、代码组成一个就而运行的系统才是我们本用解决的题目。相信这也是每个系统架构师所面临的题目,当一个体系的复杂度超过单个人而承受能力范围,就假设针对性这系统开展适宜分层,分模块。让每个人失去管理均等稍一些复杂点,并且大家只需要兑现好团结之模块,无需去关注别的模块的落实细节。通过先行计划好之接口,各个模块可相互协作,整体系统是得依此完美地运转的。这里CDARF正是从这么一个不一模块的桥(接口)的意向。

10分钟DIY耳环_土豆_强清视频在线观看

  一、节点内通讯模式之集合

  原来节点内的应用程序都是通讯全能应用程序,所谓全能是赖应用程序既可同节点内的经过展开报道为得以跟节点外的轻易进程展开报道。这样初看起没啥问题,但只要节点数和经过数易多后,通讯关系将是一个指数级增长的进程。如下图,如果还多一个CDR节点,或者OCS节点,连接数都用增非常多。

  

  我们的解决办法是统一节点的通讯模式,每个节点内还生一个Dis进程,统一对外承担与另外节点开展报道。在接到外部发给节点的信继,根据效益与负载转发让其中工作处理进程。业务经过而生消息需要发于别的节点,就直接发放Dis进程,由她进行转发。统一通讯模式带来的利除了当节点和经过增多后,通讯关系不会见换得极度复杂以外。由于模式统一,
CDARF可以替业务程序员完成很多工作,直接的补益虽是事情程序员不再需要配置很多同工作无关的布置。最大化的用通讯模块的复杂度留给CDRAF去处理,业务程序员将越注意让己的工作逻辑。下面的觊觎中实际系统开始已经闹微服务的师,但我们希望就的不单是起系统架构上是微服务架构,在程序员开发顺序的时候,也当是牵动在微服务思维的,我们的CDRAF应该提供这么一栽能力来支撑这种支付模式。

  

 

步骤材料:

  二、配置文件之简化

  通讯模式统一后,我们对报道配置文件进行了一致次等比充分的简化,从原来1700实践减少及了200履左右。这中省去了众冗余的配备起,通讯配置文件不再是针对系统通讯简单直接的相应,而重多的是本着节点通讯能力的平种表述。

  应用程序分为Dis和非Dis两类,Dis类程序要负责节点内的报道和节点内之音讯转发,非Dis类程序即使是平常的工作处理进程。从下面的文件中得看来“OCDis”进程面临分成“InterContainerEndpoints”和“InnerContainerEndpoints”两十分类,分别表示节点内的通讯与节点内的简报。对于节点内的报导,每个服务端口只要写及相应的“服务名字”就足以以了,配置中之“OCDisCDRDis”表示OCSDis与CDRDis的通讯,“OLCDisOLCProxy”、“OCDis_SyDis_SNR”也是看似。当事情侧程序需要对外提供一个服务(或者说跟外部进行报道),只待写一个劳动名字,而一旦:端口、机器的IP地址、服务端还是客户端、通讯模式等等都统统无待去关爱,这是差不多老一种植便利。配置中的注解部分是勿待工作程序员去填的,而是由CDRAF的状态为主,根据集群节点的实时状况自动生成,并拓展连接和维护。

  

{
  "OCDis": {
    "MaxInstanceGroupNum": 3,
    "InterContainerEndpoints": 
    {
      "OCDisCDRDis": 
      {
        //"Port": [6001, 6002, 6003],
        //"Cluster": ["10.45.4.10:6001", "10.45.4.10:6001"]
      },

      "OCDisOLCProxy": 
      {
        //"Port": [6101, 6102, 6103],
        "DownStreams": ["OCDis2IN", "OCDis2PS", "OCDis2SMS", "OCDis2ISMP", "OCDis2IMS"],
        "router": true
      },
      "OCDis_SyDis_SNR": 
      { 
          //"Peer": "ZSmartSyDis.OCDis_SyDis_SNR" 
      }
    },

    "InnerContainerEndpoints": 
    {
      "OCPro_OCDis_CDR": { "DownStreams": ["OCDisCDRDis"] },
      "OCPro_OCDis_SNR": { "DownStreams": ["OCDis_SyDis_SNR"] },
    }
  },

  "OCPro": {
    "Groups": ["IN", "PS", "SMS", "IMS", "ISMP"],
    "InnerContainerEndpoints": {
      "OCPro2OCDis": {
        "PeerMap": [
          "OCDis.OCDis2IN",
          "OCDis.OCDis2PS",
          "OCDis.OCDis2SMS",
          "OCDis.OCDis2ISMP",
          "OCDis.OCDis2IMS"
        ]
      },
      "OCPro_OCDis_SNR": {"Peer": "OCDis.OCPro_OCDis_SNR"},
      "OCPro_OCDis_CDR": {"Peer": "OCDis"}
    }
  },

  "CDRDis": {
    "InterContainerEndpoints": 
    {
      "OCDisCDRDis" : 
      {
        "DownStreams": ["CDRDisCDR"],
        //"Peer": "OCDis"
      }
    }
  },

  "CDR": {
    "InnerContainerEndpoints": 
    {
      "CDRDisCDR" : {"Peer": "CDRDis"}
    }
  }
}

  想像一下,对于各级一个工作节点,开发人员仅得考虑节点内之事情实现逻辑,并也以节点对外所提供的服务自个名,而不再需要关怀这个服务到底是供于何人,更不要顾虑谁会来并自己的进程,怎么连。这是多精细的工作!我们不仅是自架构上成功了微服务架构,程序员在付出业务程序的时刻,不待去关爱除了我模块以外的别样复杂信息,从此可以轻装上阵,而不再用背前实施。这该就是是CDRAF对微服务架构提供的顶直白、最好的支持了,帮助工作程序员从人情的开支模式转变,进而适应微服务的思想方法。

 

  三、节点内的报导关系安排

  上面我们干配置文件就定义了节点的劳务名,那么这样多之微服务节点是哪些做起来工作之?一个政工使用系统会由于许多之微服务一起一起提供劳务,这些劳务对每个不同之现场或作用是免雷同的,或者说微服务集聚是匪一样的。那么,对这些微服务的咬合的进程尽管比如一个“编排”的历程。通过“编排”,选择适用的微服务进行铺垫组合提供劳动,而编写的进程即是咱们报道建立之历程。下面我们不怕来拘禁一下CDRAF是何许做到“编排”功能的。

  

  上面的首先摆表,描述了具有的微服务列表,所有节点服务如往外通讯都必到立刻张表中多对应的劳动名,这里的服务名是和前配置文件中之劳动名相对应之。第二张表描述了这些微服务叫以内的报道关系,比如第二修记下表达的是OCDis程序的OCDis2CDRDis到CDRDis的OCDis2CDRDis之间会出一个通讯关系。只要经过者大概的布局,就可以就两个节点内的报道关系的建立。这样的宏图会带几独好处。

  1、对于一个错综复杂的体系,可能来几十像样微服务节点,运行实例可能出成百上千只,如果产生面的表二,就得容器的自者的数额遭到描绘出成套集群的实时拓扑图,这个对系的监察是挺重中之重之。

  2、集群通讯关系之统筹上升了一个路,业务程序员只待根据模块接口设计提供相应的微服务节点,而非需要关爱和其他微服务是安协调工作的。而这些微服务如何“编排”提升及了绑架构师的工作范围之层级。这肯定是对复杂度进行分层隔离很好的一个范例。

  3、运维或者管理人员,通过表二的布好很易地操作集群里的某部微服务下线或者上线。在一个翻天覆地之集群内,如果某类微服务出故障,而CDARF提供了如此一栽手段可以错过给这仿佛故障微服务下线,将受系统的稳定性带来大的可靠保证。

  4.、原来集群拥有的报导都安排于一个文书被,在分布式系统中就是提到文件的全局一致性的题目。解决之方案或是,如果如达丝一个初品类的配置文件(新增节点、删除节点、通讯关系转移等等),就要去创新具有以网节点的部署文件。但此刻若新的布置文件发出bug,那么可能引致整集群的故障,并且为提升有意义去提升总体集群拥有节点的部署也是最不客观的。在初的方案被,节点的配置单定义节点葡京在线开户内之简报及对外提供的微服务名。那么要一旦新增某种类型的微服务,不再用去创新任何节点的配置,只待将新节点上线,然后以方的表一新增微服务名,表二搭连接关系虽可了。真正完成了增量升级!

 

  未完待续……

 

工具材料

1、剪2段一样长之银链

2、将称圈穿过银链和耳堵,并濒临

4、用圆头钳把T字针弯成一个缠,穿上霜链子,并濒临

5.一模一样的艺术通过上其他五只彩贝,分别通过在银链不同之环上。(银链是6单围绕,穿上5只彩贝,离耳堵最近的环不穿为了便利佩戴)

6、同样的章程做好其他一样一味

完成图: