上海市大数据股份|这些姿势掌握起来,微服务越来越火=Consul越来越火

这两年微服务越来越火 , 使用Consul的人也越来越多 , 经常有人问一些问题 , 比如:服务注册到节点后 , 其他节点为什么没有同步?Client是干什么的?等等 。 这篇干货分享就谈一下Consul做服务发现的方式 , 答疑解惑一番 。
上海市大数据股份|这些姿势掌握起来,微服务越来越火=Consul越来越火
文章图片
Consul内部原理
下面这张图来源于Consul官网 , 很好的解释了Consul的工作原理 , 先大致看一下 。
上海市大数据股份|这些姿势掌握起来,微服务越来越火=Consul越来越火
文章图片
首先Consul支持多数据中心 , 在上图中有两个DataCenter , 他们通过Internet互联 , 同时请注意为了提高通信效率 , 只有Server节点才加入跨数据中心的通信 。
在单个数据中心中 , Consul分为Client和Server两种节点(所有的节点也被称为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端口完成 。
Consul服务发现原理
上海市大数据股份|这些姿势掌握起来,微服务越来越火=Consul越来越火
文章图片
首先需要有一个正常的Consul集群 , 有Server , 有Leader 。 这里在服务器Server1、Server2、Server3上分别部署了ConsulServer , 假设他们选举了Server2上的ConsulServer节点为Leader 。 这些服务器上最好只部署Consul程序 , 以尽量维护ConsulServer的稳定 。
然后在服务器Server4和Server5上通过ConsulClient分别注册ServiceA、B、C , 这里每个Service分别部署在了两个服务器上 , 这样可以避免Service的单点问题 。 服务注册到Consul可以通过HTTPAPI(8500端口)的方式 , 也可以通过Consul配置文件的方式 。 ConsulClient可以认为是无状态的 , 它将注册信息通过RPC转发到ConsulServer , 服务信息保存在Server的各个节点中 , 并且通过Raft实现了强一致性 。
最后在服务器Server6中ProgramD需要访问ServiceB , 这时候ProgramD首先访问本机ConsulClient提供的HTTPAPI , 本机Client会将请求转发到ConsulServer , ConsulServer查询到ServiceB当前的信息返回 , 最终ProgramD拿到了ServiceB的所有部署的IP和端口 , 然后就可以选择ServiceB的其中一个部署并向其发起请求了 。 如果服务发现采用的是DNS方式 , 则ProgramD中直接使用ServiceB的服务发现域名 , 域名解析请求首先到达本机DNS代理 , 然后转发到本机ConsulClient , 本机Client会将请求转发到ConsulServer , ConsulServer查询到ServiceB当前的信息返回 , 最终ProgramD拿到了ServiceB的某个部署的IP和端口 。
Consul的其它部署架构
如果你实在不想在每个主机部署ConsulClient , 还有一个多路注册的方案可供选择 , 这是交流群中获得的思路 。
上海市大数据股份|这些姿势掌握起来,微服务越来越火=Consul越来越火
文章图片
如图所示 , 在专门的服务器上部署ConsulClient , 然后每个服务都注册到多个Client , 这里为了避免服务单点问题还是每个服务部署多份 , 需要服务发现时 , 程序向一个提供负载均衡的程序发起请求 , 该程序将请求转发到某个ConsulClient 。 这种方案需要注意将Consul的8500端口绑定到私网IP上 , 默认只有127.0.0.1 。


推荐阅读