Consul是HashiCorp公司推出的开源工具,consul包含很多组件,但总体来说,consul是用于实现分布式系统的服务发现、服务配置的方案。
consul可以作为注册中心和配置中心,同时consul与其他注册中心一样,提供了一定的存储能力(存放注册者的信息),同时consul可以对集群中的节点进行监控检查实现故障排除。
1、服务发现:consul提供了通过DNS或者http接口的方式来注册服务和发现服务。一些外部的服务通过consul很容易的找到它所依赖的服务。
2、健康检查:consul的client提供健康检查机制,可以用来避免流量被转发到有故障的节点上。
3、KV存储:应用程序可以根据自己的需要使用consul提供key/value存储。consul提供了简单易用的http接口,结合其他工具可以实现动态配置、功能标记、leader选举等。
4、多数据中心:consul提供了多数据中心机制。这样就可以不用再创建多用的虚拟层来应用多个分区。
5、安全服务通信:consul可以为服务生成和分发TLS证书已建立相互TLS连接。Intentions可以用于定义允许通信的服务。可以通过实时更改的instentions来管理服务隔离,而不需复杂的网络拓扑和静态防火墙策略。
6、提供web的UI界面。
总结:consul是分布式的、高可用的一个服务管理工具,使用go语言编写,所以可移植性高,使用raft保证数分布式数据一致性及服务的高可用。consul内置了服务注和发现、分布一致性协议实现(采用raft算法)、健康检查、KV存储、多数据中心方案以及服务之间的安全通信。每个consul服务提供节点,都运行一个consul agent(代理),consul agent并不意味着必须发现其它的服务,或者进行相应的数据操作,代理只需要对健康检查负责。代理连接一个或者多个consul服务端,consul服务端存储,复制数据,选取leader。虽然consul服务端可以单例运行,但是通过建议部署3到5个实例集群运行,以防止数据丢失,同时保证server-leader的选择能够正确的进行。
Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多。从本质上说,Raft算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致。
consul的应用场景包括服务发现、服务隔离、服务配置:

| 服务器类型 | 系统 | IP地址 | 需要安装的组件 |
|---|---|---|---|
| consul服务器 | CentOS7.4(64 位) | 192.168.10.11 | 运行consul服务、nginx服务、consul-template守护进程 |
| registrator服务器 | CentOS7.4(64 位) | 192.168.10.12 | 运行registrator容器、nginx服务 |
systemctl stop firewalld
setenforce 0
cd /opt
rz -E #导入下面的压缩包
consul_0.9.2_linux_amd64.zip
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/local/bin/

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.10.11 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
netstat -napt | grep consul
consul members
consul info | grep leader

| 选项 | 说明 |
|---|---|
| -以server身份启动 | 默认是client。 |
| -bootstrap | 用来控制一个server 是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为server-leader |
| -bootstrap-expect=2 | 集群要求的最少server数量,当低于这个数量,集群即失效。 |
| -ui | 指定开启UI界面,这样可以通过http://localhost:8500/ui 这样的地址访问consul 自带的web UI界面。 |
| -data-dir | 指定数据存储日录。 |
| -bind | 指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。 |
| -client | 指定consul 绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1。 |
| -node | 节点在集群中的名称,在一个集群中必须是唯一的, 默认是该节点的主机名。 |
| -datacenter | 指定数据中心名称,默认是dc1。 |
1)查看member状态和查看集群状态
查看集群server成员 curl 127.0.0.1:8500/v1/status/peers
集群Raf leader curl 127.0.0.1:8500/v1/status/leader
注册的所有服务 curl 127.0.0.1:8500/v1/catalog/services
查看nginx服务信息 curl 127.0.0.1:8500/v1/catalog/nginx
集群节点详细信息 curl 127.0.0.1:8500/v1/catalog/nodes

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.10.11 \
consul://192.168.10.11:8500
| 选项 | 说明 |
|---|---|
| –net=host | 把运行的docker容器设定为host网络模式。 |
| -v /var/run/docker.sock:/tmp/docker.sock | 把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。 |
| –restart=always | 设置在容器退出时总是重启容器。 |
| –ip | 刚才把network指定了host模式,所以我们指定ip为宿主机的ip。 |
| consul | 指定consul服务器的IP和端口。 |

输入x.x.x.x:8500

|
[外链图片转存中…(img-oSrQuKjp-1663501743815)]
输入x.x.x.x:8500
[外链图片转存中…(img-pVkXQz0J-1663501743815)]
