You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by sp...@apache.org on 2021/05/27 12:08:21 UTC
[apisix] branch master updated: feat: nacos discovery support
namespace (#4313)
This is an automated email from the ASF dual-hosted git repository.
spacewander pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push:
new 0746f81 feat: nacos discovery support namespace (#4313)
0746f81 is described below
commit 0746f81ea339662954ab2a051b49ea74d4f15800
Author: Demogorgon314 <wa...@gmail.com>
AuthorDate: Thu May 27 20:08:12 2021 +0800
feat: nacos discovery support namespace (#4313)
---
apisix/discovery/nacos.lua | 30 +++++--
apisix/schema_def.lua | 9 ++
ci/install-ext-services-via-docker.sh | 22 ++++-
docs/en/latest/discovery/nacos.md | 51 ++++++++++-
t/discovery/nacos.t | 154 ++++++++++++++++++++++++++++++++++
5 files changed, 256 insertions(+), 10 deletions(-)
diff --git a/apisix/discovery/nacos.lua b/apisix/discovery/nacos.lua
index cbb0bb6..4ac4378 100644
--- a/apisix/discovery/nacos.lua
+++ b/apisix/discovery/nacos.lua
@@ -157,6 +157,14 @@ local function get_token_param(base_uri, username, password)
return '&accessToken=' .. data.accessToken
end
+local function get_namespace_param(namespace_id)
+ local param = ''
+ if namespace_id then
+ local args = {namespaceId = namespace_id}
+ param = '&' .. ngx.encode_args(args)
+ end
+ return param
+end
local function get_base_uri()
local host = local_conf.discovery.nacos.host
@@ -207,8 +215,16 @@ local function iter_and_add_service(services, values)
up = conf
end
+ local namespace_id
+ if up.discovery_args then
+ namespace_id = up.discovery_args.namespace_id
+ end
+
if up.discovery_type == 'nacos' then
- core.table.insert(services, up.service_name)
+ core.table.insert(services, {
+ service_name = up.service_name,
+ namespace_id = namespace_id
+ })
end
::CONTINUE::
end
@@ -222,7 +238,6 @@ local function get_nacos_services()
local get_upstreams = require('apisix.upstream').upstreams
local get_routes = require('apisix.router').http_routes
local get_services = require('apisix.http.service').services
-
local values = get_upstreams()
iter_and_add_service(services, values)
values = get_routes()
@@ -254,10 +269,11 @@ local function fetch_full_registry(premature)
applications = up_apps
return
end
-
local data, err
- for _, service_name in ipairs(infos) do
- data, err = get_url(base_uri, instance_list_path .. service_name .. token_param)
+ for _, service_info in ipairs(infos) do
+ local namespace_param = get_namespace_param(service_info.namespace_id);
+ data, err = get_url(base_uri, instance_list_path .. service_info.service_name
+ .. token_param .. namespace_param)
if err then
log.error('get_url:', instance_list_path, ' err:', err)
if not applications then
@@ -267,10 +283,10 @@ local function fetch_full_registry(premature)
end
for _, host in ipairs(data.hosts) do
- local nodes = up_apps[service_name]
+ local nodes = up_apps[service_info.service_name]
if not nodes then
nodes = {}
- up_apps[service_name] = nodes
+ up_apps[service_info.service_name] = nodes
end
core.table.insert(nodes, {
host = host.ip,
diff --git a/apisix/schema_def.lua b/apisix/schema_def.lua
index a391e99..0fb7573 100644
--- a/apisix/schema_def.lua
+++ b/apisix/schema_def.lua
@@ -389,6 +389,15 @@ local upstream_schema = {
description = "discovery type",
type = "string",
},
+ discovery_args = {
+ type = "object",
+ properties = {
+ namespace_id = {
+ description = "namespace id",
+ type = "string",
+ },
+ }
+ },
pass_host = {
description = "mod of host passing",
type = "string",
diff --git a/ci/install-ext-services-via-docker.sh b/ci/install-ext-services-via-docker.sh
index 87d417a..8f2ff28 100755
--- a/ci/install-ext-services-via-docker.sh
+++ b/ci/install-ext-services-via-docker.sh
@@ -55,7 +55,14 @@ wget https://raw.githubusercontent.com/api7/nacos-test-service/main/spring-nacos
curl https://raw.githubusercontent.com/api7/nacos-test-service/main/Dockerfile | docker build -t nacos-test-service:1.0-SNAPSHOT -f - .
docker run -d --rm --network nacos_net --env SERVICE_NAME=APISIX-NACOS --env NACOS_ADDR=nacos2:8848 --env SUFFIX_NUM=1 -p 18001:18001 --name nacos-service1 nacos-test-service:1.0-SNAPSHOT
docker run -d --rm --network nacos_net --env SERVICE_NAME=APISIX-NACOS --env NACOS_ADDR=nacos2:8848 --env SUFFIX_NUM=2 -p 18002:18001 --name nacos-service2 nacos-test-service:1.0-SNAPSHOT
-url="127.0.0.1:18002/hello"
+# register nacos service with namespaceId=test_ns
+docker run -d --rm --network nacos_net --env SERVICE_NAME=APISIX-NACOS --env NACOS_ADDR=nacos2:8848 --env NAMESPACE=test_ns --env SUFFIX_NUM=1 -p 18003:18001 --name nacos-service3 nacos-test-service:1.0-SNAPSHOT
+# register nacos service with group=test_group
+docker run -d --rm --network nacos_net --env SERVICE_NAME=APISIX-NACOS --env NACOS_ADDR=nacos2:8848 --env GROUP=test_group --env SUFFIX_NUM=1 -p 18004:18001 --name nacos-service4 nacos-test-service:1.0-SNAPSHOT
+# register nacos service with namespaceId=test_ns and group=test_group
+docker run -d --rm --network nacos_net --env SERVICE_NAME=APISIX-NACOS --env NACOS_ADDR=nacos2:8848 --env NAMESPACE=test_ns --env GROUP=test_group --env SUFFIX_NUM=1 -p 18005:18001 --name nacos-service5 nacos-test-service:1.0-SNAPSHOT
+
+url="127.0.0.1:18005/hello"
until [[ "$(curl -s -o /dev/null -w ''%{http_code}'' $url)" == "200" ]]; do
echo 'wait nacos service...'
sleep 1;
@@ -64,4 +71,17 @@ until [[ $(curl -s "127.0.0.1:8858/nacos/v1/ns/service/list?pageNo=1&pageSize=2
echo 'wait nacos reg...'
sleep 1;
done
+until [[ $(curl -s "127.0.0.1:8858/nacos/v1/ns/service/list?groupName=test_group&pageNo=1&pageSize=2" | grep "APISIX-NACOS") ]]; do
+ echo 'wait nacos reg...'
+ sleep 1;
+done
+until [[ $(curl -s "127.0.0.1:8858/nacos/v1/ns/service/list?groupName=DEFAULT_GROUP&namespaceId=test_ns&pageNo=1&pageSize=2" | grep "APISIX-NACOS") ]]; do
+ echo 'wait nacos reg...'
+ sleep 1;
+done
+until [[ $(curl -s "127.0.0.1:8858/nacos/v1/ns/service/list?groupName=test_group&namespaceId=test_ns&pageNo=1&pageSize=2" | grep "APISIX-NACOS") ]]; do
+ echo 'wait nacos reg...'
+ sleep 1;
+done
+
cd ..
diff --git a/docs/en/latest/discovery/nacos.md b/docs/en/latest/discovery/nacos.md
index 5d5ea2b..68b4c0a 100644
--- a/docs/en/latest/discovery/nacos.md
+++ b/docs/en/latest/discovery/nacos.md
@@ -59,7 +59,7 @@ discovery:
### Upstream setting
-Here is an example of routing a request with a URL of "/nacos/*" to a service which named "http://192.168.33.1:8848/nacos/v1/ns/instance/list?serviceName=APISIX-NACOS" and use nacos discovery client in the registry :
+Here is an example of routing a request with a URL of "/nacos/*" to a service which named "http://192.168.33.1:8848/nacos/v1/ns/instance/list?serviceName=APISIX-NACOS" and use nacos discovery client in the registry:
```shell
$ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
@@ -73,7 +73,7 @@ $ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f
}'
```
-The format response as below:
+The formatted response as below:
```json
{
@@ -99,3 +99,50 @@ The format response as below:
"action": "set"
}
```
+
+Example of routing a request with a URL of "/nacosWithNamespaceId/*" to a service which name, namespaceId "http://192.168.33.1:8848/nacos/v1/ns/instance/list?serviceName=APISIX-NACOS&namespaceId=test_ns" and use nacos discovery client in the registry:
+
+```shell
+$ curl http://127.0.0.1:9080/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
+{
+ "uri": "/nacosWithNamespaceId/*",
+ "upstream": {
+ "service_name": "APISIX-NACOS",
+ "type": "roundrobin",
+ "discovery_type": "nacos",
+ "discovery_args": {
+ "namespace_id": "test_ns"
+ }
+ }
+}'
+```
+
+The formatted response as below:
+
+```json
+{
+ "node": {
+ "key": "\/apisix\/routes\/2",
+ "value": {
+ "id": "1",
+ "create_time": 1615796097,
+ "status": 1,
+ "update_time": 1615799165,
+ "upstream": {
+ "hash_on": "vars",
+ "pass_host": "pass",
+ "scheme": "http",
+ "service_name": "APISIX-NACOS",
+ "type": "roundrobin",
+ "discovery_type": "nacos",
+ "discovery_args": {
+ "namespace_id": "test_ns"
+ }
+ },
+ "priority": 0,
+ "uri": "\/nacosWithNamespaceId\/*"
+ }
+ },
+ "action": "set"
+}
+```
diff --git a/t/discovery/nacos.t b/t/discovery/nacos.t
index 60f60cb..4162517 100644
--- a/t/discovery/nacos.t
+++ b/t/discovery/nacos.t
@@ -251,3 +251,157 @@ discovery:
]
--- no_error_log
[error]
+
+
+
+=== TEST 8: get APISIX-NACOS info from NACOS - no auth with namespace
+--- yaml_config eval: $::yaml_config
+--- apisix_yaml
+routes:
+ -
+ uri: /hello
+ upstream:
+ service_name: APISIX-NACOS
+ discovery_type: nacos
+ type: roundrobin
+ discovery_args:
+ namespace_id: test_ns
+#END
+--- pipelined_requests eval
+[
+ "GET /hello",
+ "GET /hello",
+]
+--- response_body_like eval
+[
+ qr/server [1-2]/,
+ qr/server [1-2]/,
+]
+--- no_error_log
+[error]
+
+
+
+=== TEST 9: error namespace_id - no auth
+--- yaml_config eval: $::yaml_config
+--- apisix_yaml
+routes:
+ -
+ uri: /hello
+ upstream:
+ service_name: APISIX-NACOS-DEMO
+ discovery_type: nacos
+ type: roundrobin
+ discovery_args:
+ namespace_id: err_ns
+#END
+--- request
+GET /hello
+--- error_code: 503
+
+
+
+=== TEST 10: get APISIX-NACOS info from NACOS - configured in services with namespace
+--- yaml_config eval: $::yaml_config
+--- apisix_yaml
+routes:
+ -
+ uri: /hello
+ service_id: 1
+services:
+ -
+ id: 1
+ upstream:
+ service_name: APISIX-NACOS
+ discovery_type: nacos
+ type: roundrobin
+ discovery_args:
+ namespace_id: test_ns
+#END
+--- pipelined_requests eval
+[
+ "GET /hello",
+ "GET /hello",
+]
+--- response_body_like eval
+[
+ qr/server [1-2]/,
+ qr/server [1-2]/,
+]
+--- no_error_log
+[error]
+
+
+
+=== TEST 11: get APISIX-NACOS info from NACOS - configured in upstreams + etcd with namespace
+--- extra_yaml_config
+discovery:
+ nacos:
+ host:
+ - "http://127.0.0.1:8858"
+ fetch_interval: 1
+--- config
+ location /t {
+ content_by_lua_block {
+ local t = require("lib.test_admin").test
+ local code, body = t('/apisix/admin/upstreams/1',
+ ngx.HTTP_PUT,
+ [[{
+ "service_name": "APISIX-NACOS",
+ "discovery_type": "nacos",
+ "type": "roundrobin",
+ "discovery_args": {
+ "namespace_id": "test_ns"
+ }
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ ngx.say(body)
+ return
+ end
+
+ local code, body = t('/apisix/admin/routes/1',
+ ngx.HTTP_PUT,
+ [[{
+ "uri": "/hello",
+ "upstream_id": 1
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ end
+
+ ngx.say(body)
+ }
+ }
+--- request
+GET /t
+--- response_body
+passed
+--- no_error_log
+[error]
+
+
+
+=== TEST 12: hit with namespace
+--- extra_yaml_config
+discovery:
+ nacos:
+ host:
+ - "http://127.0.0.1:8858"
+ fetch_interval: 1
+--- pipelined_requests eval
+[
+ "GET /hello",
+ "GET /hello",
+]
+--- response_body_like eval
+[
+ qr/server [1-2]/,
+ qr/server [1-2]/,
+]
+--- no_error_log
+[error]