vlambda博客
学习文章列表

Nacos 在 Apache APISIX API 网关中的服务发现实践


Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。它不仅拥有众多实用的插件,而且支持插件动态变更和热插拔。同时在使用服务发现组件时,不仅可以利用 etcd,也可以将 Eureka、Consul 和 Nacos 作为服务发现组件。 本文将详细为您介绍如何在 Apache APISIX 中配置 Nacos 作为 Apache APISIX API 网关中的服务发现组件。




注册中心


 什么是注册中心


服务注册中心是服务要实现服务化管理的核心组件,类似于目录服务的作用,也是微服务架构中最基础的设施之一,主要用来存储服务信息,譬如服务提供者 URL 、路由信息等。注册中心的实现是通过一种映射的方式,将复杂的服务端信息映射为简单易懂的信息提供给客户端。

注册中心的核心功能为以下三点:

  • 服务注册:服务提供方向注册中心进行注册。

  • 服务发现:服务消费方可以通过注册中心寻找到服务提供方的调用路由信息。

  • 健康检测:确保注册到注册中心的服务节点是可以被正常调用的,避免无效节点导致的调用资源浪费等问题。


为什么需要注册中心?


注册中心本质上是为了解耦服务提供者和服务消费者,在微服务体系中,各个业务服务之间会频繁互相调用,并且需要对各个服务的 IP、port 等路由信息进行统一的管理。但是要如何进行管理呢?您可以通过注册中心的服务注册功能将已有服务的相关信息提供到统一的注册中心进行管理。

如果服务端的服务突然宕机,并且没有向注册中心反馈,客户端可以通过注册中心的健康检查功能,进行固定时间间隔的主动上报心跳方式向服务端表明自己的服务状态。如果服务状态异常,则会通知注册中心,注册中心可以及时把已经宕机的服务节点进行剔除,避免资源的浪费。


Apache APISIX + Nacos 

为用户提供了什么应用场景?



Nacos 在 Apache APISIX API 网关中的服务发现实践



Apache APISIX 基于 Nacos 实现服务发现


 前提条件


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

  • 操作系统 Centos 7.9。

  • 安装 Apache APISIX 2.12.1,详情请参考:Apache APISIX how-to-bulid[1]

  • 安装 Nacos 2.0.4,详情请参考:quick start[2]

  • 安装 Node.js 10.15.0,详情请参考:node.js Installation[3]


步骤一:服务注册


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",     ...... # 为了方便查看,部分返回结果省略。      "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": { ...... # 为了方便查看,部分返回结果省略。 "upstream": { "hash_on": "vars", "discovery_type": "nacos", .... # 为了方便查看,部分返回结果省略。 "service_name": "APISIX-NACOS" }, "id": "1", "status": 1 } }}


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


Nacos 在 Apache APISIX API 网关中的服务发现实践


步骤三:验证配置结果


使用以下命令发送请求至需要配置的路由。


curl -i http://127.0.0.1:9080/nacos/


正常返回结果示例如下:


HTTP/1.1 200 OK...... # 为了方便查看,部分返回结果省略。Server: APISIX/2.12.1Hello World




总结


本文为大家介绍了注册中心的概念以及 Apache APISIX 如何配合 Nacos 实现基于服务发现的路由代理。用户可以根据自身的业务需求和过往技术架构使用 Apache APISIX 与 Nacos,以实现接口服务的代理和路由转发的能力。关于 nacos 插件的更多说明和完整配置信息,可参考 Apache APISIX 官方文档[4]

Apache APISIX 项目目前正在开发其他插件以支持集成更多服务,如果您对此有兴趣,您可以通过GitHub Discussions 发起讨论,或通过邮件列表进行交流。


[1]:https://apisix.apache.org/zh/docs/apisix/how-to-build

[2]:https://nacos.io/zh-cn/docs/quick-start.html

[3]:https://github.com/nodejs/help/wiki/Installation

[4]:https://apisix.apache.org/zh/docs/apisix/discovery/nacos


活动预告


各位社区小伙伴呼声最高的「Apache APISIX 大咖面对面」年后第一趴来啦~


Nacos 在 Apache APISIX API 网关中的服务发现实践


直播预约


3 月 6 日 13:30 锁定「Apache APISIX 视频号」,与各位大咖面对面唠嗑~

APISIX
将在03月06日 13:30 直播
大咖面对面第三期《聊聊热点:开源项目如何助力企业数字化转型?》


入群交流



扫描下方二维码添加小助手,备注【直播】,加入 Apache APISIX 线上直播交流群,了解更多社区动态!