
# 流量标记
- 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
  ```
  
 
