Consul agent提供了完整的RPC机制——用于agent编程。RPC机制同CLI一样,但是可以被其他应用直接使用Consul的功能而不用嵌入。
注意:RPC并不支持所有的HTTP API。
(httpapi参考资料http://blog.csdn.net/younger_china/article/details/52269969)
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也是不同的。所有的响应也需要返回一个状态码。
主要命令:
举例说明:
handshake用于初始化RPC连接,通知Server端client使用的版本。因此,handshake必须是第一个发送命令。
Request header必须有如下的Handshake body:
{
"Version":1
}
Body中指定了IPC版本,但是,为了保证后向兼容性,目前只支持版本1。
这里没有特殊的response body,但是客户端需要等待response并检查error。
force-leave的作用是从集群中移除故障节点。Body如下:
{
"Node":"failed-node-name"
}
response body是通用的。
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表示操作成功的节点数。
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,
},
...
]
}
members-wan命令用于返回WAN成员信息列表。只有Server模式的Agent才能响应该命令。
无request body,response与members-lan相似。
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命令。
stop命令用来停止一个monitor实例。Request类似如下:
{
"Stop":50
}
将终止与Seq等于50的monitor。Response并无特殊。
leave命令触发节点以graceful方式离开或关闭agent。没有request body和response body。
stats命令提供debug信息,没有requestbody,response body类似如下:
{
"agent":{
"check_monitors":0,
...
},
"consul:{
"server":"true",
...
},
...
}
reload命令用来重新配置信息,没有request body和response body。