学习自以下文章:
consul 架构
目前consul 架构全部为client-server模式,服务不再自己向server进行注册,而是先向同台机器的consul client 注册,client 再向server进行注册。
server :
分为三种:
- 领导者:就是主从架构的主,负责处理全部请求,生产日志,保证大多数从都同步;
- 跟随者:就是主从架构的从,负责接受主发过来的日志进行同步;
- 竞争者:当领导者挂了,或者从长时间未收到领导者的消息,就会转为竞争者 ,竞争成为领导者,详细过程后续会说。 主要工作:
- 参与raft,保证一致性
- 存储集群机器状态(日志)
- 处理查询(领导者)
- 维护周边(通过lan/wan)节点之间的关系
client 主要的工作:
- 负责进行同台机器向自己注册的微服务的健康检查;
- 将微服务的注册请求和查询请求,请求server,做一次转发
- 维护周边各节点(通过LAN/WAN)的关系
为啥这样设计(使用client-server模式)?
这样设计有以下好处:
- 由于consul的server 数量都是受控的,一般就是3个或者5个,这样在面对大量微服务实例时,肯定需要定时收到或者发送大量的心跳请求,毫无疑问的大量增加server的无意义负载,而使用client-server模式就可以避免这个问题。
- server数量有限,client维护了和各个节点的关系,当一个server挂掉后,会选择还能用的server,避免服务不能调用;
consul 之间的通信协议
- client - server 使用 tcp 8300 端口
- client - client 使用tcp/udp LAN GOSSIP 8301 端口
- server - server 使用 tcp 8300 端口
consul 服务发现原理:
-
- consul集群正常运行,选举一台server节点为leader;
-
- 服务提供者通过consul client 将服务注册到server,服务信息保存在server 各节点,通过raft保证强一致性;
-
- 服务调用者需要访问服务,首先访问本机的client,client 将请求发送给server,server拿到要调用的服务提供者的ip和host,并保存在缓存中,如果缓存有,直接从缓存中拿,缓存是懒加载模式,默认过期时间35s
- 通过负载均衡策略,选择一个ip+host进行调用。