注冊中心是服務要實現服務化管理的核心組件,類似于目錄服務的作用,也是微服務架構中最基礎的設施之一,主要用來存儲服務信息,譬如服務提供者 URL 、路由信息等。注冊中心的實現是通過一種映射的方式,將復雜的服務端信息映射為簡單易懂的信息提供給客戶端。

注冊中心的核心功能為以下三點:

注冊中心本質上是為了解耦服務提供者和服務消費者,在微服務體系中,各個業務服務之間會頻繁互相調用,并且需要對各個服務的 IP、port 等路由信息進行統一的管理。但是要如何進行管理呢?我們可以通過注冊中心的服務注冊功能將已有服務的相關信息提供到統一的注冊中心進行管理。

通過上述描述,您可以了解到注冊中心可以幫助用戶通過映射快速找到服務和服務地址。隨著業務更新迭代,服務會頻繁發生變化,在服務端中注冊了新的服務或者服務宕機后,客戶端仍然可以通過注冊中心的服務發現功能拉取服務列表,如果注冊中心的服務節點發生變更,注冊中心會發送請求通知客戶端重新拉取。

如果服務端的服務突然宕機,并且沒有向注冊中心反饋,客戶端可以通過注冊中心的健康檢查功能,進行固定時間間隔的主動上報心跳方式向服務端表明自己的服務狀態。如果服務狀態異常,則會通知注冊中心,注冊中心可以及時把已經宕機的服務節點進行剔除,避免資源的浪費。

Apache APISIX + Nacos 可以將各個微服務節點中與業務無關的各項控制,集中在 Apache APISIX 中進行統一管理,即通過 Apache APISIX 實現接口服務的代理和路由轉發的能力。在 Nacos 上注冊各個微服務后,Apache APISIX 可以通過 Nacos 的服務發現功能獲取服務列表,查找對應的服務地址從而實現動態代理。

API 網關基于 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);
  1. 在命令行中通過請求 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'
  1. 執行服務注冊后使用以下命令查詢當前服務情況。
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 中傳遞其他服務相關參數用于指定服務所在的命名空間或組別,具體內容可參考官方文檔。

步驟三:驗證配置結果

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

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 插件的更多說明和完整配置信息,可參考 Apache APISIX 官方文檔。

文章來源:Nacos’ Service Discovery Practice in API Gateway

上一篇:

深入解析 GraphQL:APISIX 如何優化 API 管理與路由

下一篇:

掌握 API 生命周期:基本階段和行之有效的成功策略
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費