1 Consul是什么
Consul是基于GO语言开发的开源工具,主要面向分布式、服务化的系统提供服务注册、服务发现和配置管理的功能。
Consul的功能都很实用,其中包括:
- 服务注册/发现
- 健康检查
- Key/Value存储
- 多数据中心
- 分布式一致性保证等。
Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
2 Consul工作原理
引用官网的一张图:
工作原理要点:
-
Consul支持多数据中心。在上图中有两个DataCenter,他们通过网络互连,同时请注意为了提高通信效率,只有Server节点才加入跨数据中心的通信。 -
在单个数据中心中,
Consul分为Server和Client两种节点(所有的节点也被称为Agent)。Server节点保存注册的服务信息数据,Client节点存在于应用服务中,负责服务注册、健康检查、转发数据请求到Server;Server节点有一个Leader和多个Follower,Leader节点会将数据同步到Follower,Server的数量推荐是3个或者5个,在Leader挂掉的时候会启动选举机制产生一个新的Leader。 -
Consul集群内的节点通过gossip协议(流言协议)维护成员关系。也就是说某个节点了解集群内现在还有哪些节点,这些节点是Client还是Server。单个数据中心的流言协议同时使用TCP和UDP通信,并且都使用8301端口。跨数据中心的流言协议也同时使用TCP和UDP通信,端口使用8302。 -
集群内数据的读写请求既可以直接发到
Server,也可以通过Client使用RPC转发到Server,请求最终会到达Leader节点。在允许数据轻微陈旧的情况下,读请求也可以在普通的Server节点完成,集群内数据的读写和复制都是通过TCP的8300端口完成。
3 Consul服务注册/发现的原理
Consul可用于分布式系统中的服务注册/发现。
下图参考:http://blog.didispace.com/consul-service-discovery-exp/
服务注册/发现原理:
- 首先在
Server1、Server2、Server3三个服务器上面分别部署了一个Consul Server,组成一个Consul集群。这个集群中有leader,也有follower,假设他们选举了Server2上的Consul Server节点为Leader。这些服务器上最好只部署Consul程序,以尽量维护Consul Server的稳定。 - 然后在服务器
Server4和Server5上通过Consul Client分别注册Service A、Service B、Service C,这里每个Service分别部署在了两个服务器上,这样可以避免Service的单点问题。服务注册到Consul可以通过HTTP API(8500端口)的方式,也可以通过Consul配置文件的方式。Consul Client可以认为是无状态的,它将注册信息通过RPC转发到Consul Server,注册过的服务信息真实的保存在Consul Server的各个节点中,并且通过Raft算法实现了强一致性。 - 最后在服务器
Server6中有一个Service D服务,需要访问Service B。这时候Service D首先会访问本机Consul Client提供的HTTP API,本机的Consul Client会将请求转发到Consul Server(由集群中的leader来处理请求),Consul Server查询到Service B当前的服务信息并返回,最终Service D拿到了Service B的所有部署的IP和端口,然后就可以从中选择Service B的其中一个部署实例并向其发起请求了。 - 如果服务发现采用的是
DNS方式,则Service D中直接使用Service B的服务发现域名,域名解析请求首先到达本机DNS代理,然后转发到本机Consul Client,本机Consul Client会将请求转发到Consul Server,Consul Server查询到Service B当前的信息返回,最终Service D拿到了Service B的某个部署的IP和端口。