Consul是什么
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
Consul server client模式介绍
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个
集群中的consul节点都可以提供注册和查询微服务器的功能,Leader负责给其他Follower同步数据和监控各个节点的健康,一般建议注册到client模式consul
集群模式一般有至少3个server,若干client consul,需准备配置文件放在相应的目录下,需要建立data文件夹,集群server模式consul若超过半数挂掉,集群就挂掉了
下载安装 :
https://releases.hashicorp.com/consul/
linux下载安装:
unzip consul_xxx_linux_amd64.zip
cp consul /usr/local/bin/
查看是否安装成功:
consul
集群搭建 :
准备配置文件
Server配置文件config.json参考:
{
"datacenter": "dc1",
"data_dir": "/xxx/data", #consul数据存储位置
"log_level": "INFO",
"node_name": "server1", #集群中保证唯一
"server": true,
"ui": true,
"bootstrap_expect": 3,
"bind_addr": "192.xx.xx.106", #本机ip
"client_addr": "0.0.0.0",
"retry_join": ["192.xx.xx.106:8301"],
"retry_interval": "5s",
"raft_protocol": 3,
"enable_debug": false,
"rejoin_after_leave": true,
"enable_syslog": false,
"discovery_max_stale": "10s",
"performance": {
"raft_multiplier": 2
}
}
Server配置文件port.json参考:
{
"ports": {
"http": 8500,
"dns": 8600,
"serf_lan": 8301,
"serf_wan": 8302,
"server": 8300
}
}
client配置文件config.json参考:
{
"datacenter": "dc1",
"data_dir": "/xxx/data", #consul数据存储位置
"log_level": "INFO",
"node_name": "client", #集群中保证唯一
"server": false, #此节点为client模式
"ui": true,
"bootstrap_expect": 0,
"bind_addr": "192.xxx.xxx.106", #本机ip
"client_addr": "0.0.0.0",
"retry_join": ["192.xxx.xxx.106:8301"],
"retry_interval": "5s",
"raft_protocol": 3,
"enable_debug": false,
"rejoin_after_leave": true,
"enable_syslog": false,
"discovery_max_stale": "10s",
"performance": {
"raft_multiplier": 2
}
}
client配置文件port.json参考:
{
"ports": {
"http": 8505,
"dns": 8605,
"serf_lan": 8351,
"serf_wan": 8352,
"server": 8350
}
}
依次启动server consul :
注意修改配置文件路径
consul agent -config-dir /xxx/config/ > /dev/null 2>&1 &
注意事项:
> /dev/null 2>&1 &为静默后台启动,看consul启动日志时无需此命令- -config-dir 为配置文件所在目录,consul默认加载所有.json结尾文件
- retry_join 的ip 端口为第一个启动的consul的ip, 端口与第一个启动的consul配置文件中的serf_lan端口一致,开启consul后自动加入cluster
- bind_addr 本机ip
- 配置文件中node_name 集群中保证唯一
- bootstrap_expect为集群server数量,数据中心中预期的服务器数。该值必须与集群中的其他服务器一致。提供后,Consul将等待指定数量的服务器可用,然后引导群集。
- 若不需要每个consul启动 ui界面,可将配置文件中的ui改为false
- serf_lan 内部通信端口
- port.json中http配置项为注册端口与ui端口
- raft_multiplier在生产中运行Consul 0.7及更高版本时建议将服务器性能参数配置回Consul的原始高性能设置,数值越小性能越高
- discovery_max_stale -为所有服务发现HTTP端点启用陈旧的请求。这等效max_stale于DNS请求的配置。如果该值为零(默认值),则所有服务发现HTTP终结点都转发给领导者。如果此值大于零,则任何Consul服务器都可以处理服务发现请求。如果Consul服务器落后于领导者多于discovery_max_stale,则查询将重新评估领导者以获取更多最新结果。领事代理还添加了一个新的X-Consul-Effective-Consistency响应头,用于指示代理是否进行了过时的读取。discover-max-stale是Consul 1.0.7中引入的一种方法,它是Consul操作员在代理级别强制来自客户端的过期请求的一种方法,默认为零,这与早期Consul版本中的默认一致性行为相匹配。
集群重启时建议删除所有data文件夹中内容,删除data后服务需要重新注册才能显示在UI上。
同一机器中测试集群时保证port.json内容唯一性。
集群主从状态查看:
consul operator raft list-peers -http-addr='ip:httpPort'
ip:httpPort 为任意confi.json的bind_addr和port.json中的http配置,默认请求127.0.0.1:8500
节点存活状态查看:
consul members -http-addr='ip:httpPort '
ip:httpPort 为任意config.json的bind_addr和port.json中的http配置,默认请求127.0.0.1:8500
部署结果:
使用springcloudconsul时代码配置文件适配:
Host: client consul ip
Port: client consul http port
ip-address: 服务本机ip
spring:
application:
name: portalservice
cloud:
consul:
host:
port:
discovery:
instanceId: ${spring.application.name}xxx #保证集群中唯一
prefer-ip-address: true #是否启用ip代替hostname注册
ip-address: #服务所在机器ip,docker部署时需要填写宿主机ip
serviceName: xxx
同一微服务注册为多个实例需代码中适配instanceId不同
高可用:
- 在Leader consul挂掉后,集群会重新选举Leader,在选举完成后服务注册发现与调用恢复正常, 重新选举时间为秒级
- 故障consul恢复后不会对现有集群产生影响,不会导致重新选举Leader
- 建议Server集群中加入client模式的consul,服务注册时全部注册到client模式consul中,client consul接受请求时会转发请求到server consul集群中处理
- client consul可部署多个,同一个服务的不同实例注册到不同的client consul,保证服务高可用
- 同一微服务注册为多个实例有负载均衡效果

consul集群测试:
- Consul集群挂掉一个server模式节点,新的主consul被选出,服务调用正常
- Consul集群挂掉两个server模式节点,若server模式consul只有3个,如果挂掉2个会导致集群瘫痪,服务间调用仍可用,但是服务定期抛出consul连接异常
- Consul集群与client同时挂掉,服务间调用仍可用,但是服务定期抛出consul连接异常
- 重启集群server与client,服务不抛异常,服务间调用正常
- 同一服务注册为多个实例时有负载均衡效果
consul删除无用节点:
consul无法自动删除服务注册信息,必须手动删除
PUT方式请求集群中任意consul节点都可以
http://ip:port/v1/agent/service/deregister/CheckID
consul agent 命令的常用选项
-data-dir
• 作用:指定agent储存状态的数据目录
• 这是所有agent都必须的
• 对于server尤其重要,因为他们必须持久化集群的状态
-config-dir
• 作用:指定service的配置文件和检查定义所在的位置
• 通常会指定为”某一个路径/consul.d”(通常情况下,.d表示一系列配置文件存放的目录)
-config-file
• 作用:指定一个要装载的配置文件
• 该选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同的值覆盖)
-dev
• 作用:创建一个开发环境下的server节点
• 该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
• 这种模式不能用于生产环境(因为第二条)
-bootstrap-expect
• 作用:该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。
-node
• 作用:指定节点在集群中的名称
• 该名称在集群中必须是唯一的(默认采用机器的host)
• 推荐:直接采用机器的IP
-bind
• 作用:指明节点的IP地址
• 有时候不指定绑定IP,会报Failed to get advertise address: Multiple private IPs found. Please configure one. 的异常
-server
• 作用:指定节点为server
• 每个数据中心(DC)的server数推荐至少为1,至多为5
• 所有的server都采用raft一致性算法来确保事务的一致性和线性化,事务修改了集群的状态,且集群的状态保存在每一台server上保证可用性
• server也是与其他DC交互的门面(gateway)
-client
• 作用:指定节点为client,指定客户端接口的绑定地址,包括:HTTP、DNS、RPC
• 默认是127.0.0.1,只允许回环接口访问
• 若不指定为-server,其实就是-client
-join
• 作用:将节点加入到集群
-datacenter(老版本叫-dc,-dc已经失效)
• 作用:指定机器加入到哪一个数据中心中
Client模式也提供服务的注册和查询,但Client模式不存储节点数据,Client将请求转发给Server进行处理,节点注册数据在Server端是持久化保存的,Client的数量可以无限多,Server的数量是受控制的。