更新时间:2024-10-23 GMT+08:00

流量标记

  • Java Chassis通过Handler实现了基于流量标记治理能力。其中Provider实现了限流、熔断和隔离仓,Consumer实现了重试。
    1. 使用流量标记治理能力,首先需要在代码中引入依赖:
      <dependency>
        <groupId>org.apache.servicecomb</groupId>
        <artifactId>handler-governance</artifactId>
      </dependency>
    2. 然后配置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