关于 Consul 基本概念的了解:Consul 介绍
1. 几种部署方式
1.1 物理机上部署
1.1.1 安装
- 本处主要以 Linux 作为操作平台,下载、解压
```shell
下载
$ wget https://releases.hashicorp.com/consul/1.9.4/consul_1.9.4_linux_amd64.zip
解压
$ unzip consul_1.9.4_linux_amd64.zip
移到 PATH 路径下
$ mv consul /usr/local/bin/
验证是否安装成功
$ consul
- 快速启动
- 这是最简单快速的启动方式,在启动 consu l时直接启动 webui 界面,跟上 -ui 参数参考以下示例,端口默认为8500,如果使用阿里云请注意安全组是否开启。
```shell
consul agent -server -bootstrap -ui -data-dir=/data/soft/consul_1.4/consul-data -bind=0.0.0.0 -client=0.0.0.0 -node=127.0.0.1
1.1.2 集群搭建准备工作
- 至少3台机器,因为在异常处理中,如果出现 Leader 挂了,只要有超过一半的Server还处于活跃状态,consul 就会重新选举新的 Leader,保证集群可以正常工作。
- 测试用建议本地搭建几台虚拟机用于调试,这里的虚拟机分别为3台 Server 模式,1台 Client 模式,共以下4台:
- 192.168.6.128 Server 模式(初始设置为 Leader)
- 192.168.6.129 Server 模式
- 192.168.6.130 Server 模式
- 192.168.6.131 Client 模式
- 创建 /usr/src/consul 目录,存放 Consul 的启动配置文件 consul_config.json:
- node_name:节点名称,等同于 -node
- data_dir:数据存放目录
- enable_syslog:consul 日志写入系统的 syslog 目录是否启用
- enable_script_checks:是否启用监控检测脚本
- bind_addr:等同于 -bind
- client_addr:等同于 -client
{
"datacenter": "consul_cluster",
"node_name": "consul_1",
"server": true,
"bootstrap_expect": 3,
"data_dir": "/usr/src/consul/data",
"log_level": "DEBUG",
"enable_syslog": true,
"enable_script_checks": true,
"bind_addr": "192.168.6.128",
"client_addr": "192.168.6.128",
}
1.1.3 Server 端部署
部署第一台 192.168.6.128
- 注意:在第一台启动的时候加上 -ui,只初始化一次,在其它2个节点进行相同操作,但是配置文件中的 node_name、bind_addr、client_addr 要进行更改,每台机器保持唯一。
- 命令 -config-file: 加载启动的配置文件
$ sudo consul agent -ui -config-file=/usr/src/consul/consul_config.json
部署第二台 192.168.6.129
修改 /usr/src/consul/consul_config.json:
{
"datacenter": "consul_cluster",
"node_name": "consul_2",
"server": true,
"bootstrap_expect": 3,
"data_dir": "/usr/src/consul/data",
"log_level": "DEBUG",
"enable_syslog": true,
"enable_script_checks": true,
"bind_addr": "192.168.6.129",
"client_addr": "192.168.6.129",
}
执行命令启动命令
$ sudo consul agent -config-file=/usr/src/consul/consul_config.json
部署第三台 192.168.6.130
修改 /usr/src/consul/consul_config.json:
{
"datacenter": "consul_cluster",
"node_name": "consul_3",
"server": true,
"bootstrap_expect": 3,
"data_dir": "/usr/src/consul/data",
"log_level": "DEBUG",
"enable_syslog": true,
"enable_script_checks": true,
"bind_addr": "192.168.6.130",
"client_addr": "192.168.6.130"
}
执行命令启动命令
$ sudo consul agent -config-file=/usr/src/consul/consul_config.json
:::info
截止目前服务端已经全部启动,但是还没有加入集群,因此还只是单节点的集群,可以在某台机器上查看成员情况:
注意:直接使用consul members会报错
:::
$ consul members --http-addr 192.168.6.128:8500
Node Address Status Type Build Protocol DC Segment
consul_1 192.168.6.128:8301 alive server 1.4.0 2 consul_cluster <all>
1.1.4 Server 端集群建立
每个 Consul Agent 之后,都是相对独立的并不知道其它节点的存在,现在我们要做的是加入集群,将上面创建的 consul_2、consul_3 加入到同一个集群 consul_1 中。
第二台 192.168.6.129 加入到 consul_1 中
$ consul join --http-addr 192.168.6.129:8500 192.168.6.128
Successfully joined cluster by contacting 1 nodes. # 成功返回的消息
第三台 192.168.6.130 加入到 consul_1 中
$ consul join --http-addr 192.168.6.130:8500 192.168.6.128
目前服务端的集群已经创建完毕,可以看下我们目前的集群成员情况:
$ consul members --http-addr 192.168.6.128:8500
Node Address Status Type Build Protocol DC Segment
consul_1 192.168.6.128:8301 alive server 1.4.0 2 consul_cluster <all>
consul_2 192.168.6.129:8301 alive server 1.4.0 2 consul_cluster <all>
consul_3 192.168.6.130:8301 alive server 1.4.0 2 consul_cluster <all>
- 通过 HTTP API 的方式查看集群 leader ```shell $ curl 192.168.6.128:8500/v1/status/leader
“192.168.6.128:8300”
- 通过 HTTP API 的方式查看集群成员
```shell
$ curl 192.168.6.128:8500/v1/status/peers
["192.168.6.129:8300","192.168.6.130:8300","192.168.6.128:8300"]
1.1.5 Client 端部署
现在开始客户端的部署,方式同服务端有不同
修改 /usr/src/consul/consul_config.json 如下所示:
{
"datacenter": "consul_cluster",
"node_name": "consul_4",
//"server": true, 不指定为服务端,默认走客户端
// "bootstrap_expect": 3, 只在server模式有效
"data_dir": "/usr/src/consul/data",
"log_level": "DEBUG",
"enable_syslog": true,
"enable_script_checks": true,
"bind_addr": "192.168.6.131",
"client_addr": "192.168.6.131"
}
执行启动命令:
- 通过 -join 参数也可以加入一个已经启动的集群
$ sudo consul agent -config-file=/usr/src/consul/consul_config.json -join=192.168.6.128
- 通过 -join 参数也可以加入一个已经启动的集群
在查看当前集群成员,可以看到为3个 Server 模式和1个 Client 模式
$ consul members --http-addr 192.168.6.128:8500
Node Address Status Type Build Protocol DC Segment
consul_1 192.168.6.128:8301 alive server 1.4.0 2 consul_cluster <all>
consul_2 192.168.6.129:8301 alive server 1.4.0 2 consul_cluster <all>
consul_3 192.168.6.130:8301 alive server 1.4.0 2 consul_cluster <all>
consul_4 192.168.6.131:8301 alive client 1.4.0 2 consul_cluster <default>
1.1.6 集群离开
在需要离开集群的 server 节点执行 consul leave 命令离开集群,之后可看到已离开集群的 server 节点状态为 left,在 Consul 的升级过程中我们也可以这样来做,这会让该节点主动退出集群并结束进程。
$ consul leave --http-addr 192.168.6.130:8500
$ consul members --http-addr 192.168.6.128:8500
Node Address Status Type Build Protocol DC Segment
consul_1 192.168.6.128:8301 alive server 1.4.0 2 consul_cluster <all>
consul_2 192.168.6.129:8301 alive server 1.4.0 2 consul_cluster <all>
consul_3 192.168.6.130:8301 left server 1.4.0 2 consul_cluster <all>
1.1.7 UI 界面中查看
在部署第一台 192.168.6.128 机器的时候,consul agent 之后有跟一个 -ui 参数,这个是用于启动 WebUI 界面,这个是 Consul 本身所提供的 Web 可视化界面,浏览器输入 http://192.168.6.128:8500 进行访问
1.2 Docker 部署
拉取镜像
$ docker pull consul
启动集群,4个 Consul Agent,3个 Server(会选举出一个 leader),一个 Client ```shell
启动第1个Server节点,集群要求要有3个Server,将容器 8500 端口映射到主机 8500 端口,同时开启管理界面
docker run -d —name=consul1 -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent —server=true —bootstrap-expect=3 —client=0.0.0.0 -ui
启动第2个Server节点,并加入集群
docker run -d —name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent —server=true —client=0.0.0.0 —join 172.17.0.2
启动第3个Server节点,并加入集群
docker run -d —name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent —server=true —client=0.0.0.0 —join 172.17.0.2
启动第4个Client节点,并加入集群
docker run -d —name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent —server=false —client=0.0.0.0 —join 172.17.0.2
- 第1个启动容器的 IP 一般是172.17.0.2,后边启动的几个容器 IP 会排着来:172.17.0.3、172.17.0.4、172.17.0.5。
- 这些 Consul 节点在 Docker 的容器内是互通的,他们通过桥接的模式通信。但是如果主机要访问容器内的网络,需要做端口映射。在启动第一个容器时,将 Consul 的 8500 端口映射到了主机的 8500 端口,这样就可以方便的通过主机的浏览器查看集群信息。

- 用配置文件的方式来注册服务
```json
# 编写service.json
{
"services": [
{
"id": "hello1",
"name": "hello",
"tags": [
"primary"
],
"address": "172.17.0.5",
"port": 5000,
"checks": [
{
"http": "http://localhost:5000/",
"tls_skip_verify": false,
"method": "Get",
"interval": "10s",
"timeout": "1s"
}
]
}
]
}
# 将json文件拷贝进容器内
$ docker cp myservice.json consul1:/consul/config
# 重载配置文件
$ docker exec consul1 consul reload
- 此时已经有了服务,只是服务不可用,consul发送给服务的请求不可达
1.3 k8s 中部署
可以自己去写 yaml 资源清单文件或者利用官方提供好的 helm 的 charts 来安装:
- 利用 helm 进行安装
```shell
查询 helm
$ helm search consul NAME CHART VERSION APP VERSION DESCRIPTION
apphub/consul 5.3.3 1.6.0 Highly available and distributed service discovery and ke… apphub/prometheus-consul-exporter 0.1.4 0.4.0 A Helm chart for the Prometheus Consul Exporter
bitnami/consul 5.3.3 1.6.0 Highly available and distributed service discovery and ke… incubator/ack-consul 0.5.0 0.5.0 Install and configure Consul on Kubernetes.
stable/consul 3.8.1 1.5.3 Highly available and distributed service discovery and ke… stable/prometheus-consul-exporter 0.1.4 0.4.0 A Helm chart for the Prometheus Consul Exporter
安装consul
$ helm install stable/consul -n consul NAME: consul LAST DEPLOYED: Fri Nov 22 09:52:52 2019 NAMESPACE: default STATUS: DEPLOYED
RESOURCES: ==> v1/ConfigMap NAME DATA AGE consul-tests 1 3m4s
==> v1/Pod(related) NAME READY STATUS RESTARTS AGE consul-0 0/1 ContainerCreating 0 3m4s
==> v1/Secret NAME TYPE DATA AGE consul-gossip-key Opaque 1 3m4s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
consul ClusterIP None
==> v1beta1/PodDisruptionBudget NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE consul-pdb N/A 1 0 3m4s
==> v1beta1/StatefulSet NAME READY AGE consul 0/3 3m4s
NOTES:
- Watch all cluster members come up. $ kubectl get pods —namespace=default -w
- Test cluster health using Helm test. $ helm test consul
- (Optional) Manually confirm consul cluster is healthy. $ CONSUL_POD=$(kubectl get pods -l=’release=consul’ —output=jsonpath={.items[0].metadata.name}) $ kubectl exec $CONSUL_POD consul members —namespace=default | grep server ```
- 查看运行状态,我们可以看到 helm 安装 consul 使用的是 statefulset,服务使用的是 NodePort 方式
```shell
查看运行状态
$ kubectl get pods —show-labels -l release=consul NAME READY STATUS RESTARTS AGE LABELS consul-0 1/1 Running 0 3m41s chart=consul-3.8.1,component=consul-consul,controller-revision-hash=consul-6969c79b5c,heritage=Tiller,release=consul,statefulset.kubernetes.io/pod-name=consul-0 consul-1 1/1 Running 0 2m56s chart=consul-3.8.1,component=consul-consul,controller-revision-hash=consul-6969c79b5c,heritage=Tiller,release=consul,statefulset.kubernetes.io/pod-name=consul-1 consul-2 1/1 Running 0 2m17s chart=consul-3.8.1,component=consul-consul,controller-revision-hash=consul-6969c79b5c,heritage=Tiller,release=consul,statefulset.kubernetes.io/pod-name=consul-2
查看svc
$ kubectl get svc -l release=consul
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
consul ClusterIP None
查看server
$ CONSUL_POD=$(kubectl get pods -l=’release=consul’ —output=jsonpath={.items[0].metadata.name})
$ kubectl exec $CONSUL_POD consul members —namespace=default | grep server
consul-0 10.244.1.67:8301 alive server 1.5.3 2 dc1
- 网页进行查看

<a name="Rb1cg"></a>
# 2. 基本使用
<a name="l9EUn"></a>
## 2.1 Consul Agent
执行` consul agent -dev `,启动开发模式,这个模式会快速启动一个单节点的 Consul。注意,这个模式不能数据持久化,因此,不能用于生产环境。
<a name="dWHbr"></a>
### 启动命令简介:
- `-server`:定义 agent 运行在 server 模式,每个数据中心的 Server 建议在3~5个避免失败情况下数据的丢失
- `-client`:定义 agent 运行在 client 模式
- `bootstrap-expect`:server 模式下,集群要求的最低数量,当低于这个数量,集群失效
- `-bootstrap-expect`:在一个 datacenter 中期望提供的 server 节点数目,当该值提供的时候,consul 一直等到达到指定 sever 数目的时候才会引导整个集群
- `-bind`:节点的 ip 地址一般是`0.0.0.0`或云服务内网地址,用于被集群中的其他节点所访问
- `-node`:指定节点在集群中的唯一名称,默认为机器的 hostname
- `-config-dir`:配置文件目录,里面所有以 .json 结尾的文件都会被加载
- `data-dir`:data 存放的目录,consul 数据同步机制
- 更多可选参数参考 [Consul Command-line Options](https://www.consul.io/docs/agent/options.html)
<a name="09465f40"></a>
### Start Agent
```shell
$ consul agent -dev
==> Starting Consul agent...
==> Consul agent running!
Version: 'v1.4.0'
Node ID: '9e05f4d6-56c1-e57c-c726-15d9ab1c0dd5'
Node name: 'iZbp1isjfk2rw8fpnxx8wgZ'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
看下 consul agent 输出的几个重要信息:
- Node name:代理的唯一名称,默认是机器的 hostname,可以通过
-node
标志自定义,例如:consul agent -dev -node myNode
- Datacenter:数据中心,Consul 支持多个数据中心,为了有效的工作,每个节点必须被配置且上报到数据中心,
-datacenter
标志用来设置数据中心,对于单一的 DC 配置,这个代理默认为dc1
- Server:表示代理是以服务器还是客户端的模式来运行。
- Client Addr:用于代理的客户端接口地址。
- Cluster Addr:用于集群中的 Consul 代理之间通信的地址和端口集,该地址必须可供其它节点访问。
查看集群成员(Members)
进入一个节点执行 consul members
,可以看到集群的成员
- Node:节点名称
- Address:节点地址
- Status:alive 表示节点为健康状态
- Type:节点的运行模式(Server)
$ docker exec -it consul1 sh
/ # consul members
Node Address Status Type Build Protocol DC Segment
3fa3be87462f 172.17.0.2:8301 alive server 1.9.4 2 dc1 <all>
59eaa5a2aaa4 172.17.0.4:8301 alive server 1.9.4 2 dc1 <all>
73a1505a20bb 172.17.0.3:8301 alive server 1.9.4 2 dc1 <all>
46e01582af2e 172.17.0.5:8301 alive client 1.9.4 2 dc1 <default>
查看最近历史日志
consul monitor
显示最近历史日志,默认显示的日志级别为 info 可以根据-log-level
进行设置-log-level
: debug,还有 “debug”,”info”,”warn”,”error”
Stop Agent
- Agent 两种停止方式:gracefully 或 forcefully
- gracefully 方式停止,则是发送中断信号到 Agent 进程,两种方法:
Ctrl+C
、kill -INT consul_pid
; - forcefully 方式停止,则立即停止 Agent 进程,
kill -KILL consul_pid
- gracefully 方式停止,则是发送中断信号到 Agent 进程,两种方法:
2.2 服务注册
Consul 服务搭建好之后,通过提供 服务定义 或 HTTP API 注册一个服务,通用的模式是通过提供服务定义的方式,下文还会介绍怎么应用 Consul 进行健康检查。
使用 Service Definition 方式服务注册
在某台节点机器上创建目录 /etc/consul.d (.d 后缀意思是这个路径包含了一组配置文件),Consul 会载入该目录下的所有文件。
- 现在准备一个测试服务 test.js,端口为 3000: ```javascript const http = require(‘http’);
http.createServer(async (req, res) => { const {url, method} = req;
// 测试健康检查
if (url === '/health') {
res.end('OK!');
}
}).listen(3000); console.log(‘Server running at http://192.168.12.1:3000/‘);
- 为测试服务创建 Service Definiton
```shell
$ sudo mkdir /etc/consul.d/test.json
{
"service":{
"name": "test",
"tags": [
"",
""
],
"address": "192.168.12.1",
"port": 3000,
"enable_tag_override": false,
"check": {
"deregisterCriticalServiceAfter": "90m",
"http": "http://192.168.12.1:3000/health",
"interval": "10s"
}
}
}
服务定义配置文件含义:
- name:服务名
- tags:服务的 tag,自定义,可以根据这个 tag 来区分同一个服务名的服务
- address:服务注册到 consul 的 IP,服务发现,发现的就是这个 IP
- port:服务注册 consul 的 PORT,发现的就是这个 PORT
- enable_tag_override:标签是否允许覆盖
- check:健康检查部分
- deregisterCriticalServiceAfter
- http:指定健康检查的 URL,调用后只要返回 20X,consul 都认为是健康的
- interval:健康检查间隔时间,每隔 10s,调用一次上面的 URL
使服务定义配置生效:
- 物理机环境直接,重启 Agent 设置配置目录
- 容器环境,将 Service Definition 拷贝到 consul 容器中,重载配置文件
```shell
物理机部署环境下
启动 consul_4 进行服务注册
$ sudo consul agent -config-file=/usr/src/consul/consul_config.json -join=192.168.6.128 -config-dir=/etc/consul.d
docker 部署环境下
将 json 文件拷贝进容器内
$ docker cp test.json consul1:/consul/config
重载配置文件
$ docker exec consul1 consul reload
- Test 服务注册成功

<a name="FzmEt"></a>
### 使用 HTTP API 服务注册
调用 `/v1/agent/service/register `接口进行注册,请求 Method 为 **PUT** 方式
- 请求 Body 值为服务定义中的 service 值,看一下示例:
```shell
# 物理机部署环境下
$ curl -X PUT \
http://[server_ip]:8301/v1/agent/service/register \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'postman-token: 6b672c02-350f-3d1c-7793-1a0d9e800fc9' \
-d '{
"id": "test",
"name":"test",
"tags":[
"",
""
],
"address":"192.168.12.1",
"port":3000,
"check":{
"deregisterCriticalServiceAfter":"90m",
"http":"http://192.168.12.1:3000/health",
"interval":"10s"
}
}'
2.3 服务发现
Consul 服务发现支持 HTTP API 和 DNS 两种方式:
HTTP API
# 物理机部署环境下
$ curl http://192.168.6.128:8500/v1/catalog/service/test?passing=true
执行命令之后返回 Consul 的注册信息、服务信息及健康检查信息,且指定 passing=true,表示返回时过滤掉一些不健康的节点。
[
{
"ID": "c412d602-38ac-93fe-930c-284b8e460156",
"Node": "3fa3be87462f",
"Address": "172.17.0.2",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "172.17.0.2",
"lan_ipv4": "172.17.0.2",
"wan": "172.17.0.2",
"wan_ipv4": "172.17.0.2"
},
"NodeMeta": {
"consul-network-segment": ""
},
"ServiceKind": "",
"ServiceID": "test",
"ServiceName": "test",
"ServiceTags": [
"",
""
],
"ServiceAddress": "192.168.12.1",
"ServiceTaggedAddresses": {
"lan_ipv4": {
"Address": "192.168.12.1",
"Port": 3000
},
"wan_ipv4": {
"Address": "192.168.12.1",
"Port": 3000
}
},
"ServiceWeights": {
"Passing": 1,
"Warning": 1
},
"ServiceMeta": {
},
"ServicePort": 3000,
"ServiceEnableTagOverride": false,
"ServiceProxy": {
"MeshGateway": {
},
"Expose": {
}
},
"ServiceConnect": {
},
"CreateIndex": 3447,
"ModifyIndex": 3447
}
]
DNS 方式
现在使用第二种 DNS 方式查询具体的服务,Consul 提供了默认的名字 NAME.service.consul
,NAME 代指注册的服务名称。
对于上面注册的 Web 服务对应域名分别为 test.service.consul
,下面先对于 test.service.consul 进行服务查询:
# 物理机部署环境
$ dig @192.168.6.128 -p 8600 order_service.service.consul
# 如果是容器部署环境下,需要在部署的时候暴露端口 [docker run -p 8600:8600 ...]
为了展示更详细的信息,在 dig 命令中我们可以加上 SRV
参数,可以返回服务所在的节点信息、端口号。
$ dig @192.168.6.128 -p 8600 order_service.service.consul SRV
2.4 KV 的导入、导出、备份及恢复
2.4.1 KV 导出
KV 的 consul kv export
命令用于从 Consul’s KV 存储库中检索指定的 KV 对,默认情况下检索所有的,并将这些数据以 JSON 形式导出到指定文件。
# 物理机环境下
$ consul kv export --http-addr=http://192.168.6.128:8500 '' > consul_kv_$(date +%Y%m%d%H%M%S).json
- consul kv export:导出命令
- —http-addr:指定 Consul 地址
- ‘’:为导出的键值对参数,默认为导出所有
- consulkv$(date +%Y%m%d%H%M%S).json:导出的文件名,可以自定义
导出之后会看到一个文件 consul_kv_20210412162039.json:
$ cat consul_kv_20210412162039.json
[
{
"key": "test",
"flags": 0,
"value": "ewoJIm5hbWUiOiAidG9tIiwKICAiYWdlIjogMTgKfQ=="
}
]
键值对 value 的值为 base64 编码,base64 -d 命令可看到原始的 value 值:
$ echo "ewoJIm5hbWUiOiAidG9tIiwKICAiYWdlIjogMTgKfQ==" | base64 -d
{
"name": "tom",
"age": 18
}
2.4.2 KV 导入
consul kv import 命令用于导入 consul kv export 命令导出的 JSON 文件,使用很简单,如下所示:
# 物理机环境下
$ sudo consul kv import --http-addr=http://192.168.6.128:8500 @consul_kv_20210412162039.json
2.4.3 KV 备份与恢复
snapshot 命令具有保存、恢复、检查 Consul 服务器状态,该版本在 Consul 0.7.1 及更高版本中可用。
保存
$ consul snapshot save --http-addr=http://192.168.6.128:8500 backup_$(date +%Y%m%d%H%M%S).snap
检查
$ consul snapshot inspect backup_20210412162039.snap
恢复
$ consul snapshot restore --http-addr=http://192.168.6.128:8500 backup_20210412162039.snap
开始保存快照守护进程
- 运行保存快照的守护进程,定期保存 Consul 服务器状态的快照
$ consul snapshot agent --http-addr=http://192.168.6.128:8500
- 运行保存快照的守护进程,定期保存 Consul 服务器状态的快照
2.5 ACL
Consul使用访问控制列表(ACL)来保护对 UI,API,CLI,服务通信和代理通信的访问。
- 在 Agents 上开启 ACL
acl = { enabled = true default_policy = “deny” enable_token_persistence = true }
```
- TODO…
关于 ACL 使用详细内容:https://learn.hashicorp.com/tutorials/consul/access-control-setup-production
参考链接: https://www.consul.io/docs/intro https://www.nodejs.red/#/microservice/consul?id=consul