目录
- 一、Consul原理与介绍
- 1.介绍
- 2.实现原理
- 2.1serf
- 2.2Raft
- 3.consul agent参数
- 三、Docker搭建集群版的Consul
- 四、springcloud的接入方式
- 1.依赖引入
- 2.配置
- 五、优缺点
- 1.优点
- 2.缺点
一、Consul原理与介绍
1.介绍
consul主要有server和client两种组件组成。
server负责核心数据的存储和处理请求,server可以部署多个实例(通常推荐3-5个),server只有一个实例是leader实例,就是主节点,主节点是自动选举产生的,主节点负责处理数据的写入处理,同时将数据同步至其他server节点。
client负责跟server通信,处理转发服务注册、服务发现请求到server节点,client还负责服务的健康检查,client节点也可以部署多个实例,甚至每个微服务节点都部署一个client实例。
Server节点
- 参与共识仲裁(raft)
- 存储群集状态(日志存储)
- 处理查询
- 维护与周边(LAN/WAN)各节点关系
Agent节点
- 负责通过该节点注册到consul的微服务的健康检查
- 将客户端注册请求以及查询转化为对server的RPC请求
- 维护与周边(LAN/WAN)各节点关系
服务端口
端口 | 作用 |
---|---|
8300 | RPC exchanges |
8301 | LAN GOSSIP |
8302 | WAN GOSSIP |
8400 | RPC exchanges by the CLI |
8500 | Used for HTTP API and web interface |
8600 | Used for DNS server |
纵观consul的实现,其核心在于两点:
- 集群内节点间信息的高效同步机制,其保障了拓扑变动以及控制信号的及时传递;
- server集群内日志存储的强一致性。
它们主要基于以下两个协议来实现:
- 使用gossip协议在集群内传播信息
- 使用raft协议来保障日志的一致性
2.实现原理
2.1serf
Serf是hashicorp开源的去中心化成员管理、失败检测和服务编排工具,具有轻量级、高可用和分区容错的特点。Serf底层采用gossip协议,通过在集群中广播消息,从而实现了集群中节点下线自动感知。Serf 在每个主要平台上运行:Linux、Mac OS X 和 Windows。它非常轻量级:它使用 5 到 10 MB 的常驻内存,并且主要使用不频繁的 UDP 消息进行通信
由于gossip协议实现了最终一致性,所以Serf是一个AP系统。Serf可应用于负载均衡器、Memcached或者Redis集群管理、DNS记录更新等场景。
Serf 使用高效的gossip协议 来解决三个主要问题:
- Membership:Serf 维护集群成员列表,并且能够在成员更改时执行自定义处理程序脚本。例如,Serf 可以维护负载均衡器的 Web 服务器列表,并在节点上线或离线时通知负载均衡器。
- 故障检测和恢复:Serf 在几秒钟内自动检测故障节点,通知集群的其余部分,并执行处理程序脚本允许您处理这些事件。Serf 将通过定期重新连接来尝试恢复故障节点。
- 自定义事件传播:Serf 可以向集群广播自定义事件和查询。这些可用于触发部署、传播配置等。事件只是即发即弃的广播,Serf 在面对离线节点或网络分区时尽最大努力传递消息。查询提供了一个简单的实时请求/响应机制。
2.2Raft
节点状态变更
- 在节点数达到bootstrap-expect的数时,开始启用raft选举
- 在节点数超过bootstrap-expect数时,其他节点为follower
- 在leader被干掉后,raft如果判断到节点数依然大于等于bootstrap-expect时,重新选举
- 逐一干掉节点,当节点数少于bootstrap-expect时,raft协议不再选举,将维持先前的状态。
3.consul agent参数
-advertise 通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
-bootstrap 用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
-bootstrap-expect 在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用
-bind 该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-client consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
-config-file 明确的指定要加载哪个配置文件
-config-dir 配置文件目录,里面所有以.json结尾的文件都会被加载
-data-dir 提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-dc 该标记控制agent允许的datacenter的名称,默认是dc1
-encrypt 指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key
-join 加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。
-retry-join 和join类似,但是允许你在第一次失败后进行尝试。
-retry-interval 两次join之间的时间间隔,默认是30s
-retry-max 尝试重复join的次数,默认是0,也就是无限次尝试
-log-level consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。
-node 节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-protocol consul使用的协议版本
-rejoin 使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-server 定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个
-syslog 开启系统日志功能,只在linux/osx上生效
-ui-dir 提供存放web ui资源的路径,该目录必须是可读的
-pid-file 提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent
三、Docker搭建集群版的Consul
docker-compose.yml内容如下,将搭建三个节点作为服务,一个节点提供界面与客户端对接入口
version: '3'
services:
consul1:
image: consul
container_name: consul_node1
command: agent -server -bootstrap-expect=3 -node=consul_node1 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1
networks:
- mynet
consul2:
image: consul
container_name: consul_node2
command: agent -server -retry-join=consul_node1 -node=consul_node2 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1
depends_on:
- consul1
networks:
- mynet
consul3:
image: consul
container_name: consul_node3
command: agent -server -retry-join=consul_node1 -node=consul_node3 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1
depends_on:
- consul1
networks:
- mynet
consul4:
image: consul
container_name: consul_node4
command: agent -retry-join=consul_node1 -node=consul_node4 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1 -ui
ports:
- 8500:8500
depends_on:
- consul2
- consul3
networks:
- mynet
networks:
mynet:
driver: bridge
运行
docker-compose up -d
四、springcloud的接入方式
1.依赖引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2.配置
spring:
application:
name: springcloud-demo
cloud:
consul:
discovery:
enabled: true
host: 127.0.0.1
port: 8500
五、优缺点
1.优点
- 1.简单易用,不需要集成sdk
- 2.自带健康检查
- 3.支持多数据中心
- 4.提供web管理界面
2.缺点
- 1.不能实时获取服务信息的变化通知