流量标记
- Java Chassis通过Handler实现了基于流量标记治理能力。其中Provider实现了限流、熔断和隔离仓,Consumer实现了重试。
- 使用流量标记治理能力,首先需要在代码中引入依赖:
<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>handler-governance</artifactId> </dependency>
- 然后配置Handler链:
servicecomb: handler: chain: Consumer: default: governance-consumer,loadbalance Provider: default: governance-provider
Java Chassis是基于Open API的REST/RPC框架,在模型上和单纯的REST框架存在差异。Java Chassis提供两种模式匹配规则,第一种是基于REST的,第二种是基于RPC的。可以通过配置项:servicecomb.governance.{operation}.matchType指定匹配规则,默认使用REST。如果使用Java Chassis中的highway协议调用,需要指定matchType类型为rpc。比如:servicecomb: governance: matchType: rest # 设置全局默认是rest匹配模式,highway协议设置为rpc GovernanceEndpoint.helloRpc: matchType: rpc # 设置服务端的接口helloRpc采用RPC匹配模式
在REST匹配模式下, apiPath使用url, 比如:
servicecomb: matchGroup: userLoginAction: | matches: - apiPath: exact: "/user/login"
在RPC匹配模式下,apiPath使用operation,比如:
servicecomb: matchGroup: userLoginAction: | matches: - apiPath: exact: "UserSchema.login"
对于服务端治理,比如限流,REST模式下从HTTP取header;对于客户端治理,比如重试,REST模式下从InvocationContext取header。
不同治理策略配置示例及在POM中添加依赖如下介绍。
一个流量对应一个Key,userLoginAction为Key的名称。 一个流量可以定义多个标记规则,每个标记规则里面可以定义apiPath,method,headers匹配规则。 不同标记规则是或的关系,匹配规则是与的关系。
在match中提供了一系列的算子来对apiPath或者headers进行匹配:
- exact : 精确匹配。
- prefix: 前缀匹配。
- suffix: 后缀匹配。
- contains: 包含, 目标字符串是否包含模式字符串。
- compare: 比较,支持>、<、>=、<=、=、!=符号匹配。处理时会把模式字符串和目标字符串转化为Double类型进行比较,支持的数据范围为Double的数据范围。在进行=和!=判断时,如果二者的差值小于1e-6就视为相等。例如模式串为>-10,会对大于-10以上的目标串匹配成功。
流量标记可以在不同的应用层实现,比如:在提供REST接口的服务端,可以通过HttpServletRequest获取流量信息;在RestTemplate调用的客户端,可以从RestTemplate获取流量信息。
不同的框架和应用层,提取信息的方式不一样。实现层通过将特征映射到GovernanceRequest来屏蔽差异。使得在不同的框架、不同的应用层都可以使用治理。
public class GovernanceRequest { private Map<String, String> headers; private String uri; private String method;}
- 使用流量标记治理能力,首先需要在代码中引入依赖:
- Spring Cloud通过Aspect拦截RequestMappingHandlerAdapter实现了限流、熔断和隔离仓,通过拦截RestTemplate和FeignClient实现了重试。
<dependency> <groupId>com.huaweicloud</groupId> <artifactId>spring-cloud-starter-huawei-governance</artifactId> </dependency>
Spring Cloud是基于REST的框架,能比较好的符合流量特征治理的匹配语义,apiPath和headers分别对应HTTP协议的概念:
servicecomb: matchGroup: userLoginAction: | matches: - apiPath: exact: "/user/login" method: - POST - headers: Authentication: prefix: Basic