【Consul】Consul实践指导-RPC机制

x33g5p2x  于2021-12-20 转载在 其他  
字(2.9k)|赞(0)|评价(0)|浏览(332)

      Consul agent提供了完整的RPC机制——用于agent编程。RPC机制同CLI一样,但是可以被其他应用直接使用Consul的功能而不用嵌入。

注意:RPC并不支持所有的HTTP API。

(httpapi参考资料http://blog.csdn.net/younger_china/article/details/52269969) 

1.1.1 实现细节

      RPC协议是基于TCP和MsgPack(后续介绍)实现的。之所这么做,原因在于——所有操作系统都支持TCP协议,并且MsgPack提供了跨语言的快速序列化格式。

      所有的RPC request都要request header,当然,一些RPC请求也有request body。requestheader类似如下:

{
  "Command":"Handshake",
  "Seq":0
}

      所有的响应都有response header,一些响应也要response body。response header类似如下:

{
  "Seq":0,
  "Error":""
}

      在request中,Command参数用于指定server执行的命令;Seq用来跟踪request。Response用于与request相同的seq来标记。这就使用server端支持并发请求而非FIFO请求。因此,在使用过程中,就需要保证不同Command的Seq也是不同的。所有的响应也需要返回一个状态码。

      主要命令:

  1. handshake – 初始化连接或者设置版本
  2. force-leave – 从集群中移除故障节点
  3. join – 请求加入其它节点
  4. members-lan – 返回LAN成员列表
  5. members-wan – 返回WAN成员列表
  6. monitor – 日志打打印到屏幕
  7. stop – 停止日志打印
  8. leave – consul agent以graceful方式离开集群或关闭agent。
  9. stats – 提供各种debug信息
  10. reload – 重新加载配置

举例说明:

1.1.2 handshake

      handshake用于初始化RPC连接,通知Server端client使用的版本。因此,handshake必须是第一个发送命令。

      Request header必须有如下的Handshake body:

{
  "Version":1
}

      Body中指定了IPC版本,但是,为了保证后向兼容性,目前只支持版本1。

      这里没有特殊的response body,但是客户端需要等待response并检查error。

1.1.3 force-leave

      force-leave的作用是从集群中移除故障节点。Body如下:

{
  "Node":"failed-node-name"
}

      response body是通用的。

1.1.4 join

      join命令的作用是“加入到已存在的集群中”。Body如下:

{
  "Existing":[
    "192.168.0.1:6000",
    "192.168.0.2:6000"
  ],
  "WAN":false
}

      其中,Existing 节点必须是网络正常的,wan标识增加的是wan成员还是lan成员。Lan成员一般都是在同一个数据中心,并且访问延迟比较低。WAN成员一般都是在不同的数据中心,且延迟比较高。

注:只有Server模式的agent才能使用WAN。

      Response包含header和body,body类似如下:

{
  "Num":2
}

      Num表示操作成功的节点数。

1.1.5 members-lan

      members-lan用来返回LAN成员信息列表。所有的agent都能响应该命令。没有request body,但是response body类似如下:

{
  "Members":[
    {
     "Name":"TestNode"
     "Addr":[127,0,0,1],
     "Port":5000,
     "Tags":{
       "role":"test"
     },
     "Status":"alive",
     "ProtocolMin":0,
     "ProtocolMax":3,
     "ProtocolCur":2,
     "DelegateMin":0,
     "DelegateMax":1,
     "DelegateCur":1,
    },
  ...
  ]
}

1.1.6 members-wan

      members-wan命令用于返回WAN成员信息列表。只有Server模式的Agent才能响应该命令。

      无request body,response与members-lan相似。

1.1.7 monitor

      monitor命令是订阅agent日志信息。

Request如下:

{
  "LogLevel":"DEBUG"
}

      订阅的是该客户端的所有DEBUG信息。

      服务器的响应包含标准response header——表示命令是否执行成功。所有的日志将基于标记Seq发送到请求段。

      假设,前一个monitor命令的Seq是50,开始获取日志如下:

{
  "Seq":50,
  "Error":""
}
 
{
  "Log":"2013/12/03 13:06:53 [INFO]agent: Received event: member-join"
}

      重要的是,这些消息是异步发送的,而不是响应任何命令。如果一个客户端是streaming命令,当客户端等待命令的响应时,可能会有日志流传输。这就是为什么seq标记response和request。

      客户端只能定于一个monitor实例,如果要终止,请使用stop命令。

1.1.8 stop

      stop命令用来停止一个monitor实例。Request类似如下:

{
  "Stop":50
}

      将终止与Seq等于50的monitor。Response并无特殊。

1.1.9 leave

      leave命令触发节点以graceful方式离开或关闭agent。没有request body和response body。

1.1.10  stats

      stats命令提供debug信息,没有requestbody,response body类似如下:

{
  "agent":{
    "check_monitors":0,
    ...
  },
  "consul:{
    "server":"true",
    ...
  },
  ...
}

1.1.11  reload

      reload命令用来重新配置信息,没有request body和response body。

相关文章