cppcloud_serv说明

  本篇主要解说CppCloud后端核心程序cppcloud_serv的功能和使用,方便用户更清楚了解CppCloud产品,同时应用到具体项目中可以得心应手。 cppcloud_serv功能划分如下,之后分别介绍具体功能细节。
1. 聚合管理客户应用 2. 配置管理 3. 服务治理 4. 命令通知

启动方式

源码安装启动

这里是主要步骤,有点点c/c++经验的都会看得懂。 1. 先编译common,得到libhocomm.so;如果有报错要看下g++版本是否支持c++11。

cd commmon
make
sudo make install 2. 到server目录,编译cppcloud_serv,得到cppcloud_serv。 > cd server
make
sudo make install 3. 运行cppcloud_serv -h,查看帮助参数。 主要这几个参数: -i <servid> # 必须指定个小于100的整数,集群时以区分不同实例
-p <port> listen port # 本服务所监听的端口号,默认4800
-s <peerhosts> ip1:port1-ip2:port2 #多台Serv集群时,这里指定要连接的Serv(也是cppcloud_serv进程)的地址,可以是多个(减号分隔)

docker启动

  1. docker run -p4800:4800 -it valueho/cppcloud:1 -i <servid>
    或者
  2. docker-compose up

聚合管理客户应用

   所有客户应用接入CppCloud都是首先和Serv建立tcp连接,然后通过自定义报文协议实现双向通信,具体参看报文协义定位详细

聚合图 1. 上报身份
每个CppCloud内的实体启动后首先是上报身份。如果是cppcloud_serv有指定-s参数,则通过CMD_IAMSERV_REQ上报给对等的serv; 如果是客户应用则通过CMD_WHOAMI_REQ消息告知服务端自身信息。 2. 多个Serv间同步客户信息 Serv下直连的Cli(客户应用)都会定时告知到其他对等的Serv,所以每个Serv有全量的Cli数据,比较重要的消息CMD_BROADCAST_REQ(广播) 3. 接受web管理 web_py应用可以向Serv发各种消息(譬如CMD_WEBCTRL_REQ),Serv再转发到Cli,从而以及到控制管理某个或多个客户应用的功能。

配置管理

   客户应用无需在本地存储各种配置文件,均交由服务端serv管理;多个Serv间亦会同步相互间的资源,达到每个Serv有全量配置数据,当收到修改(CMD_HOCFGNEW_REQ)请求时,Serv修改内存数据并广播修改给其他Serv。 源代码里的class HocfgMgr是配置处理类,有兴趣的用户可以看看。

亮点

  • 查询灵活
  • 继承和合并
  • 变化通知

服务治理

   CppCloud主要任务应该可以说是给服务提供者和服务消费者搭建相互间沟通联络的平台,打个形象的比如人才市场提供给用人单位和求职者的平台。 代码对应的类是class ProviderMgr(server/provider_manage.h)服务治理图

服务注册

   tcp或http服务要能让其他消费者调用,则必须先向Serv注册。 注册命令字是CMD_SVRREGISTER_REQ,服务可以有以下属性。 - regname 服务名字 - url 调用服务的url地址 - desc 描述 - svrid 所属的应用id - prvdid 服务编号,当同一个应用提供多个服务时以此区分 - protocol 协议编号,tcp=1 udp=2 http=3 https=4 - version 版本号 - weight 服务权重 - idc 机房号 - rack 机架号 - enable 是否启用,0或1

   idc和rack的配置一般在Serv的元配置(_meta.json)里配置,此处注册时就不用带上idc和rack。在元配置里可以根据ip或根据tag指定idc,rack,示例参见下面的设置(#号后的要去掉)。

_meta.json 设置机架机房举例:

{
    "app_profile": {
        "192.168.228.10": # 所在机器的ip地址
        "_idc": 1, # 机房号
        "_rack": 2 # 机架号
    }
}

服务发现

   即是提供服务名,在服务端查询出该名字下的可用服务列表返回,返回的列表越靠前的是权重越大的,应该越多机会被调用,当然了调用的选择还是消费者。
   注意,返回的权重和注册的权重是不一样的,返回的权重结合了idc和rack,从而达到物理位置越近越多机会消费的原则。 所以机房和机架的配置关系到服务权重。

服务调用

   通过服务发现获得可用服务列表后就可以向目标发起请求了;现在的sdk是客户端负载均衡方式调用, springcloud euarka/ribbon也是这种方式。Cppcloud的SDK实现服务调用有如下特点:

  • cli均衡
       sdk获取到的每一项服务里面有个weight属性,代表该服务权重,越大获得调用的概率越高;
  • 定时刷新缓存
      sdk会定时获取新的服务列表,并刷新自身缓存;
  • 断开可用
      当某一服务提供者下线了,服务端会主动推通知;当客户应用与Serv失去连接后,由于sdk有缓存服务列表,所以消费业务还是可以继续进行,等后面重连后再刷新。

命令通知

   当Serv端发生一些关键事件时或者web客户端主动发起事件时,会推送消息给到客户应用Cli,后者对事件进行处理,并回复消息给Serv,如果是用web上触发的,serv会转回给web。
通知命令字:CMD_EVNOTIFY_REQ
具体协议详情参看tcp协议消息定义