Consul 提供了高可用的kv存储,集群架构,这点和etcd zookeeper相似。 另外也提供了自动服务发现注册的套件,而且可否对服务进行健康检查。 结合consul-template能够实现服务提供方信息更新(好比增长了API服务器)时,自动生成配置文件给服务使用方自动更新配置。java
从图中可看到的是Consul支持跨数据中心,在每一个数据中心有client和server。通常server是3-5个,少了会影响可靠性,多了会影响速度。client则没有数量的限制。node
集群经过goosip协议管理全部node成员和广播集群消息,client须要配置文件就能发现急群众全部的server,节点故障检测被分不到整个集群,不须要server的参与。全部server经过Raft协议进行选主(leader), leader负责处理全部的查询和事务。服务器
server还负责与其余数据中心交互来处理跨数据中心的请求,当server收到这种请求它会将请求转发到相应的数据中心活本地的leader。架构
client和server本质都是consul的agent,只是角色不一样(在启动时指定参数便可)。以前咱们产线环境并无彻底按照官方架构图(即client-server模式)进行部署,而是采用了所有server的模式,以下图:负载均衡
这种架构下带来的问题有两个:post
ConsulClient client = new ConsulClient("负载均衡地址");
client.agentServiceDeregister("当前服务在注册中心的Id");
复制代码
因为负载均衡,注销时定位到的集群节点多是server2,这样就会致使服务的注销失败。解决的办法是遍历集群中的全部节点(members)进行注销,具体可参考:使用Consul时,服务没法正常注销spa
目前consul的总体架构升级为client-server模式,服务注册时再也不向consul-server集群进行注册,而是向服务所在机器的consul-client进行注册,有consul-client将注册信息同步到consul-server集群中,架构以下:code
回顾以上两个问题:cdn
注意:consul-client挂了,服务的注册信息不会转移到另一个consul-client中。因此要求服务自己处于不一样的机器上来保证高可用。server
ConsulClient client = new ConsulClient("local-consul-client-ip");
client.agentServiceDeregister("当前服务在注册中心的Id");
复制代码