注册中心Consul、Nacos

Consul

https://www.consul.io/

https://developer.hashicorp.com/consul/commands

https://developer.hashicorp.com/consul/docs/agent/config – agent 配置

https://developer.hashicorp.com/consul/docs/agent/config/cli-flags – agent 命令行参考

https://developer.hashicorp.com/consul/docs/agent/config/config-files – agent 配置文件参考

Linux部署

解压

1
2
3
mkdir /opt/local/consul
unzip /opt/local/consul_1.20.3_linux_amd64.zip -d /opt/local/consul
chmod +x /opt/local/consul/consul

启动(agent命令行)

注意:编写的启动脚本,必须以类似 #!/bin/bash 作为开头,无法使用systemd。

vim /opt/local/consul/consul-startup.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
BASE_DIR=/opt/local/consul

mkdir -p $BASE_DIR/data
mkdir -p $BASE_DIR/log

$BASE_DIR/consul agent \
-node=node-name-1 \
-datacenter=dc-1 \
-client 0.0.0.0 \
-bind=192.168.0.7 \
-data-dir=$BASE_DIR/data \
-log-file=$BASE_DIR/log/ \
-log-level=info \
-ui \
-server \
-bootstrap-expect=1

启动

1
2
chmod +x /opt/local/consul/consul-startup.sh
/opt/local/consul/consul-startup.sh

启动(agent配置文件)使用中

1
2
3
4
BASE_DIR=/opt/local/consul
mkdir -p $BASE_DIR/data
mkdir -p $BASE_DIR/config
mkdir -p $BASE_DIR/log

vim $BASE_DIR/config/server.json,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"server": true,
"node_name": "node-name-1",
"datacenter": "dc-1",
"client_addr": "127.0.0.1 192.168.0.7",
"bind_addr": "192.168.0.7",
"advertise_addr": "192.168.0.7",
"ports": {
"http": 8500,
"dns": 8600,
"server": 8300
},
"data_dir": "/opt/local/consul/data",
"log_file": "/opt/local/consul/log/",
"log_level": "INFO",
"ui_config": {
"enabled": true,
"content_path": "/ui/"
},
"bootstrap_expect": 0,
"server_rejoin_age_max": "876000h0m0s",
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}

注意:此 Json 的任何位置都不支持 # 注释。

client_addr: 指定用于客户端与 Consul 交互的地址,控制 Consul 服务的 HTTP API 和 DNS 接口在哪个网络地址上监听(通常是客户端请求的地址),类似于Redis的bind。默认127.0.0.1,支持使用 空格分隔的多个地址

bind_addr:默认0.0.0.0,指定了 Consul 实际绑定的网络接口地址(私有 IP 地址),它用于 内部通信。即 Consul 会在该地址上监听并与其他节点进行数据交换。

advertise_addr:指定了 Consul 向外界宣布的地址(公共 IP 地址),其他节点或客户端将通过该地址与当前节点进行通信。它是 Consul 向集群或客户端广告的地址。

bootstrap:此标志用于控制服务器是否处于“引导”模式。每个数据中心在此模式下运行的服务器不得超过一台。单例模式下,才需要配置 bootstrap=truebootstrap_expect=1 。

bootstrap_expect:此标志提供数据中心中预期的服务器数量。不应提供此值,或者该值必须与集群中的其他服务器一致。此标志需要 -server 模式。

1
2
3
# 启动
/opt/local/consul/consul agent \
-config-file=/opt/local/consul/config/server.json

enable_token_persistence:开启 token 持久化后,Bootstrap Token 及其他 ACL Token 会被保存数据目录 tree /opt/local/consul/data/,Bootstrap Token 一旦丢失无法找回,因为 data_dir 下的文件无法以明文查看。

启用 ACL 功能

server.jsonacl 选项配置。

在 Consul 启动状态下,创建初始管理令牌(Bootstrap Token)。

1
2
3
4
5
6
7
8
[root@zlq consul]# ./consul acl bootstrap # 创建管理令牌
AccessorID: ae0da69b-e66f-89e1-a8b2-7ab347329de4
SecretID: a7564416-1a14-95e0-300b-204d29cae600 # 生成的token
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2025-04-22 14:04:52.227454167 +0800 CST
Policies:
00000000-0000-0000-0000-000000000001 - global-management # 使用的策略id,该内置策略权限很大,类似root

一旦启用 Consul 的 ACL 功能,绝大多数与 Consul 交互的操作都需要附带一个 有效的 ACL Token,否则就会被拒绝访问(403 权限错误 或 ACL not found)。以下是两种携带 ACL token 的方式:

1
2
3
4
5
# CONSUL_HTTP_TOKEN:Consul 的一个重要环境变量,用于自动为 所有 CLI 或 HTTP 请求附带一个默认的 ACL Token,实现身份认证和权限控制。
export CONSUL_HTTP_TOKEN=a7564416-1a14-95e0-300b-204d29cae600

# -token 参数:管理权限 SecretID,也可以使用 CONSUL_HTTP_TOKEN 环境变量
./consul acl token read -self -token=a7564416-1a14-95e0-300b-204d29cae600

创建普通 ACL Token(随机 UUID)

1
2
3
./consul acl token create \
-description "My Token" \
-policy-name global-management

创建固定 UUID 的 ACL Token

1
2
3
4
5
6
# -secret-id 为新 token 指定的固定 UUID(可选)
./consul acl token create --help
./consul acl token create \
-description "My Token" \
-policy-name global-management \
-secret 02185dbe-5bd9-ed9d-0f0e-88918868b028

开机自启

vim /etc/systemd/system/consul.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Consul
After=network.target

[Service]
# Type=forking 会导致 systemctl start service 阻塞
Type=simple
User=root
Group=root
ExecStart=/opt/local/consul/consul agent -config-file=/opt/local/consul/config/server.json
Restart=on-failure

[Install]
WantedBy=multi-user.target

systemctl 管理

1
2
3
4
systemctl daemon-reload
systemctl start consul
systemctl stop consul
systemctl enable consul

windows启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
title %~nx0

set BASE_DIR=X:\deploy\consul_1.20.3_windows_386
call %BASE_DIR%/consul agent ^
-node=node-name-1 ^
-datacenter=dc-1 ^
-client 0.0.0.0 ^
-bind=192.168.0.3 ^
-data-dir=%BASE_DIR%/data ^
-config-dir=%BASE_DIR%/config ^
-log-file=%BASE_DIR%/log/ ^
-log-level=info ^
-ui ^
-bootstrap-expect=1 ^
-server

pause

Nacos