一、Consul简介
Consul 是 HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现、服务隔离、服务配置,这些功能中的每一个都可以根据需要单独使用,也可以同时使用所有功能。Consul 官网目前主要推 Consul 在服务网格中的使用。
与其它分布式服务注册与发现的方案相比,Consul 的方案更“一站式”——内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具。Consul 本身使用 go 语言开发,具有跨平台、运行高效等特点,也非常方便和 Docker 配合使用
Consul 的主要特点:
- 服务注册与发现:Consul 的客户端可以做为一个服务注册到 Consul,也可以通过 Consul 来查找特定的服务提供者,并且根据提供的信息进行调用
- 健康检查: Consul 客户端会定期发送一些健康检查数据和服务端进行通讯,判断客户端的状态、内存使用情况是否正常,用来监控整个集群的状态,防止服务转发到故障的服务上面
- KV Store:Consul 还提供了一个容易使用的键值存储。这可以用来保持动态配置,协助服务协调、建立 Leader 选举,以及开发者想构造的其它一些事务
- Secure Service Communication:Consul 可以为服务生成分布式的 TLS 证书,以建立相互的 TLS 连接。 可以使用 intentions 定义允许哪些服务进行通信。 可以使用 intentions 轻松管理服务隔离,而不是使用复杂的网络拓扑和静态防火墙规则
- Multi Datacenter:Consul 支持开箱即用的多数据中心,这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域
Consul 角色:
- Server:服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 Server 数量推荐为 3 个或是 5 个
- Client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群
Consul 的优势:
- 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接。相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。
- 支持多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持
- 支持健康检查。 etcd 不提供此功能。
- 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议
- 官方提供 Web 管理界面, etcd 无此功能。
- Consul 保持了 CAP 中的 CP,保持了强一致性和分区容错性。
- Consul 支持 Http\gRPC\DNS 多种访问方式。
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.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、创建配置文件
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
node_name和bind_addr 都是本机ip
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
三: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 /data/consul:/usr/local/consul/data -e CONSUL_BIND_INTERFACE=eth0 -d consul agent -server -client=0.0.0.0 -bootstrap -ui -node=1
5012 : 是外部访问映射端口
-v : /data/consul/ 挂载目录
docker 运行成功后,本机ip就是注册中心地址,5012就是端口 通过网页可以访问到注册中心,如:http://119.3.226.32:5012/ui/dc1/services