APISIX

1、概述

APISIX 是基于 OpenResty + etcd 实现的云原生、高性能、可扩展的微服务 API 网关。它是国人开源,目前已经进入 Apache 进行孵化。

  • OpenResty:通过 Lua 扩展 Nginx 实现的可伸缩的 Web 平台。
  • etcd:Key/Value 存储系统。

Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX 不仅拥有众多实用的插件,而且支持插件动态变更和热插拔。APISIX 通过插件机制,提供了动态负载平衡、身份验证、限流限速等等功能,当然我们也可以自己开发插件进行拓展。
https://nacos.io/zh-cn/blog/apisix.html

2、应用场景

Apache APISIX + Nacos 可以将各个微服务节点中与业务无关的各项控制,集中在 Apache APISIX 中进行统一管理,即通过 Apache APISIX 实现接口服务的代理和路由转发的能力。各个微服务在 Nacos 上注册后,Apache APISIX 可以通过 Nacos 的服务发现功能获取服务列表,查找对应的服务地址从而实现动态代理。
image.png

3、服务发现

Apache APISIX 基于 Nacos 实现服务返现

前提条件

本文操作基于以下环境进行。

步骤一:服务注册

1、使用 Node.js 的 Koa 框架在 3005 端口启动一个简单的测试服务作为上游(Upstream)

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3005);

2、在命令行中通过请求 Nacos Open API 的方式进行服务注册。
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=APISIX-NACOS&ip=127.0.0.1&port=3005&ephemeral=false'
3、执行服务注册后使用以下命令查询当前服务情况。
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=APISIX-NACOS'
正确返回结果示例如下:

{
  "name": "DEFAULT_GROUP@@APISIX-NACOS",
  "groupName": "DEFAULT_GROUP",
  "clusters": "",
  "cacheMillis": 10000,
  "hosts": [
    {
      "instanceId": "127.0.0.1#3005#DEFAULT#DEFAULT_GROUP@@APISIX-NACOS",
      "ip": "127.0.0.1",
      "port": 3005,
      "weight": 1.0,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@APISIX-NACOS",
      "metadata": {},
      "instanceHeartBeatInterval": 5000,
      "instanceHeartBeatTimeOut": 15000,
      "ipDeleteTimeout": 30000,
      "instanceIdGenerator": "simple"
    }
  ],
  "lastRefTime": 1643191399694,
  "checksum": "",
  "allIPs": false,
  "reachProtectionThreshold": false,
  "valid": true
}

步骤二:新增 Nacos 路由

使用 Apache APISIX 提供的 Admin API 创建一个新的路由(Route),APISIX 通过 upstream.discovery_type 字段选择使用的服务发现类型,upstream.service_name 需要与注册中心的对应服务名进行关联,因此创建路由时指定服务发现类型为 nacos 。

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
    "uri": "/nacos/*",
    "upstream": {
        "service_name": "APISIX-NACOS",
        "type": "roundrobin",
        "discovery_type": "nacos"
    }
}'

在上述命令中,请求头 X-API-KEY 是 Admin API 的访问 token,可以在 conf/config.yaml 文件中的 apisix.admin_key.key 查看。
添加成功后,正确返回结果示例如下:

{
  "action": "set",
  "node": {
    "key": "\/apisix\/routes\/1",
    "value": {
      "update_time": 1643191044,
      "create_time": 1643176603,
      "priority": 0,
      "uri": "\/nacos\/*",
      "upstream": {
        "hash_on": "vars",
        "discovery_type": "nacos",
        "scheme": "http",
        "pass_host": "pass",
        "type": "roundrobin",
        "service_name": "APISIX-NACOS"
      },
      "id": "1",
      "status": 1
    }
  }
}

除此之外,您还可以在 upstream.discovery_args 中传递其他服务相关参数用于指定服务所在的命名空间或组别,具体内容可参考下表:

名字 类型 可选项 默认值 有效值 说明
namespace_id string 可选 public 服务所在的命名空间
group_name string 可选 DEFAULT_GROUP 服务所在的组

步骤三:验证配置结果

使用以下命令发送请求至需要配置的路由。
curl -i http://127.0.0.1:9080/nacos/
正常返回结果示例如下:

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Connection: keep-alive
Date: Thu, 27 Jan 2022 00:48:26 GMT
Server: APISIX/2.12.0

Hello World

通过示例看到,Apache APISIX 中新增的路由已经可以通过 Nacos 服务发现找到正确的服务地址,并正常响应。

总结

本文为大家介绍了注册中心的概念以及 Apache APISIX 如何配合 Nacos 实现基于服务发现的路由代理。实际场景中如何进行 Apache APISIX 与 Nacos 的配合使用,您需要看具体的业务需求和过往技术架构。关于 nacos 插件的更多说明和完整配置信息,可参考官网文档:nacos

https://alicharles.oss-cn-hangzhou.aliyuncs.com/static/images/mp_qrcode.jpg
文章目录
  1. 1、概述
  2. 2、应用场景
  3. 3、服务发现
    1. 前提条件
    2. 步骤一:服务注册
    3. 步骤二:新增 Nacos 路由
    4. 步骤三:验证配置结果
  4. 总结