一.Consul介绍
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
二.Consul功能
- 服务发现与注册:Consul 提供了服务发现和注册功能,允许服务在注册中心注册自己,并允许其他服务通过 Consul 查询到已注册的服务。这使得服务之间的通信和协作变得更加容易,同时支持动态添加和删除服务实例。
- 健康检查:Consul 具有健康检查机制,可以定期检查注册的服务实例的健康状态。如果服务实例发生故障或不可用,Consul 将从服务发现中移除该实例,确保客户端不会访问到不健康的服务。
- 分布式键值存储:Consul 提供了一个分布式的键值存储(Key-Value Store),允许开发人员存储和检索配置信息、元数据等。这使得微服务架构中的各个组件能够共享和访问共享数据。
- 多数据中心支持:Consul 支持多数据中心的部署,允许在不同地理位置或云环境中构建跨地域的分布式系统。多数据中心部署可以提高系统的可用性和容错性。
- 安全性:Consul 提供了一些安全功能,包括基于ACL(访问控制列表)的权限管理,以及对通信进行加密的支持,保护敏感数据和通信内容的安全性。
- 事件处理:Consul 具有事件处理功能,允许用户定义和触发事件,并通过 Consul 分发和处理事件。这使得系统可以根据事件的发生执行自动化的操作。
三.Consul调用流程
1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port;
2、Consul 接收到 Producer 的注册后,每隔 10s(默认)会向 Producer 发送一个健康检查的请求,检验 Producer 是否健康;
3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address;
4、该临时表每隔 10s 会更新,只包含有通过了健康检查的 Producer。
四.consul安装及使用
1.二进制安装consul
(1)下载安装包:consul_1.7.0_linux_amd64.zip 可以从consul官网https://www.consul.io/downloads.html进行下载就好(选择好OS和位数)
(2)将解压后的二进制文件consul 拷贝到/usr/local/bin 下
mv consul /usr/local/bin
chmod +x /usr/local/bin/consul
(3)创建目录
mkdir -p /data/consul/config
mkdir -p /data/consul/data
(4)创建配置文件
node_name和bind_addr 都是本机ip
cat > /data/consul/config/consul.json << EOF
{
"server": true,
"ui":true,
"datacenter": "dc1",
"data_dir": "/data/consul/data",
"node_name": "192.168.xxx.xxx",
"bootstrap_expect":1,
"client_addr": "0.0.0.0",
"bind_addr": "192.168.xxx.xxx"
}
EOF
(5)创建开机启动文件
cat > /usr/lib/systemd/system/consul.service << EOF
[Unit]
Description=consul server
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/consul agent -config-dir /data/consul/config/consul.json
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
设置开机启动
systemctl daemon-reload
systemctl enable consul.service
启动服务
systemctl start consul.service
关闭服务
systemctl stop consul.service
2.docker 方式安装consul
(1)拉取最新镜像
docker pull consul
(2)创建挂载目录
mkdir -p /data/consul/
(3)运行consul 容器
docker run --name=consul --restart=always --privileged=true -p 5012:8500 -v /usr/local/consul/data:/data/consul -e CONSUL_BIND_INTERFACE=eth0 -d consul agent -server -client=0.0.0.0 -bootstrap -ui -node=1
这个命令用于在 Docker 中运行 Consul 容器,各个参数介绍如下:
docker run
: 运行 Docker 容器的命令。--name=consul
: 指定容器的名称为 "consul"。--restart=always
: 设置容器总是在停止时自动重启。--privileged=true
: 授予容器特权,这允许容器访问主机的特权操作。-p 5012:8500
: 将容器内部的 8500 端口映射到主机的 5012 端口,这样外部可以通过主机的 5012 端口访问 Consul 的 Web UI 和 API。-v /usr/local/consul/data:/data/consul
: 将主机的/usr/local/consul/data
目录挂载到容器内的/data/consul
目录,用于持久化存储 Consul 的数据。-e CONSUL_BIND_INTERFACE=eth0
: 设置 Consul 绑定的网络接口为 eth0。-d
: 后台运行容器。consul agent -server -client=0.0.0.0 -bootstrap -ui -node=1
: 这部分是在容器中运行的 Consul 命令,其中各个参数的含义如下:
agent
: 启动 Consul agent 模式。-server
: 将 Consul 设置为服务器模式。-client=0.0.0.0
: 设置 Consul 监听的客户端地址。-bootstrap
: 将该节点设置为集群的引导节点。-ui
: 启用 Consul 的 Web UI。-node=1
: 设置节点名称为 "1"。
页面访问地址:http://主机ip:5012/ui/dc1/services