diff --git a/spring-cloud-tencent-examples/polaris-router-grayrelease-example/README-zh.md b/spring-cloud-tencent-examples/polaris-router-grayrelease-example/README-zh.md new file mode 100644 index 000000000..eb80b2cc6 --- /dev/null +++ b/spring-cloud-tencent-examples/polaris-router-grayrelease-example/README-zh.md @@ -0,0 +1,263 @@ +# Spring Cloud Polaris Gray Release Example + +[English](./README.md) | 简体中文 + +## 项目说明 + +本项目演示如何使用 Spring Cloud Tencent 的路由和标签透传功能 完成 Spring Cloud 应用的全链路灰度。 + +## 示例架构 + +![](https://qcloudimg.tencent-cloud.cn/raw/488182fd3001b3e77d9450e2c8798ff3.png) + +本示例请求都通过最上层网关进行分发,分发的目的地主要涉及3个环境: +- 灰度环境1(只针对uid=1的请求放开),环境标识为env=green(绿色环境) +- 灰度环境2(只针对uid=2的请求放开),环境标识为env=purple(紫色环境) +- 基线环境(稳定的业务版本,针对其他请求放开),环境标识为env=blue(蓝色环境) + +## 如何接入 + +### 启动网关服务 + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + +2. 启动router-grayrelease-gateway应用 + + - IDE直接启动:找到主类 `GrayReleaseGatewayApplication`,执行 main 方法启动应用。 + - 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar router-grayrelease-gateway-${verion}.jar`启动应用。 + +3. 添加路由规则 + + 通过往北极星接口发送以下数据,为网关服务添加路由规则,路由规则可以针对用户ID进行环境的分发。 + ```` + 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 + }] + } + ] + }] + ```` + + 路由规则也可以通过北极星控制台进行定义,最终控制台效果如下: + + ![](https://qcloudimg.tencent-cloud.cn/raw/28e3d734c4b73624869a5b9b7059b118.png) + +### 启动Front服务 + +#### 启动基线环境(蓝色) + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + - 环境标识:SCT_METADATA_CONTENT_env=blue + - 透传环境标识:SCT_METADATA_CONTENT_TRANSITIVE=env + +2. 启动router-grayrelease-frontend应用 + + - IDE直接启动:找到主类 `GrayReleaseFrontApplication`,执行 main 方法启动应用。 + - 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar router-grayrelease-frontend-${verion}.jar`启动应用。 + +#### 启动灰度环境1(绿色) + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + - 环境标识:SCT_METADATA_CONTENT_env=green + - 透传环境标识:SCT_METADATA_CONTENT_TRANSITIVE=env + +2. 启动router-grayrelease-frontend应用(与前面一致) + + 如果遇到端口冲突,可以通过-Dserver.port来指定端口 + +#### 启动灰度环境2(紫色) + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + - 环境标识:SCT_METADATA_CONTENT_env=purple + - 透传环境标识:SCT_METADATA_CONTENT_TRANSITIVE=env + +2. 启动router-grayrelease-frontend应用(与前面一致) + +#### 启动后效果 + +在北极星控制台,可以看到gray-release-front服务下有3个节点,每个节点有不同的环境标识。 + +![](https://qcloudimg.tencent-cloud.cn/raw/96d2bdd2fb3495f737ab278e31a4a2e7.png) + +### 启动middle服务 + +#### 启动基线环境(蓝色) + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + - 环境标识:SCT_METADATA_CONTENT_env=blue + - 透传环境标识:SCT_METADATA_CONTENT_TRANSITIVE=env + +2. 启动router-grayrelease-middle应用 + + - IDE直接启动:找到主类 `GrayReleaseMiddleApplication`,执行 main 方法启动应用。 + - 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar router-grayrelease-middle-${verion}.jar`启动应用。 + + +#### 启动灰度环境2(紫色) + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + - 环境标识:SCT_METADATA_CONTENT_env=purple + - 透传环境标识:SCT_METADATA_CONTENT_TRANSITIVE=env + +2. 启动router-grayrelease-middle应用(与前面一致) + +### 启动back服务 + +#### 启动基线环境(蓝色) + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + - 环境标识:SCT_METADATA_CONTENT_env=blue + - 透传环境标识:SCT_METADATA_CONTENT_TRANSITIVE=env + +2. 启动router-grayrelease-backend应用 + + - IDE直接启动:找到主类 `GrayReleaseBackendApplication`,执行 main 方法启动应用。 + - 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar router-grayrelease-backend-${verion}.jar`启动应用。 + +#### 启动灰度环境1(绿色) + +1. 添加环境变量 + + - 北极星服务端地址:polaris_address=grpc://127.0.0.1:8091 + - 可观测性PushGateway地址:prometheus_address=127.0.0.1:9091 + - 环境标识:SCT_METADATA_CONTENT_env=green + - 透传环境标识:SCT_METADATA_CONTENT_TRANSITIVE=env + +2. 启动router-grayrelease-backend应用(与前面一致) + +### 测试 + +#### 基线环境路由 + +```` +curl -H'uid:0' 127.0.0.1:59100/router/gray/route_rule +```` +获取结果 +```` +gray-release-gateway -> gray-release-front[blue] -> gray-release-middle[blue] -> gray-release-back[blue] +```` + +#### 灰度环境1(绿色)路由 + +```` +curl -H'uid:1' 127.0.0.1:59100/router/gray/route_rule +```` +获取结果 +```` +gray-release-gateway -> gray-release-front[green] -> gray-release-middle[blue] -> gray-release-back[green] +```` + +#### 灰度环境2(紫色)路由 + +```` +curl -H'uid:2' 127.0.0.1:59100/router/gray/route_rule +```` +获取结果 +```` +gray-release-gateway -> gray-release-front[purple] -> gray-release-middle[purple] -> gray-release-back[blue] +```` + diff --git a/spring-cloud-tencent-examples/polaris-router-grayrelease-example/README.md b/spring-cloud-tencent-examples/polaris-router-grayrelease-example/README.md new file mode 100644 index 000000000..8ad68bbeb --- /dev/null +++ b/spring-cloud-tencent-examples/polaris-router-grayrelease-example/README.md @@ -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] +```` + diff --git a/spring-cloud-tencent-examples/polaris-router-grayrelease-example/router-grayrelease-gateway/src/main/java/com/tencent/cloud/polaris/router/grayrelease/gateway/GatewayController.java b/spring-cloud-tencent-examples/polaris-router-grayrelease-example/router-grayrelease-gateway/src/main/java/com/tencent/cloud/polaris/router/grayrelease/gateway/GatewayController.java index e7ac65ba9..144185902 100644 --- a/spring-cloud-tencent-examples/polaris-router-grayrelease-example/router-grayrelease-gateway/src/main/java/com/tencent/cloud/polaris/router/grayrelease/gateway/GatewayController.java +++ b/spring-cloud-tencent-examples/polaris-router-grayrelease-example/router-grayrelease-gateway/src/main/java/com/tencent/cloud/polaris/router/grayrelease/gateway/GatewayController.java @@ -18,12 +18,8 @@ package com.tencent.cloud.polaris.router.grayrelease.gateway; -import java.util.HashMap; -import java.util.Map; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; @@ -39,14 +35,6 @@ public class GatewayController { @Autowired private RouterService routerService; - private final Map uidMapping; - - public GatewayController() { - String mapping = System.getenv("uid_env_mapping"); - uidMapping = parseUidMapping(mapping); - System.out.println("parsed mapping is " + uidMapping); - } - /** * Get information of callee. * @return information of callee @@ -58,17 +46,4 @@ public class GatewayController { return appName + " -> " + resp; } - private Map parseUidMapping(String mapText) { - Map result = new HashMap<>(); - if (!StringUtils.hasText(mapText)) { - return result; - } - String[] tokens = mapText.split("\\|"); - for (String token : tokens) { - String[] pairs = token.split(":"); - result.put(Integer.parseInt(pairs[0]), pairs[1]); - } - return result; - } - }