|
|
|
## A Multi-Feature Environment Example
|
|
|
|
|
|
|
|
English | [简体中文](./README-zh.md)
|
|
|
|
|
|
|
|
## I. Deployment Structure
|
|
|
|
|
|
|
|
<img src="./imgs/structs.png" alt="multi-feature environment structure"/>
|
|
|
|
|
|
|
|
As shown in the figure above, there are three environments.
|
|
|
|
|
|
|
|
1. `baseline` environment, including `FrontService`, `MiddleService`, `BackendService`
|
|
|
|
2. `feature1` environment, including `MiddleService`, `BackendService`
|
|
|
|
3. `feature2` environment, including `FrontService`, `BackendService`
|
|
|
|
|
|
|
|
And at the entrance, deploy the `gateway` service.
|
|
|
|
|
|
|
|
Three request links.
|
|
|
|
|
|
|
|
1. `baseline` environment link, `Gateway` -> `FrontService`(baseline) -> `MiddleService`(baseline) -> `BackendService`(
|
|
|
|
baseline)
|
|
|
|
2. `feature1` environment link, `Gateway` -> `FrontService`(baseline) -> `MiddleService`(feature1) -> `BackendService`(
|
|
|
|
feature1)
|
|
|
|
3. `feature2` environment link, `Gateway` -> `FrontService`(feature2) -> `MiddleService`(baseline) -> `BackendService`(
|
|
|
|
feature2)
|
|
|
|
|
|
|
|
## II. Running
|
|
|
|
|
|
|
|
Without any code changes, just start all the applications under `base`, `feature1`, `feature2`, `featureenv-gateway`
|
|
|
|
directly.
|
|
|
|
|
|
|
|
By default, the applications point to the official Polaris experience environment, and you can directly view the service
|
|
|
|
registration data at the experience site after a successful launch.
|
|
|
|
|
|
|
|
- Console address: http://14.116.241.63:8080/
|
|
|
|
- Account: polaris
|
|
|
|
- Password: polaris
|
|
|
|
|
|
|
|
## III. Testing
|
|
|
|
|
|
|
|
### Mode 1: Client Request With `featureenv` Label
|
|
|
|
|
|
|
|
#### `baseline` environment link
|
|
|
|
|
|
|
|
````
|
|
|
|
curl http://127.0.0.1:9999/featureenv-front-example/router/rest
|
|
|
|
````
|
|
|
|
|
|
|
|
Response results (base indicates baseline environment)
|
|
|
|
|
|
|
|
````
|
|
|
|
featureenv-front-example[base] -> featureenv-middle-example[base] -> featureenv-backend-example[base]
|
|
|
|
````
|
|
|
|
|
|
|
|
#### `feature1` environment link
|
|
|
|
|
|
|
|
Specify the feature environment via the `X-Polaris-Metadata-Transitive-featureenv` request header.
|
|
|
|
|
|
|
|
````
|
|
|
|
curl -H'X-Polaris-Metadata-Transitive-featureenv:feature1' http://127.0.0.1:9999/featureenv-front-example/router/rest
|
|
|
|
````
|
|
|
|
|
|
|
|
Response results
|
|
|
|
|
|
|
|
````
|
|
|
|
featureenv-front-example[base] -> featureenv-middle-example[feature1] -> featureenv-backend-example[feature1]
|
|
|
|
````
|
|
|
|
|
|
|
|
#### `feature2` environment link
|
|
|
|
|
|
|
|
Specify the feature environment via the `X-Polaris-Metadata-Transitive-featureenv` request header.
|
|
|
|
|
|
|
|
````
|
|
|
|
curl -H'X-Polaris-Metadata-Transitive-featureenv:feature2' http://127.0.0.1:9999/featureenv-front-example/router/rest
|
|
|
|
````
|
|
|
|
|
|
|
|
Response results
|
|
|
|
|
|
|
|
````
|
|
|
|
featureenv-front-example[feature2] -> featureenv-middle-example[base] -> featureenv-backend-example[feature2]
|
|
|
|
````
|
|
|
|
|
|
|
|
### Mode 2: Gateway traffic staining
|
|
|
|
|
|
|
|
Simulate a real-world scenario, assuming that the client request has a uid request parameter and expects:
|
|
|
|
|
|
|
|
1. `uid=1000` requests hit the `feature1` environment
|
|
|
|
2. `uid=2000` requests hit the `feature2` environment
|
|
|
|
3. requests with other uid hit the `baseline` environment
|
|
|
|
|
|
|
|
**Configure coloring rules**
|
|
|
|
|
|
|
|
Polaris Configuration Address: http://14.116.241.63:8080/#/filegroup-detail?group=featureenv-gateway&namespace=default
|
|
|
|
|
|
|
|
Modify the `rule/staining.json` configuration file and fill in the following rule:
|
|
|
|
|
|
|
|
````json
|
|
|
|
{
|
|
|
|
"rules": [
|
|
|
|
{
|
|
|
|
"conditions": [
|
|
|
|
{
|
|
|
|
"key": "${http.query.uid}",
|
|
|
|
"values": [
|
|
|
|
"1000"
|
|
|
|
],
|
|
|
|
"operation": "EQUALS"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"labels": [
|
|
|
|
{
|
|
|
|
"key": "featureenv",
|
|
|
|
"value": "feature1"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"conditions": [
|
|
|
|
{
|
|
|
|
"key": "${http.query.uid}",
|
|
|
|
"values": [
|
|
|
|
"2000"
|
|
|
|
],
|
|
|
|
"operation": "EQUALS"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"labels": [
|
|
|
|
{
|
|
|
|
"key": "featureenv",
|
|
|
|
"value": "feature2"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
````
|
|
|
|
|
|
|
|
Just fill out and publish the configuration.
|
|
|
|
|
|
|
|
#### `baseline` Environment Link
|
|
|
|
|
|
|
|
````
|
|
|
|
curl http://127.0.0.1:9999/featureenv-front-example/router/rest?uid=3000
|
|
|
|
````
|
|
|
|
|
|
|
|
Response results (base indicates baseline environment)
|
|
|
|
|
|
|
|
````
|
|
|
|
featureenv-front-example[base] -> featureenv-middle-example[base] -> featureenv-backend-example[base]
|
|
|
|
````
|
|
|
|
|
|
|
|
#### `feature1` Environment Link
|
|
|
|
|
|
|
|
Specify the feature environment via the `X-Polaris-Metadata-Transitive-featureenv` request header.
|
|
|
|
|
|
|
|
````
|
|
|
|
curl http://127.0.0.1:9999/featureenv-front-example/router/rest?uid=1000
|
|
|
|
````
|
|
|
|
|
|
|
|
Response results
|
|
|
|
|
|
|
|
````
|
|
|
|
featureenv-front-example[base] -> featureenv-middle-example[feature1] -> featureenv-backend-example[feature1]
|
|
|
|
````
|
|
|
|
|
|
|
|
#### `feature2` Environment Link
|
|
|
|
|
|
|
|
Specify the feature environment via the `X-Polaris-Metadata-Transitive-featureenv` request header.
|
|
|
|
|
|
|
|
````
|
|
|
|
curl http://127.0.0.1:9999/featureenv-front-example/router/rest?uid=2000
|
|
|
|
````
|
|
|
|
|
|
|
|
Response results
|
|
|
|
|
|
|
|
````
|
|
|
|
featureenv-front-example[feature2] -> featureenv-middle-example[base] -> featureenv-backend-example[feature2]
|
|
|
|
````
|
|
|
|
|
|
|
|
|