|
|
@ -0,0 +1,262 @@
|
|
|
|
|
|
|
|
# Spring Cloud Polaris Gray Release Example
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
English | [简体中文](./README-zh.md)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Project Explanation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This project shows how to use Spring Cloud Tencent route and transitive feature to do the full chain gray releasing.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Architecture
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![](https://qcloudimg.tencent-cloud.cn/raw/488182fd3001b3e77d9450e2c8798ff3.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Incoming requests dispatched from Gateway service to 3 environments:
|
|
|
|
|
|
|
|
- gray1(match uid=1), env=green(green environment)
|
|
|
|
|
|
|
|
- gray2(match uid=2), env=purple(purple environment)
|
|
|
|
|
|
|
|
- baseline(stable environment, match all other requests), env=blue(blue environment)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## How to access
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Start Gateway service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-gateway application
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Launch by IDE:Start the main class `GrayReleaseGatewayApplication`.
|
|
|
|
|
|
|
|
- Launch by Jar:Execute `mvn clean package` to compile with jar package, then use `java -jar router-grayrelease-gateway-${verion}.jar` to launch application.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. add the route rule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Send http request to polaris server to add the route rule, make requests dispatched to 3 environments.
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
POST /naming/v1/routings
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[{
|
|
|
|
|
|
|
|
"service": "gray-release-gateway",
|
|
|
|
|
|
|
|
"namespace": "default",
|
|
|
|
|
|
|
|
"outbounds": [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"sources": [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"service": "gray-release-gateway",
|
|
|
|
|
|
|
|
"namespace": "default",
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"${http.header.uid}": {
|
|
|
|
|
|
|
|
"type": "EXACT",
|
|
|
|
|
|
|
|
"value": "2"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}],
|
|
|
|
|
|
|
|
"destinations": [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"service": "*",
|
|
|
|
|
|
|
|
"namespace": "*",
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"env": {
|
|
|
|
|
|
|
|
"type": "EXACT",
|
|
|
|
|
|
|
|
"value": "purple"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"priority": 0,
|
|
|
|
|
|
|
|
"weight": 100,
|
|
|
|
|
|
|
|
"isolate": false
|
|
|
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"sources": [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"service": "gray-release-gateway",
|
|
|
|
|
|
|
|
"namespace": "default",
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"${http.header.uid}": {
|
|
|
|
|
|
|
|
"type": "EXACT",
|
|
|
|
|
|
|
|
"value": "1"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}],
|
|
|
|
|
|
|
|
"destinations": [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"service": "*",
|
|
|
|
|
|
|
|
"namespace": "*",
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"env": {
|
|
|
|
|
|
|
|
"type": "EXACT",
|
|
|
|
|
|
|
|
"value": "green"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"priority": 0,
|
|
|
|
|
|
|
|
"weight": 100,
|
|
|
|
|
|
|
|
"isolate": false
|
|
|
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"sources": [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"service": "gray-release-gateway",
|
|
|
|
|
|
|
|
"namespace": "default",
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"*": {
|
|
|
|
|
|
|
|
"type": "EXACT",
|
|
|
|
|
|
|
|
"value": "*"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}],
|
|
|
|
|
|
|
|
"destinations": [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"service": "*",
|
|
|
|
|
|
|
|
"namespace": "*",
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"env": {
|
|
|
|
|
|
|
|
"type": "EXACT",
|
|
|
|
|
|
|
|
"value": "blue"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"priority": 0,
|
|
|
|
|
|
|
|
"weight": 100,
|
|
|
|
|
|
|
|
"isolate": false
|
|
|
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The route rule can be added by polaris console:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![](https://qcloudimg.tencent-cloud.cn/raw/28e3d734c4b73624869a5b9b7059b118.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Start Front service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start baseline environment (blue)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
- env tag:SCT_METADATA_CONTENT_env=blue
|
|
|
|
|
|
|
|
- transitive tag:SCT_METADATA_CONTENT_TRANSITIVE=env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-frontend application
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Launch by IDE:Start the main class `GrayReleaseFrontApplication`.
|
|
|
|
|
|
|
|
- Launch by Jar:Execute `mvn clean package` to compile with jar package, then use `java -jar router-grayrelease-frontend-${verion}.jar` to launch application.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start gray1 environment (green)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
- env tag:SCT_METADATA_CONTENT_env=green
|
|
|
|
|
|
|
|
- transitive tag:SCT_METADATA_CONTENT_TRANSITIVE=env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-frontend application (same as previous instruction)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If port conflicted, you can specify another port by -Dserver.port
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start gray2 environment (purple)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
- env tag:SCT_METADATA_CONTENT_env=purple
|
|
|
|
|
|
|
|
- transitive tag:SCT_METADATA_CONTENT_TRANSITIVE=env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-frontend application (same as previous instruction)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start effective
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
You can find the instances with different tags in polaris console.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![](https://qcloudimg.tencent-cloud.cn/raw/96d2bdd2fb3495f737ab278e31a4a2e7.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Start Middle service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start baseline environment (blue)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
- env tag:SCT_METADATA_CONTENT_env=blue
|
|
|
|
|
|
|
|
- transitive tag:SCT_METADATA_CONTENT_TRANSITIVE=env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-middle application
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Launch by IDE:Start the main class `GrayReleaseMiddleApplication`.
|
|
|
|
|
|
|
|
- Launch by Jar:Execute `mvn clean package` to compile with jar package, then use `java -jar router-grayrelease-middle-${verion}.jar` to launch application.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start gray2 environment (purple)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
- env tag:SCT_METADATA_CONTENT_env=purple
|
|
|
|
|
|
|
|
- transitive tag:SCT_METADATA_CONTENT_TRANSITIVE=env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-middle application (same as previous instruction)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Start Back service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start baseline environment (blue)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
- env tag:SCT_METADATA_CONTENT_env=blue
|
|
|
|
|
|
|
|
- transitive tag:SCT_METADATA_CONTENT_TRANSITIVE=env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-backend application
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Launch by IDE:Start the main class `GrayReleaseBackendApplication`.
|
|
|
|
|
|
|
|
- Launch by Jar:Execute `mvn clean package` to compile with jar package, then use `java -jar router-grayrelease-backend-${verion}.jar` to launch application.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Start gray1 environment (green)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. add environment variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- polaris server address: polaris_address=grpc://127.0.0.1:8091
|
|
|
|
|
|
|
|
- pushgateway address: prometheus_address=127.0.0.1:9091
|
|
|
|
|
|
|
|
- env tag:SCT_METADATA_CONTENT_env=green
|
|
|
|
|
|
|
|
- transitive tag:SCT_METADATA_CONTENT_TRANSITIVE=env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. start router-grayrelease-backend application (same as previous instruction)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Test
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Baseline routing
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
curl -H'uid:0' 127.0.0.1:59100/router/gray/route_rule
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
Got result
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
gray-release-gateway -> gray-release-front[blue] -> gray-release-middle[blue] -> gray-release-back[blue]
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Green routing
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
curl -H'uid:1' 127.0.0.1:59100/router/gray/route_rule
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
Got result
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
gray-release-gateway -> gray-release-front[green] -> gray-release-middle[blue] -> gray-release-back[green]
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Purple routing
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
curl -H'uid:2' 127.0.0.1:59100/router/gray/route_rule
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
Got result
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
gray-release-gateway -> gray-release-front[purple] -> gray-release-middle[purple] -> gray-release-back[blue]
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
|