本文档主要介绍标签路由插件的使用方法。
区域路由见区域路由。
在微服务存在多个版本、多个实例的情况下,通过配置路由规则管理服务之间的路由,达到无损升级、应用拨测等业务目的。
- 配置路由规则
Sermant backend提供api的方式发布配置, 使用前需启动backend后台应用,配置发布接口如下:
URL
POST /publishConfig
请求Body
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| key | √ | String | 配置的key |
| group | √ | String | 配置的组 |
| content | √ | String | 配置文本 |
其中key值为servicecomb.routeRule.${yourServiceName},${yourServiceName}为目标应用的微服务名称。
group需要配置为应用级别,即app=${yourApp}&&environment=${yourEnvironment},其中app默认为default,environment默认为空。
content为具体的路由规则。
---
- precedence: 2 # 优先级,数字越大,优先级越高。
match: # 请求匹配规则。0..N个,不配置表示匹配。每条匹配规则只允许存在一个attachments/headers/args。
attachments: # dubbo attachment匹配。如果是http header匹配,需要配置为headers
id: # 如果配置了多个key,那么所有的key规则都必须和请求匹配
exact: '1' # 配置策略,等于1,详细配置策略参考配置策略表
caseInsensitive: false # false:不区分大小写(默认),true:区分大小写。配置为false时,将统一转为大写进行比较
args: # dubbo参数匹配
args0: # dubbo接口的第0个参数
type: .id # 取值类型,dubbo应用特有字段,第0个参数为实体,获取其id的属性值,如果参数类型为int,String等普通类型,则无需填写该值,所有的取值类型见取值类型列表
exact: '2' # 配置策略,等于2,所有的匹配策略见配置策略列表
caseInsensitive: false # 是否区分大小写,默认为false,区分大小写
route: # 路由规则
- weight: 20 # 权重值
tags:
version: 1.0.0 # 实例标记。满足标记条件的实例放到这一组。
- weight: 80 # 权重值
tags:
version: 1.0.1 # 实例标记。满足标记条件的实例放到这一组。
- precedence: 1
route:
- weight: 20
tags:
group: red
- weight: 80
tags:
group: green注意:新增配置时,请去掉注释,否则会导致新增失败。
| 策略名 | 策略值 | 匹配规则 |
|---|---|---|
| 精确匹配 | exact | 参数值等于配置值 |
| 正则 | regex | 参数值匹配正则表达式,由于部分正则表达式(如\w与\W等)区分大小写,所以使用正则策略时,请谨慎选择caseInsensitive(是否区分大小写) |
| 不等于 | noEqu | 参数值不等于配置值 |
| 大于等于 | noLess | 参数值大于等于配置值 |
| 小于等于 | noGreater | 参数值小于等于配置值 |
| 大于 | greater | 参数值大于配置值 |
| 小于 | less | 参数值小于配置值 |
| 类型 | 取值方式 | 适用参数类型 |
|---|---|---|
| 留空 | 表示直接取当前参数的值 | 适用普通参数类型,例如String、int、long等 |
| .name | 表示取参数的name属性,相当于ARG0.getName() | 适用于对象类型 |
| .isEnabled() | 表示取参数的enabled属性,相当于ARG0.isEnabled() | 适用于对象类型 |
| [0] | 取数组的第一个值,相当于ARG0[0] | 适用于普通类型的数组,例如String[]、int[] |
| .get(0) | 取List的第一个值,相当于ARG0.get(0) | 适用于普通类型的列表,例如List<String>、List<Integer> |
| .get("key") | 获取key对应的值,相当于ARG0.get("key") | 适用于普通类型的map,例如Map<String, String> |
- 启动标签应用
在附带agent启动时,按需加上以下参数:
-Dservice_meta_version=${VERSION} -Dservice_meta_parameters=${PARAMETERS}
参数说明如下:
- ${VERSION}需替换为服务注册时的版本号(形如a.b.c的格式,其中a,b,c均为数字,默认为1.0.0),标签应用需要修改为不同于正常应用的版本号。
- ${PARAMETERS}需替换为服务注册时的自定义标签(形如tag1:value1,tag2:value2),即标签名与标签值以英文冒号分隔,多个标签之间以英文逗号分隔。
- 一般地,如果用版本号进行路由,则只需配置service_meta_version,如果用自定义标签进行路由,则只需配置service_meta_parameters。
-
前提条件正确打包Sermant
-
注册中心使用华为CSE,下载Local-CSE ,解压后按照文档说明进行启动
-
配置路由规则
调用接口localhost:8900/publishConfig, 请求参数如下:
{
"content": "---\n- precedence: 1\n match:\n headers:\n id:\n exact: '1'\n caseInsensitive: false\n route:\n - tags:\n group: gray\n weight: 100\n- precedence: 2\n match:\n headers:\n id:\n exact: '2'\n caseInsensitive: false\n route:\n - tags:\n version: 1.0.1\n weight: 100",
"group": "app=default&&environment=",
"key": "servicecomb.routeRule.spring-cloud-router-provider"
}- 编译demo应用
mvn clean package- 启动zuul网关
java -Dservicecomb_service_enableSpringRegister=true -javaagent:${path}\agent\sermant-agent.jar=appName=default -jar spring-cloud-router-zuul.jar- 启动消费者
java -Dservicecomb_service_enableSpringRegister=true -javaagent:${path}\agent\sermant-agent.jar=appName=default -jar spring-cloud-router-consumer.jar- 启动生产者
java -Dservicecomb_service_enableSpringRegister=true -javaagent:${path}\agent\sermant-agent.jar=appName=default -jar spring-cloud-router-provider.jar- 启动标签生产者(版本为1.0.1,标签为group:gray)
java -Dservicecomb_service_enableSpringRegister=true -Dservice_meta_version=1.0.1 -Dservice_meta_parameters=group:gray -Dserver.port=8163 -javaagent:${path}\agent\sermant-agent.jar=appName=default -jar spring-cloud-router-provider.jar其中path需要替换为Sermant实际安装路径。
- 测试
当启动以上4个应用并正确配置路由规则后,通过http客户端工具访问http://127.0.0.1:8170/consumer/hello/rest,可以发现,当请求头为id: 1或者id: 2时,会路由到版本为1.0.1的provider,当不满足以上条件时,会访问到版本为1.0.0的provider