Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
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启动日志时无需此命令集群重启时建议删除所有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不同
以下测试均为本人亲自测试,不上图见谅。
consul无法自动删除服务注册信息,必须手动删除
PUT方式请求集群中任意consul节点都可以
http://ip:port/v1/agent/service/deregister/CheckID
-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的数量是受控制的。