关于 Consul 基本概念的了解:Consul 介绍

1. 几种部署方式

1.1 物理机上部署

1.1.1 安装

解压

$ unzip consul_1.9.4_linux_amd64.zip

移到 PATH 路径下

$ mv consul /usr/local/bin/

验证是否安装成功

$ consul

  1. - 快速启动
  2. - 这是最简单快速的启动方式,在启动 consu l时直接启动 webui 界面,跟上 -ui 参数参考以下示例,端口默认为8500,如果使用阿里云请注意安全组是否开启。
  3. ```shell
  4. 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
      1. {
      2. "datacenter": "consul_cluster",
      3. "node_name": "consul_1",
      4. "server": true,
      5. "bootstrap_expect": 3,
      6. "data_dir": "/usr/src/consul/data",
      7. "log_level": "DEBUG",
      8. "enable_syslog": true,
      9. "enable_script_checks": true,
      10. "bind_addr": "192.168.6.128",
      11. "client_addr": "192.168.6.128",
      12. }

1.1.3 Server 端部署

  • 部署第一台 192.168.6.128

    • 注意:在第一台启动的时候加上 -ui,只初始化一次,在其它2个节点进行相同操作,但是配置文件中的 node_name、bind_addr、client_addr 要进行更改,每台机器保持唯一。
    • 命令 -config-file: 加载启动的配置文件
      1. $ sudo consul agent -ui -config-file=/usr/src/consul/consul_config.json
  • 部署第二台 192.168.6.129

    • 修改 /usr/src/consul/consul_config.json:

      1. {
      2. "datacenter": "consul_cluster",
      3. "node_name": "consul_2",
      4. "server": true,
      5. "bootstrap_expect": 3,
      6. "data_dir": "/usr/src/consul/data",
      7. "log_level": "DEBUG",
      8. "enable_syslog": true,
      9. "enable_script_checks": true,
      10. "bind_addr": "192.168.6.129",
      11. "client_addr": "192.168.6.129",
      12. }
    • 执行命令启动命令

      1. $ sudo consul agent -config-file=/usr/src/consul/consul_config.json
  • 部署第三台 192.168.6.130

    • 修改 /usr/src/consul/consul_config.json:

      1. {
      2. "datacenter": "consul_cluster",
      3. "node_name": "consul_3",
      4. "server": true,
      5. "bootstrap_expect": 3,
      6. "data_dir": "/usr/src/consul/data",
      7. "log_level": "DEBUG",
      8. "enable_syslog": true,
      9. "enable_script_checks": true,
      10. "bind_addr": "192.168.6.130",
      11. "client_addr": "192.168.6.130"
      12. }
    • 执行命令启动命令

      1. $ sudo consul agent -config-file=/usr/src/consul/consul_config.json

:::info 截止目前服务端已经全部启动,但是还没有加入集群,因此还只是单节点的集群,可以在某台机器上查看成员情况:
注意:直接使用consul members会报错 :::

  1. $ consul members --http-addr 192.168.6.128:8500
  2. Node Address Status Type Build Protocol DC Segment
  3. 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 中

    1. $ consul join --http-addr 192.168.6.129:8500 192.168.6.128
    2. Successfully joined cluster by contacting 1 nodes. # 成功返回的消息
  • 第三台 192.168.6.130 加入到 consul_1 中

    1. $ consul join --http-addr 192.168.6.130:8500 192.168.6.128

目前服务端的集群已经创建完毕,可以看下我们目前的集群成员情况:

  1. $ consul members --http-addr 192.168.6.128:8500
  2. Node Address Status Type Build Protocol DC Segment
  3. consul_1 192.168.6.128:8301 alive server 1.4.0 2 consul_cluster <all>
  4. consul_2 192.168.6.129:8301 alive server 1.4.0 2 consul_cluster <all>
  5. 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”

  1. - 通过 HTTP API 的方式查看集群成员
  2. ```shell
  3. $ curl 192.168.6.128:8500/v1/status/peers
  4. ["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 如下所示:

    1. {
    2. "datacenter": "consul_cluster",
    3. "node_name": "consul_4",
    4. //"server": true, 不指定为服务端,默认走客户端
    5. // "bootstrap_expect": 3, 只在server模式有效
    6. "data_dir": "/usr/src/consul/data",
    7. "log_level": "DEBUG",
    8. "enable_syslog": true,
    9. "enable_script_checks": true,
    10. "bind_addr": "192.168.6.131",
    11. "client_addr": "192.168.6.131"
    12. }
  • 执行启动命令:

    • 通过 -join 参数也可以加入一个已经启动的集群
      1. $ sudo consul agent -config-file=/usr/src/consul/consul_config.json -join=192.168.6.128

在查看当前集群成员,可以看到为3个 Server 模式和1个 Client 模式

  1. $ consul members --http-addr 192.168.6.128:8500
  2. Node Address Status Type Build Protocol DC Segment
  3. consul_1 192.168.6.128:8301 alive server 1.4.0 2 consul_cluster <all>
  4. consul_2 192.168.6.129:8301 alive server 1.4.0 2 consul_cluster <all>
  5. consul_3 192.168.6.130:8301 alive server 1.4.0 2 consul_cluster <all>
  6. 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 的升级过程中我们也可以这样来做,这会让该节点主动退出集群并结束进程。

  1. $ consul leave --http-addr 192.168.6.130:8500
  2. $ consul members --http-addr 192.168.6.128:8500
  3. Node Address Status Type Build Protocol DC Segment
  4. consul_1 192.168.6.128:8301 alive server 1.4.0 2 consul_cluster <all>
  5. consul_2 192.168.6.129:8301 alive server 1.4.0 2 consul_cluster <all>
  6. 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 进行访问
微服务注册发现:Consul 部署和使用 - 图1

1.2 Docker 部署

  • 拉取镜像

    1. $ 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. - 1个启动容器的 IP 一般是172.17.0.2,后边启动的几个容器 IP 会排着来:172.17.0.3172.17.0.4172.17.0.5
  2. - 这些 Consul 节点在 Docker 的容器内是互通的,他们通过桥接的模式通信。但是如果主机要访问容器内的网络,需要做端口映射。在启动第一个容器时,将 Consul 8500 端口映射到了主机的 8500 端口,这样就可以方便的通过主机的浏览器查看集群信息。
  3. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1471554/1617971674385-6dc6dbf9-f895-4481-a739-4bcceeeda2ef.png#align=left&display=inline&height=539&margin=%5Bobject%20Object%5D&name=image.png&originHeight=539&originWidth=943&size=54882&status=done&style=shadow&width=943)
  4. - 用配置文件的方式来注册服务
  5. ```json
  6. # 编写service.json
  7. {
  8. "services": [
  9. {
  10. "id": "hello1",
  11. "name": "hello",
  12. "tags": [
  13. "primary"
  14. ],
  15. "address": "172.17.0.5",
  16. "port": 5000,
  17. "checks": [
  18. {
  19. "http": "http://localhost:5000/",
  20. "tls_skip_verify": false,
  21. "method": "Get",
  22. "interval": "10s",
  23. "timeout": "1s"
  24. }
  25. ]
  26. }
  27. ]
  28. }
  1. # 将json文件拷贝进容器内
  2. $ docker cp myservice.json consul1:/consul/config
  3. # 重载配置文件
  4. $ docker exec consul1 consul reload
  • 此时已经有了服务,只是服务不可用,consul发送给服务的请求不可达

微服务注册发现:Consul 部署和使用 - 图2

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 8500/TCP,8400/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP 3m4s consul-ui NodePort 10.107.180.193 8500:30082/TCP 3m4s

==> 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:

  1. Watch all cluster members come up. $ kubectl get pods —namespace=default -w
  2. Test cluster health using Helm test. $ helm test consul
  3. (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 8500/TCP,8400/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP 5m23s consul-ui NodePort 10.107.180.193 8500:30082/TCP 5m23s

查看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 consul-1 10.244.2.193:8301 alive server 1.5.3 2 dc1 consul-2 10.244.1.68:8301 alive server 1.5.3 2 dc1

  1. - 网页进行查看
  2. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1471554/1617978721518-516fda6f-85b5-4087-af4c-1171e61ed997.png#align=left&display=inline&height=551&margin=%5Bobject%20Object%5D&name=image.png&originHeight=551&originWidth=1626&size=85081&status=done&style=shadow&width=1626)
  3. <a name="Rb1cg"></a>
  4. # 2. 基本使用
  5. <a name="l9EUn"></a>
  6. ## 2.1 Consul Agent
  7. 执行` consul agent -dev `,启动开发模式,这个模式会快速启动一个单节点的 Consul。注意,这个模式不能数据持久化,因此,不能用于生产环境。
  8. <a name="dWHbr"></a>
  9. ### 启动命令简介:
  10. - `-server`:定义 agent 运行在 server 模式,每个数据中心的 Server 建议在35个避免失败情况下数据的丢失
  11. - `-client`:定义 agent 运行在 client 模式
  12. - `bootstrap-expect`server 模式下,集群要求的最低数量,当低于这个数量,集群失效
  13. - `-bootstrap-expect`:在一个 datacenter 中期望提供的 server 节点数目,当该值提供的时候,consul 一直等到达到指定 sever 数目的时候才会引导整个集群
  14. - `-bind`:节点的 ip 地址一般是`0.0.0.0`或云服务内网地址,用于被集群中的其他节点所访问
  15. - `-node`:指定节点在集群中的唯一名称,默认为机器的 hostname
  16. - `-config-dir`:配置文件目录,里面所有以 .json 结尾的文件都会被加载
  17. - `data-dir`data 存放的目录,consul 数据同步机制
  18. - 更多可选参数参考 [Consul Command-line Options](https://www.consul.io/docs/agent/options.html)
  19. <a name="09465f40"></a>
  20. ### Start Agent
  21. ```shell
  22. $ consul agent -dev
  23. ==> Starting Consul agent...
  24. ==> Consul agent running!
  25. Version: 'v1.4.0'
  26. Node ID: '9e05f4d6-56c1-e57c-c726-15d9ab1c0dd5'
  27. Node name: 'iZbp1isjfk2rw8fpnxx8wgZ'
  28. Datacenter: 'dc1' (Segment: '<all>')
  29. Server: true (Bootstrap: false)
  30. Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
  31. Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
  32. Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
  33. ==> 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)
    1. $ docker exec -it consul1 sh
    2. / # consul members
    3. Node Address Status Type Build Protocol DC Segment
    4. 3fa3be87462f 172.17.0.2:8301 alive server 1.9.4 2 dc1 <all>
    5. 59eaa5a2aaa4 172.17.0.4:8301 alive server 1.9.4 2 dc1 <all>
    6. 73a1505a20bb 172.17.0.3:8301 alive server 1.9.4 2 dc1 <all>
    7. 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+Ckill -INT consul_pid
    • forcefully 方式停止,则立即停止 Agent 进程,kill -KILL consul_pid

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;

  1. // 测试健康检查
  2. if (url === '/health') {
  3. res.end('OK!');
  4. }

}).listen(3000); console.log(‘Server running at http://192.168.12.1:3000/‘);

  1. - 为测试服务创建 Service Definiton
  2. ```shell
  3. $ sudo mkdir /etc/consul.d/test.json
  1. {
  2. "service":{
  3. "name": "test",
  4. "tags": [
  5. "",
  6. ""
  7. ],
  8. "address": "192.168.12.1",
  9. "port": 3000,
  10. "enable_tag_override": false,
  11. "check": {
  12. "deregisterCriticalServiceAfter": "90m",
  13. "http": "http://192.168.12.1:3000/health",
  14. "interval": "10s"
  15. }
  16. }
  17. }

服务定义配置文件含义:

  • 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

  1. - Test 服务注册成功
  2. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1471554/1618213914027-5f290779-cc40-4e84-ba43-a570aa662d86.png#align=left&display=inline&height=382&margin=%5Bobject%20Object%5D&name=image.png&originHeight=509&originWidth=912&size=32563&status=done&style=shadow&width=684)
  3. <a name="FzmEt"></a>
  4. ### 使用 HTTP API 服务注册
  5. 调用 `/v1/agent/service/register `接口进行注册,请求 Method **PUT** 方式
  6. - 请求 Body 值为服务定义中的 service 值,看一下示例:
  7. ```shell
  8. # 物理机部署环境下
  9. $ curl -X PUT \
  10. http://[server_ip]:8301/v1/agent/service/register \
  11. -H 'cache-control: no-cache' \
  12. -H 'content-type: application/json' \
  13. -H 'postman-token: 6b672c02-350f-3d1c-7793-1a0d9e800fc9' \
  14. -d '{
  15. "id": "test",
  16. "name":"test",
  17. "tags":[
  18. "",
  19. ""
  20. ],
  21. "address":"192.168.12.1",
  22. "port":3000,
  23. "check":{
  24. "deregisterCriticalServiceAfter":"90m",
  25. "http":"http://192.168.12.1:3000/health",
  26. "interval":"10s"
  27. }
  28. }'

2.3 服务发现

Consul 服务发现支持 HTTP API 和 DNS 两种方式:

HTTP API

  1. # 物理机部署环境下
  2. $ curl http://192.168.6.128:8500/v1/catalog/service/test?passing=true

执行命令之后返回 Consul 的注册信息、服务信息及健康检查信息,且指定 passing=true,表示返回时过滤掉一些不健康的节点。

  1. [
  2. {
  3. "ID": "c412d602-38ac-93fe-930c-284b8e460156",
  4. "Node": "3fa3be87462f",
  5. "Address": "172.17.0.2",
  6. "Datacenter": "dc1",
  7. "TaggedAddresses": {
  8. "lan": "172.17.0.2",
  9. "lan_ipv4": "172.17.0.2",
  10. "wan": "172.17.0.2",
  11. "wan_ipv4": "172.17.0.2"
  12. },
  13. "NodeMeta": {
  14. "consul-network-segment": ""
  15. },
  16. "ServiceKind": "",
  17. "ServiceID": "test",
  18. "ServiceName": "test",
  19. "ServiceTags": [
  20. "",
  21. ""
  22. ],
  23. "ServiceAddress": "192.168.12.1",
  24. "ServiceTaggedAddresses": {
  25. "lan_ipv4": {
  26. "Address": "192.168.12.1",
  27. "Port": 3000
  28. },
  29. "wan_ipv4": {
  30. "Address": "192.168.12.1",
  31. "Port": 3000
  32. }
  33. },
  34. "ServiceWeights": {
  35. "Passing": 1,
  36. "Warning": 1
  37. },
  38. "ServiceMeta": {
  39. },
  40. "ServicePort": 3000,
  41. "ServiceEnableTagOverride": false,
  42. "ServiceProxy": {
  43. "MeshGateway": {
  44. },
  45. "Expose": {
  46. }
  47. },
  48. "ServiceConnect": {
  49. },
  50. "CreateIndex": 3447,
  51. "ModifyIndex": 3447
  52. }
  53. ]

DNS 方式

现在使用第二种 DNS 方式查询具体的服务,Consul 提供了默认的名字 NAME.service.consul,NAME 代指注册的服务名称。

对于上面注册的 Web 服务对应域名分别为 test.service.consul,下面先对于 test.service.consul 进行服务查询:

  1. # 物理机部署环境
  2. $ dig @192.168.6.128 -p 8600 order_service.service.consul
  3. # 如果是容器部署环境下,需要在部署的时候暴露端口 [docker run -p 8600:8600 ...]

为了展示更详细的信息,在 dig 命令中我们可以加上 SRV 参数,可以返回服务所在的节点信息、端口号。

  1. $ 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 形式导出到指定文件。

  1. # 物理机环境下
  2. $ 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:

  1. $ cat consul_kv_20210412162039.json
  1. [
  2. {
  3. "key": "test",
  4. "flags": 0,
  5. "value": "ewoJIm5hbWUiOiAidG9tIiwKICAiYWdlIjogMTgKfQ=="
  6. }
  7. ]

键值对 value 的值为 base64 编码,base64 -d 命令可看到原始的 value 值:

  1. $ echo "ewoJIm5hbWUiOiAidG9tIiwKICAiYWdlIjogMTgKfQ==" | base64 -d
  2. {
  3. "name": "tom",
  4. "age": 18
  5. }

2.4.2 KV 导入

consul kv import 命令用于导入 consul kv export 命令导出的 JSON 文件,使用很简单,如下所示:

  1. # 物理机环境下
  2. $ 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 及更高版本中可用。

  • 保存

    1. $ consul snapshot save --http-addr=http://192.168.6.128:8500 backup_$(date +%Y%m%d%H%M%S).snap
  • 检查

    1. $ consul snapshot inspect backup_20210412162039.snap
  • 恢复

    1. $ consul snapshot restore --http-addr=http://192.168.6.128:8500 backup_20210412162039.snap
  • 开始保存快照守护进程

    • 运行保存快照的守护进程,定期保存 Consul 服务器状态的快照
      1. $ consul snapshot agent --http-addr=http://192.168.6.128:8500

2.5 ACL

Consul使用访问控制列表(ACL)来保护对 UI,API,CLI,服务通信和代理通信的访问。

  • 在 Agents 上开启 ACL
    • 将以下 json 配置添加到 Consul Agent 的配置文件中,然后重启 Consul 服务
    • enabled:是否启用 ACL
    • default_policy:默认值是 allow,即能够执行任何操作,设置为 deny 默认 API 写行为都会被阻止
    • down_policy:中断期间将忽略令牌 TTL ```json

      agent.hcl

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