关于consul:Apache-APISIX-集成-Consul-KV服务发现能力再升级

32次阅读

共计 3872 个字符,预计需要花费 10 分钟才能阅读完成。

背景信息

Consul 是一个服务网格解决方案,其外围之一的 Consul KV 是一个分布式键值数据库,主要用途是存储配置参数和元数据,同时也容许用户存储索引对象。

在微服务架构模式下,当扩容、硬件故障等导致上游服务产生变动的状况呈现时,通过手动撰写配置,保护上游服务信息的形式,会导致保护老本陡增。对此,Apache APISIX 提供了服务发现注册核心的性能,实现动静获取最新的服务实例信息,以升高用户的保护老本。

目前,Apache APISIX 借由社区奉献的 consul_kv 模块,反对了基于 Consul KV 的服务发现注册核心。

插件工作原理

Apache APISIX 利用 Consul KV 分布式键值存储能力的 consul_kv 模块,解耦了服务的提供者和消费者,实现了服务发现注册核心的两大外围性能。

  1. 服务注册:服务提供者向注册核心注册服务。
  2. 服务发现:服务消费者通过注册核心查找服务提供者的路由信息。

在此基础上构建的 Apache APISIX 将更灵便地适应现有的微服务架构,更好地满足用户需要。

如何应用

本文中的测试环境均应用 docker-compose 在 Docker 中搭建。

  1. 下载 Apache APISIX。
# 拉取 apisix-docker 的 Git 仓库
git clone https://github.com/apache/apisix-docker.git 
  1. 创立 Consul 文件夹和配置文件。
# 创立 consul 文件夹
mkdir -p ~/docker-things/consul/ && cd "$_" 
# 创立配置文件
touch docker-compose.yml server1.json
  1. 批改 docker-compose.yml 文件。
version: '3.8'

services:
  consul-server1:
    image: consul:1.9.3
    container_name: consul-server1
    restart: always
    volumes:
      - ./server1.json:/consul/config/server1.json:ro
    networks:
      - apisix
    ports:
      - '8500:8500'
    command: 'agent -bootstrap-expect=1'

networks:
  apisix:
    external: true
    name: example_apisix
  1. 批改 server1.json 文件。
{
  "node_name": "consul-server1",
  "server": true,
  "addresses": {"http": "0.0.0.0"}
}
  1. 在 Apache APISIX 中的配置文件 apisix_conf/config.yaml 增加 Consul 的相干配置信息。
# config.yml
# ...other config
discovery:
  consul_kv:
    servers:
      - "http://consul-server1:8500"
    prefix: "upstreams"
  1. 启动 Apache APISIX 和 Consul。
# 进入 example、consul 文件夹,顺次启动 APISIX、Consul
docker-compose up -d
  1. 将测试服务注册到 Consul。example 蕴含了两个 Web 服务,你能够间接应用这两个服务进行测试。
# 查看 example 的 docker-compose.yml 就能够看到两个 Web 服务
$ cat docker-compose.yml | grep web
# 输入
web1:
  - ./upstream/web1.conf:/etc/nginx/nginx.conf
web2:
  - ./upstream/web2.conf:/etc/nginx/nginx.conf
  1. 确认 Web 服务的 IP 地址。
$ sudo docker inspect -f='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(sudo docker ps -aq) | grep web
# 输入
/example-web1-1 - 172.26.0.7
/example-web2-1 - 172.26.0.2
  1. 在终端中对 Consul 的 HTTP API 进行申请以注册测试服务。
# 应用对应的 IP 进行注册
curl \
  -X PUT \
  -d '{"weight": 1,"max_fails": 2,"fail_timeout": 1}' \
  http://127.0.0.1:8500/v1/kv/upstreams/webpages/172.26.0.7:80
  
curl \
  -X PUT \
  -d '{"weight": 1,"max_fails": 2,"fail_timeout": 1}' \
  http://127.0.0.1:8500/v1/kv/upstreams/webpages/172.26.0.2:80

其中,/v1/kv/ 后的门路依照 {Prefix}/{Service Name}/{IP}:{Port} 的格局形成。

{Prefix} 是在 APISIX 中配置 Consul 时写入的 prefix{Service Name}{IP}:{Port} 则须要依据上游服务,由用户自行确定。

而数据的格局则为 {"weight": <Num>, "max_fails": <Num>, "fail_timeout": <Num>}

  1. 查看测试服务是否注册胜利。
$ curl "http://127.0.0.1:8500/v1/kv/upstreams/webpages?keys"

返回音讯如下则示意注册胜利。

# 注册胜利的输入
["upstreams/webpages/172.26.0.2:80","upstreams/webpages/172.26.0.7:80"]% 

创立路由并为其启用 Consul

应用 Apache APISIX 提供的 Admin API 将 Consul 增加到路由中。

在增加之前须要先确定 X-API-KEYupstream.service_name 两个数据。

  • X-API-KEY:Admin API 的拜访 Token,在此示例中,咱们应用默认的 edd1c9f034335f136f87ad84b625c8f1 即可。
  • upstream.service_name:上游服务的名称,它指定了将与某个路由绑定的某个注册核心中的服务(Service),应用 Consul 时须要设置为注册测试服务时的 URL,并去掉最初的 {IP}:{Port} 局部。咱们也能够通过 Apache APISIX 提供的 Memory Dump API 获取服务的 URL,同时确认是否能失常发现上游服务。
$ curl http://127.0.0.1:9092/v1/discovery/consul_kv/dump | jq
# 输入
{
  "services": {
    # 这个 key 就是须要的 URL
    "http://consul-server1:8500/v1/kv/upstreams/webpages/": [
      {
        "port": 80,
        "host": "172.26.0.7",
        "weight": 1
      },
      {
        "port": 80,
        "host": "172.26.0.2",
        "weight": 1
      }
    ]
  },
  "config": {# ...configs}
}

增加路由

这里将 URL 为 /consul/* 的申请路由调配到 http://consul-server1:8500/v1/kv/upstreams/webpages/。同时,discovery_type 必须设置为 consul_kv 以启动对应模块。

curl http://127.0.0.1:9080/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X POST -d '{"uri":"/consul/*","upstream": {"service_name":"http://consul-server1:8500/v1/kv/upstreams/webpages/","type":"roundrobin","discovery_type":"consul_kv"}
}'

测试配置后果

通过申请后果能够看到,Apache APISIX 中新增的路由曾经能够通过 Consul 找到正确的服务地址,并依据负载平衡策略申请到两个节点上。

# 第一次申请
curl -s http://127.0.0.1:9080/consul/
# 输入
hello web1%

# 第二次申请
curl -s http://127.0.0.1:9080/consul/
# 输入
hello web2%

# 留神:也有可能两次申请获取的都是 web1 或者 web2。#      这是由负载平衡的个性造成的,您能够尝试进行更屡次申请。#      如果对负载平衡感兴趣能够在 https://en.wikipedia.org/wiki/Load_balancing_(computing) 
#      中理解更多。

总结

本文的前半部分介绍了 Apache APISIX 如何配合 Consul 实现基于 Consul KV 的服务发现注册核心,解决服务信息管理保护的问题。

而在后半局部则着重介绍了如何在 Docker 中搭配 Consul 应用 Apache APISIX 的操作流程。当然,在理论场景中的利用,还须要各位读者依据业务应用场景和已有的零碎架构具体分析。

对于在 Apache APISIX 中应用 Consul 注册核心的更多阐明,能够在官网文档中找到。如有其余疑难,能够在 Discussions 中发动探讨,或通过邮件列表进行交换。

正文完
 0