-
Notifications
You must be signed in to change notification settings - Fork 2.6k
feat(nacos): add metadata filtering support to nacos discovery #12445
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
2de0abb
d8cf96d
298fd9a
a583743
132c8b2
c1c2e34
53e3400
da59ef9
dc321b6
7f2fc3d
51ae1d4
2bf849a
6715ce9
31755d8
4952aa8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
#!/bin/bash | ||
# | ||
# Licensed to the Apache Software Foundation (ASF) under one or more | ||
# contributor license agreements. See the NOTICE file distributed with | ||
# this work for additional information regarding copyright ownership. | ||
# The ASF licenses this file to You under the Apache License, Version 2.0 | ||
# (the "License"); you may not use this file except in compliance with | ||
# the License. You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
# | ||
|
||
# Build Java command with proper environment variable expansion | ||
JAVA_ARGS=( | ||
"-Djava.security.egd=file:/dev/./urandom" | ||
"-jar" | ||
"/app.jar" | ||
"--suffix.num=${SUFFIX_NUM}" | ||
"--spring.cloud.nacos.discovery.server-addr=${NACOS_ADDR}" | ||
"--spring.application.name=${SERVICE_NAME}" | ||
"--spring.cloud.nacos.discovery.group=${GROUP}" | ||
"--spring.cloud.nacos.discovery.namespace=${NAMESPACE}" | ||
) | ||
|
||
# Add metadata dynamically for all METADATA_* environment variables | ||
for var in $(env | grep '^METADATA_' | cut -d= -f1); do | ||
# Convert METADATA_LANE to lane, METADATA_ENV to env, etc. | ||
metadata_key=$(echo "${var#METADATA_}" | tr '[:upper:]' '[:lower:]') | ||
metadata_value=$(eval echo \$${var}) | ||
|
||
if [ -n "${metadata_value}" ]; then | ||
JAVA_ARGS+=("--spring.cloud.nacos.discovery.metadata.${metadata_key}=${metadata_value}") | ||
fi | ||
done | ||
|
||
# Execute Java with expanded arguments | ||
exec java "${JAVA_ARGS[@]}" |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -132,6 +132,7 @@ $ curl http://127.0.0.1:9180/apisix/admin/stream_routes/1 -H "X-API-KEY: $admin_ | |
| ------------ | ------ | ----------- | ------- | ----- | ------------------------------------------------------------ | | ||
| namespace_id | string | optional | public | | This parameter is used to specify the namespace of the corresponding service | | ||
| group_name | string | optional | DEFAULT_GROUP | | This parameter is used to specify the group of the corresponding service | | ||
| metadata | object | optional | | | Filter service instances by metadata using containment matching | | ||
|
||
#### Specify the namespace | ||
|
||
|
@@ -278,3 +279,52 @@ The formatted response as below: | |
} | ||
} | ||
``` | ||
|
||
#### Metadata filtering | ||
|
||
APISIX supports filtering service instances based on metadata. When a route is configured with metadata conditions, only service instances whose metadata contains all the key-value pairs specified in the route's `metadata` configuration will be selected. The metadata values in the route configuration are arrays, and a service instance matches if its metadata value equals any value in the corresponding array. | ||
|
||
Example: If a service instance has metadata `{lane: "a", env: "prod", version: "1.0"}`, it will match routes configured with metadata `{lane: ["a"]}` or `{lane: ["a"], env: ["prod"]}`, but not routes configured with `{lane: ["b"]}` or `{lane: ["a"], region: ["us"]}`. | ||
|
||
Example of routing a request with metadata filtering: | ||
|
||
```shell | ||
$ curl http://127.0.0.1:9180/apisix/admin/routes/5 -H "X-API-KEY: $admin_key" -X PUT -i -d ' | ||
{ | ||
"uri": "/nacosWithMetadata/*", | ||
"upstream": { | ||
"service_name": "APISIX-NACOS", | ||
"type": "roundrobin", | ||
"discovery_type": "nacos", | ||
"discovery_args": { | ||
"metadata": { | ||
"version": ["v1"] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After careful consideration, I still feel that using an array here will increase complexity, and there is no such requirement at present. Since the metadata data comes from nacos, I think we should keep it consistent with the metadata format of nacos and use a simple key:value pair. |
||
} | ||
} | ||
} | ||
}' | ||
``` | ||
|
||
This route will only route traffic to service instances that have the metadata field `version` set to `v1`. | ||
|
||
For multiple metadata criteria: | ||
|
||
```shell | ||
$ curl http://127.0.0.1:9180/apisix/admin/routes/6 -H "X-API-KEY: $admin_key" -X PUT -i -d ' | ||
{ | ||
"uri": "/nacosWithMultipleMetadata/*", | ||
"upstream": { | ||
"service_name": "APISIX-NACOS", | ||
"type": "roundrobin", | ||
"discovery_type": "nacos", | ||
"discovery_args": { | ||
"metadata": { | ||
"lane": ["a", "b"], | ||
"env": ["prod"] | ||
} | ||
} | ||
} | ||
}' | ||
``` | ||
|
||
This route will only route traffic to service instances that have `env: "prod"` and `lane` set to either `"a"` or `"b"` in their metadata. |
Uh oh!
There was an error while loading. Please reload this page.