基础介绍

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。

安装

centos下安装

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;

在这里插入图片描述
(3)刷新配置

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容器的安装部署相对简单,只需要注意启动脚本即可

  1. 拉取镜像

    docker pull consul:1.10.3
    

    可以通过镜像tag制定版本,如未制定版本则默认下载最新版本

  2. 启动容器
    通过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,整个集群还是可用的。

windows下安装

从官网下载 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实现服务发现

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐