# 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] ````