Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。
内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等),使用起来也较 为简单。
Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
主流服务发现中心对比:
此外,关于Consul的架构以及相关的角色,如下图所示:
从图中,我们可以看到有两个数据中心。Consul拥有对多个数据中心的一流支持,这是比较常见的情况。
在每个数据中心中,我们都有客户机和服务器。预计将有三到五台服务器。这在故障情况下的可用性和性能之间取得了平衡,因为随着添加更多的机器,一致性会逐渐变慢。但是,客户端的数量没有限制,可以很容易地扩展到数千或数万。
在Consul方案中,每个提供服务的节点上都要部署和运行Consul的Client Agent,所有运行Consul Agent节点的集合构成Consul Cluster。Consul Agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关。以Server模式运行的Consul Agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server Mode的Agent,Client节点不限。
Consul支持多数据中心,每个数据中心的Consul Cluster都会在运行于Server模式下的Agent节点中选出一个Leader节点,这个选举过程通过Consul实现的raft协议保证,多个 Server节点上的Consul数据信息是强一致的。处于Client Mode的Consul Agent节点比较简单,无状态,仅仅负责将请求转发给Server Agent节点。
Consul 实现多个数据中心都依赖于gossip protocol协议。这样做有几个目的:首先,不需要使用服务器的地址来配置客户端;服务发现是自动完成的。其次,健康检查故障的工作不是放在服务器上,而是分布式的。这使得故障检测比单纯的心跳模式更具可伸缩性。为节点提供故障检测;如果无法访问代理,则节点可能经历了故障。
每个数据中心中的服务器都是一个筏对等集的一部分。这意味着它们一起工作来选举单个leader,一个被选中的服务器有额外的职责。领导负责处理所有的查询和事务。事务还必须作为协商一致协议的一部分复制到所有对等方。由于这个需求,当非leader服务器接收到RPC请求时,它会将其转发给集群leader。
Consul安装包直接从官网下载 https://www.consul.io/downloads.html 即可,根据想要安装的平台进行选择。
这里我下载的linux平台下的1.10.3版本,鼠标移动到对于的版本上,可以看到压缩包地址,右键复制连接。
wget https://releases.hashicorp.com/consul/1.7.2/consul_1.10.3_linux_amd64.zip
官网也提供了快捷安装方式,如不在意安装路径的情况下,可按照这种方式进行安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install consul
下载完成后,使用以下命令对压缩包进行解压
unzip consul_1.10.3_linux_amd64.zip
使用 ls 命令,可以看到加压后的 consul 文件
使用以下命令查看consul是否安装成功,出现以下内容,即安装成功
接下来可以通过修改环境变量使consul命令可以全局使用,也可以不这么做,那样的话consul指令就必须在当前文件夹中才能使用
环境变量修改如下:
(1) 编辑 /etc/profile 文件
vim /etc/profile
(2) 在profile中增加一行CONSUL_HOME并更改PATH,将其追加到后面:
# Consul
export CONSUL_HOME=/usr/local/consul
export PATH=$MAVEN_HOME/bin:$PATH:$CONSUL_HOME;
source /etc/profile
启动
consul 详细参数可以参考 https://www.cnblogs.com/sunsky303/p/9209024.html
启动命令如下,这里我将启动命令写在consul安装目录的start.sh文件中:
consul agent
-server 服务端模式
-bootstrap-expect=3 表示是集群中有3台服务器 bootstrap该模式node可以指定自己作为leader ,如果是非leader可不加该参数
-data-dir=/home/yyl/consul/data 数据资源目录
-node=consul-1 当前服务节点名称
-client=0.0.0.0 同时启动客户端
-bind=192.168.137.200 节点绑定的ip
-datacenter=dc1 当前服务归属的数据中心
-ui 非必须 webui的路径 用web来管理consul
启动后结果如下:
这种方式启动,使用ctrl+c,即可停止,可使用 nohup 指令使服务在后台运行
服务启动后,即可通过url查看管理界面,默认端口是8500
作为生成环境的话,以上方式启动存在服务意外停止之后无法自启的风险,我们可以进一步将consul注册为linux中的服务,设置为开机自启
(1)cd 到 /usr/lib/systemd/system/ 目录下,使用以下命令创建 consul.service文件
cd /usr/lib/systemd/system
vi consul.service
文件内容如下:
[Unit]
Description=consul-service
After=network.target
[Service]
Type=forking
PIDFile=/run/consul-service.pid
ExecStart=/home/yyl/consul/start.sh
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
[Install]
WantedBy=multi-user.target graphical.target
其中 ExecStart 指向consul安装路径下的启动脚本
需要注意的是,这里需要修改以下start.sh中的内容,如下:
#!/bin/bash
/home/yyl/consul/consul agent -server -ui -bootstrap-expect=1 -data-dir=/home/yyl/consul/data -node=consul-1 -client=0.0.0.0 -bind=192.168.137.200 -datacenter=dc1 -log-file=/home/yyl/consul/log/consul_log-$(date +%Y-%m-%d--%H-%M)
(2)consul 启动相关指令
刷新服务配置
systemctl daemon-reload
consul 启动
systemctl start consul
consul 停止
systemctl stop consul
设置开机自启
systemctl enable consul.service
生产环境中推荐搭建集群,集群搭建只需要在不同机器中重复上面的流程,分别安装consul即可,唯一的区别在于启动consul时,需要增加一个参数,让后面搭建的consul节点加入到集群中,这里由于没有太多的机器就不演示整个过程
启动脚本如下:
consul agent
-server
-ui -bootstrap-expect=3
-data-dir=/home/yyl/consul/data
-node=consul-2
-client=0.0.0.0
-bind=192.168.137.201
-join=192.168.137.200
-datacenter=dc1
-log-file=/home/yyl/consul/log/consul_log-$(date +%Y-%m-%d--%H-%M)
基于docker容器的安装部署相对简单,只需要注意启动脚本即可
拉取镜像
docker pull consul:1.10.3
可以通过镜像tag制定版本,如未制定版本则默认下载最新版本
启动容器
通过docker run启动容器,创建consul实例
docker run
-d // 后台运行
-p 8510:8500 //制定容器映射端口
--restart=always // 因为意外原因关闭之后自启
-v /home/yyl/consul/docker/data/server1:/consul/data // 将容器内部的文件夹映射到外部机器中
-v /home/yyl/consul/docker/conf/server1:/consul/config // 将容器内部的文件夹映射到外部机器中
-e CONSUL_BIND_INTERFACE='eth0' // 设置环境变量,相当于-bind参数,这里设置绑定docker容器eth0网卡
--privileged=true // 赋予容器中的root用户真正的root权限
--name=consul_server_1 // 容器名称
consul:1.4.4 //容器使用的镜像
agent
-server
-bootstrap-expect=3
-ui
-node=consul_server_1
-client='0.0.0.0'
-data-dir /consul/data
-config-dir /consul/config
-datacenter=dc1
(3) 创建集群
为了让新实例加入集群,首先需要获取原有实例的ip地址
JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' consul_server_1)";
然后启动新实例
docker run
-d
-p 8520:8500
--restart=always
-v /home/yyl/consul/docker/data/server2:/consul/data
-v /home/yyl/consul/docker/conf/server2:/consul/config
-e CONSUL_BIND_INTERFACE='eth0'
--privileged=true
--name=consul_server_2
consul:1.4.4
agent
-server
-ui
-node=consul_server_2
-client='0.0.0.0'
-datacenter=xdp_dc
-data-dir /consul/data -config
-dir /consul/config
-join=$JOIN_IP; // 让后创建的实例加入集群,只需要join原有的任意一个实例的ip即可
如图,可以看到consul集群已经搭建起来了,3个consul server实例都在集群中
当一个consul server实例挂掉之后,可以看到剩余的consul server实例中会重新选出leader,整个集群还是可用的。
从官网下载 https://www.consul.io/downloads.html 下载安装包,下载完成后解压到对应的文件夹
在解压目录下,执行以下命令启动:
./consul.exe agent
-server
-ui
-bootstrap-expect=1
-data-dir=E:\BaiduNetdiskDownload\consul_1.11.4_windows_386\data
-node=consul-1
-client 0.0.0.0
-bind 127.0.0.1
-datacenter=dc1
为了方便启动,可以像linux环境下,增加一个简单的start.bat文件,如下:
consul.exe agent -server -ui -bootstrap-expect=1 -data-dir=E:\BaiduNetdiskDownload\consul_1.11.4_windows_386\data -node=consul-1 -client 0.0.0.0 -bind 127.0.0.1 -datacenter=dc1
pause
生产环境中,请将-bind参数的ip地址替换为正式ip地址。
这种方式启动下,需要维持命令行窗口,一旦窗口关闭,服务停止,正式环境下可以注册为windows服务。
参考文献:
5分钟让你看懂Consul特性及搭建
.NET Core微服务之基于Consul实现服务治理
微服务系列文章:
上一篇:服务发现—Asp.net core结合nacos实现服务发现
下一篇:服务发现—Asp.net core 结合consul实现服务发现