Spring Cloud开发实践(五): Consul - 服务注册的另一个选择
目录
- Spring Cloud开发实践(一): 简介和根模块
- Spring Cloud开发实践(二): Eureka服务和接口定义
- Spring Cloud开发实践(三): 接口实现和下游调用
- Spring Cloud开发实践(四): Docker部署
- Spring Cloud开发实践(五): Consul - 服务注册的另一个选择
- Spring Cloud开发实践(六): 基于Consul和Spring Cloud 2021.0的演示项目
关于 Consul
Consul 是微服务网络解决方案之一, 用于管理跨网络和多云环境服务之间的安全网络连接, 提供服务发现, 服务网格, 流量管理和自动更新. 可以单独部署, 也可以分布式部署.
Consul 的特点
- CP(强一致性),使用Raft复制状态
- 服务可以通过任意Server注册, 通过 Raft 仲裁
- 内建安全通信选项
- 一致性提供锁定和集群协调
- 带配置功能, 健康检查, Lock, KV, ACL
- 通过 DNS 支持非 REST 节点, 允许更多类型资源连接
- 使用 Go 语言编写, 启动资源消耗小, 只需要50-60MB内存, 相对比 Nacos 默认配置512M, 启动需要600M以上内存.
- 脚本化配置, 对容器部署方式更友好
安装
下载地址 https://developer.hashicorp.com/consul/downloads, 根据自己的系统选择对应的二进制文件, 对应 Linux AMD64 的, 文件还不小, 50MB, 解压后只有一个可执行文件, 127MB, 将其放到 /opt/consul/ 目录, 并将owner改为 root:root
运行 Agent
Consul 的运行形式就是 Agent, 可以运行为 server 或 client 模式. Agent 的启动命令格式为
consul agent <options>
具体的命令参数可以通过consul agent --help
查看, 常用的参数
- -bind=
用于cluster通信的地址. 注意, 这个是用于consul各节点之间通信的网口, 不是给应用提供服务注册的网口 - -client=
用于client访问的地址, 包含 RPC, DNS, HTTP, HTTPS, gRPC (if configured). 这个才是给应用提供服务注册的网口, 使用0.0.0.0可以侦听所有 - -config-dir=
配置文件所在目录, 读取所有 .json 后缀的文件作为配置, 可以指定多次 - -config-file=
配置文件路径, 可以指定多次 - -data-dir=
指定agent状态数据存储目录 - -dev 以开发模式启动
- -log-file=
指定日志文件路径 - -log-json 使用JSON格式记录日志
- -log-level=
日志级别 - -log-rotate-bytes=
日志文件字节数约束 - -log-rotate-duration=
日志文件时间跨度 - -log-rotate-max-files=
日志保留的文件数 - -node=
指定本节点名称, 在 Cluster 内必须唯一 - -node-id=
指定Node ID, 默认为自动生成并记录到 data-dir - -retry-join=
启动时尝试加入的 Agent 地址 - -server 服务器模式
- -ui 启用内建的静态Web UI界面
- -ui-content-path=
UI界面地址, 默认为 /ui/
开发模式
用-dev
参数可以快速创建一个开发模式的server, 数据不保存, Node ID随机生成, Node name使用当前的hostname, 监听 127.0.0.1, 可以看下面的控制台输出, HTTP等服务使用的是127.0.0.1地址, 只能从本机访问
$ consul agent -dev
==> Starting Consul agent...
Version: '1.15.2'
Build Date: '2023-03-30 17:51:19 +0000 UTC'
Node ID: 'ab2e7536-867a-c12f-5bd6-8a825b31af90'
Node name: 'centos7001'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, gRPC-TLS: 8503, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Gossip Encryption: false
Auto-Encrypt-TLS: false
HTTPS TLS: Verify Incoming: false, Verify Outgoing: false, Min Version: TLSv1_2
gRPC TLS: Verify Incoming: false, Min Version: TLSv1_2
Internal RPC TLS: Verify Incoming: false, Verify Outgoing: false (Verify Hostname: false), Min Version: TLSv1_2
==> Log data will now stream in as it occurs:
2023-05-17T06:31:23.337Z [DEBUG] agent.grpc.balancer: switching server: target=consul://dc1.ab2e7536-867a-c12f-5bd6-8a825b31af90/server.dc1 from=<none> to=<none>
如果在远程服务器上运行, 需要加上-client
参数, 指定服务器网口IP地址, 这样就可以从本地访问 http://192.168.11.22:8500 的 Web控制台了
consul agent -dev -client=192.168.11.22
在另一个终端窗口中, 可以通过consul members
命令查看节点, 如果不加-http-addr
参数, 默认访问本地127.0.0.1
$ consul members -http-addr=http://192.168.11.22:8500
Node Address Status Type Build Protocol DC Partition Segment
centos7001 127.0.0.1:8301 alive server 1.15.2 2 dc1 default <all>
通过consul leave
停止consul服务
$ consul leave -http-addr=http://192.168.11.22:8500
Graceful leave complete
单Server模式
如果不使用-dev
, 就要手工指定一些参数, 否则启动会有错误
consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22
去掉了 -dev
参数, 增加了三个新参数,
- -ui 开启 8500 端口的 web 控制台, 这个不是必须的
- -server 和 -bootstrap-expect=1 一起使用, 前者表示用server模式启动, 后者表示只有一台服务器, 可以立即产生leader, 也必须指定. 如果不指定后者, consul会一直等待 leader 的产生
集群模式
集群模式下, 每个 Datacenter 必须至少有一台 server. 建议是3或5台, 单server在宕机时会造成数据丢失. 其它 Agent 运行为 client 模式.
下面以一台Server, 一台Client为例说明
在 11.22 主机上运行 Server
consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22 -bind=192.168.11.22
在 11.23 主机上运行 Client, 并 Join 到 11.22
consul agent -ui -data-dir=./data -client=192.168.11.23 -bind=192.168.11.23 -retry-join=192.168.11.22
Join 成功后, 在两边的控制台上会显示相应信息. 这时候通过consul members
可以看到两个Node:
/opt/consul/consul members -http-addr=http://192.168.11.22:8500
Node Address Status Type Build Protocol DC Partition Segment
centos7001 192.168.11.22:8301 alive server 1.15.2 2 dc1 default <all>
54120-nc01 192.168.11.23:8301 alive client 1.6.1 2 dc1 default <default>
后台运行
不留日志
nohup /opt/consul/consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22 -bind=192.168.11.22 >/dev/null 2>&1 &
日志输出到文件
nohup /opt/consul/consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22 -bind=192.168.11.22 >path/to/log/consul.log 2>&1 &
这样consul会在后台运行, 需要用 consul leave 退出
常用命令
查看节点状态
curl http://localhost:8500/v1/agent/members | python -m json.tool
服务查询
# 获取服务列表
curl http://127.0.0.1:8500/v1/catalog/services | python -m json.tool
# 查询服务
curl http://127.0.0.1:8500/v1/catalog/service/nginx-server | python -m json.tool
# 检查服务状态
curl http://127.0.0.1:8500/v1/health/service/qincai-ser | python -m json.tool
# 查看当前节点服务列表
curl http://localhost:8500/v1/agent/services | python -m json.tool
服务默认只侦听本机网口127.0.0.1, 如果要开放对所有网口的侦听, 需要 -client=0.0.0.0 参数, 例如这样的启动命令
consul agent -server -bootstrap-expect 1 -datacenter=aadc -data-dir /home/tomcat/consul -node=consul-server -client=0.0.0.0 -bind=127.0.0.1
参考
- Eureka vs Consul https://gist.github.com/StevenACoffman/de394d6511a387ada9ab988e33be8583
- Get Started: Consul Agent https://developer.hashicorp.com/consul/docs/agent
- Consul建立集群 https://book-consul-guide.vnzmi.com/06_setup_cluster.html