基本信息及特性
Consul是由HashiCorp公司在2014年开发并开源的一款注册配置中心,使用go语言编写。
Github官方介绍:
Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure.
其特性包括但不限于:
1.多数据中心架构支持;
2.服务网格模式支持(将额外提供服务间调用安全和认证,构建零信任体系);
3.多种服务发现模式(支持openAPI服务发现和dns服务发现);
4.可自定义的服务健康检查策略(客户端心跳、服务端主动检测,包括http检测、脚本检测、TCP检测等方式);
5.文件结构的kv存储系统(可充当配置中心);
6.可灵活配置的访问权限控制方法、规则;
7.功能丰富完善的openAPI系统和UI界面;
8.极简的部署流程;
9.使用Raft作为服务端节点数据同步的一致性协议,因此为CP模式。使用Gossip协议进行服务端与客户端的信息同步;
10.拥抱云原生,官方提供虚机和K8s两种部署指引。
Conusl在使用时可以以标准模式部署,或以服务网格模式部署,架构图如下所示。标准模式指的是基本的注册中心服务端-服务提供者-服务消费者模式,而服务网格模式则添加了Consul对微服务系统网络层的集中管控,支持网络路由鉴权控制等能力。
端口及网络通信
Consul server agent 节点端口列表(单机、集群)罗列如下。其中,8500端口为最基本的客户端http标准服务端口。
端口号 | 描述 | 备注 |
---|---|---|
8500 | 标准服务端口(openAPI http) | |
8501 | 标准服务端口(openAPI https) | 默认不开启 |
8502 | grpc端口(用途待确认) | 默认不开启 |
8503 | grpc-tls端口(用途待确认) | |
8300 | Raft RPC端口 | |
8301 | Gossip(LAN)端口 | |
8302 |
Gossip(WAN)端口 |
|
8600 | 标准服务端口(DNS) |
Raft端口和Gossip端口有各自的用途,交互架构详见下图。
8300 - Raft RPC端口
Raft端口主要用于服务端集群间通信和数据同步。
8301 - Gossip(LAN)端口
Gossip端口主要用于通过gossip协议在服务端和客户端之间同步数据。
8302 - Gossip(WAN)端口
功能清单
Consul是一个标准的注册配置中心,其功能模块基本与Nacos重合,如服务模块、配置模块、鉴权模块、命名空间模块(企业版)。除此之外,Consul还具有一些额外的服务网格相关功能。
功能罗列如下,表格不一定完整(以下功能通过openAPI列表梳理):
功能名称 | 所属模块 | 备注 |
---|---|---|
集群成员状态查询 | 管理模块 | |
集群Raft状态查询、管理 | ||
会话查询 | 会话,即客户端连接 | |
服务端配置CRUD | ||
服务列表查询 | 服务模块 | |
服务实例注册、注销、查询、心跳 | ||
服务实例健康检查规则CRUD | 健康检查规则可高度自定义 | |
kv存储CRUD | 配置模块 | |
kv快照导入导出 | ||
acl token CRUD | 鉴权模块 | 口令,相当于账密 |
acl policy CRUD | 访问控制策略,可高度灵活自定义 | |
acl 算法查询、指定 | ||
服务Intention管理 | 服务网格模块 | 对服务网格中的服务间访问进行控制 |
调用链查询 | ||
Peer管理 | 多数据中心模块 | 多数据中心间数据同步规则定义 |
服务端部署
Consul的部署遵循极简的部署流程,整个部署过程最少只需要一个二进制文件即可完成。为了方便部署配置管理和后续运维,下述部署流程将额外创建consul配置文件server.json,以及数据、日志目录。
单机部署
标准部署流程:
1.将二进制文件consul拷贝到目标机器的任意目录下,下述以/root/consul为例
2.准备部署目录:
mkdir -p /root/consul/data
mkdir -p /root/consul/logs
将下述内容写入到/root/consul/server.json中:
{
"server": true,
"ui_config": {
"enabled": true
},
"node_name": "consul-server1",
"client_addr": "0.0.0.0",
"data_dir": "/root/consul/data",
"log_file": "/root/consul/logs",
"bind_addr": "192.168.0.228", //本机ip
"bootstrap_expect": 1,
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
3.执行指令,进行部署:
nohup ./consul agent -config-file=server.json &
集群部署
在三个节点上分别执行:
1.将二进制文件consul拷贝到目标机器的任意目录下,下述以/root/consul为例
2.准备部署目录:
mkdir -p /root/consul/data
mkdir -p /root/consul/logs
将下述内容写入到/root/consul/server.json中:
{
"server": true,
"ui_config": {
"enabled": true
},
"node_name": "consul-server1", //不同节点不可重复
"client_addr": "0.0.0.0",
"data_dir": "/root/consul/data",
"log_file": "/root/consul/logs",
"bind_addr": "192.168.0.228", //本机ip
"bootstrap_expect": 3, //集群节点数,为奇数
"retry_join": [ //集群节点列表
"192.168.0.228",
"192.168.0.192",
"192.168.0.209"
],
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
3.执行指令,进行部署:
nohup ./consul agent -config-file=server.json &
4.部署成功后,可执行如下命令进行集群状态检测:
./consul members
member配置从左到右每一列信息依次含义:
列名 | 含义 |
---|---|
Node | 节点名称 |
Address | 节点地址 |
Status |
节点状态,枚举值:alive/leave/failed |
Type | 节点类型,枚举值:server/client |
Buid | 版本号 |
Protocal | 协议 |
DC | 数据中心标识 |
Partition | 未知 |
Segment | 网络分段相关,主要是为了将Gossip池隔离为更小的单元,可详见官网关于网络分段的描述 |
常用配置梳理
服务端配置通常被写入到json或hcl格式的文件中进行维护,常用配置罗列如下( . 表示json的下一层级)。
配置名称 | 描述 | 备注 |
---|---|---|
server | 是否开启服务端模式 | |
ui_config.enabled | 是否开启ui界面 | |
node_name | consul agent节点名称 | |
client_addr | 可接受的客户端地址列表 | 填写0.0.0.0表示全部可接受 |
data_dir | 数据目录 | |
log_file | 日志目录 | |
bind_addr | consul agent节点ip | 多网卡时需要指定 |
bootstrap_expect | 集群节点数 | |
retry_join | 集群节点列表 | 为数组 |
acl.enabled | 是否打开acl功能 | |
acl.default_policy | acl默认策略 | |
acl.enable_token_persistence | acl token持久化 |
完整参数列表可详见官网。
OpenAPI和客户端使用
OpenAPI
Consul提供了功能丰富全面的OpenAPI供客户端使用,官方UI、官方命令行程序、Java SDK、SpringCloud SDK、Go SDK底层均是调用了其OpenAPI。
OpenAPI的具体文档可详见官网资料。
常用的Consul OpenAPI主要分为如下几个大类:
OpenAPI类别 | 描述 |
---|---|
ACL | 鉴权相关API |
Agent | 包含服务、健康检查相关的众多API |
Catalog | 各类信息查询API |
Config | 服务端配置相关API |
Connect | 服务网格Intention相关API |
Events | 事件相关API |
KV Store | kv存储相关API |
官方UI和命令行
除了OpenAPI,Consul官方还提供了UI和命令行两种方式对集群进行各类操作。
UI
只需访问ip:8500即可进入
命令行
consul二进制文件不但可用于部署服务端,可以用于对集群进行各类操作
常见的consul操作命令行操作包括但不限于:
查询集群节点
./consul members
重新加载配置文件
./consul reload
优雅关闭节点
./consul leave
查询所有注册的服务
./consul catalog services
加入集群
./consul join 192.168.4.130
查询服务端版本
./consul version
查询集群raft信息
./consul operator raft list-peers
Java SDK
可在Java代码中引入如下Maven坐标,来使用已封装的Consul OpenAPI能力:
<dependency>
<groupId>com.ecwid.consul</groupId>c
<artifactId>consul-api</artifactId>
<version>1.4.5</version>
</dependency>
使用ConsulClient类进行基本的操作。
SpringCloud SDK
SpringCloud对Consul有较好的支持。SpringBoot应用可通过下述方式快速使用Consul的注册中心、配置中心能力。
Consul注册中心
1.引入如下Maven坐标,版本可与框架对应
<!-- consul client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2.添加Consul相关配置,常见配置罗列如下
# 要连接的consul agent ip
spring.cloud.consul.host=198.20.7.231
# 要连接的consul agent port
spring.cloud.consul.port=8500
# 注册ip而不是主机名
spring.cloud.consul.discovery.prefer-ip-address=true
# 指定注册ip的值,适用于多网卡的情况
spring.cloud.consul.discovery.ip-address=127.0.0.1
# 采用客户端心跳的健康检查模式,而不是默认的服务端http探测
spring.cloud.consul.discovery.heartbeat.enabled=true
# acl token
spring.cloud.consul.discovery.acl-token=a4685115-ef96-903f-bba3-ebb325eccfab
3.启动类添加必要注解
4.观察注册情况,发起服务调用测试
Consul配置中心
1.引入如下Maven坐标,版本可与框架对应
<!-- consul client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
2.添加Consul相关配置,常见配置罗列如下
# 要连接的consul agent ip
spring.cloud.consul.host=198.20.5.37
# 要连接的consul agent port
spring.cloud.consul.port=8500
# 配置中心配置文件格式
spring.cloud.consul.config.format=properties
3.编写测试类,启动服务,测试配置更新情况
以上对Consul的各语言客户端使用方式进行了总结,大体都是对Consul的OpenAPI进行了封装。