服务治理

最近更新时间: 2024-10-17 17:10:00

操作场景

服务治理功能包含服务鉴权、服务限流、服务路由和服务熔断,该任务指导您在应用开发过程中配置服务治理功能。

前提条件

  • 完成 【SDK 下载】 。

注意:

若要使用服务熔断功能,请确保 SDK 版本高于1.19

  • 熟悉服务治理功能 。

添加依赖

向工程中添加 spring-cloud-tsf-starter 依赖并开启 @EnableTsf 注解 。

注意:

如果您使用的是 1.15.0-Edgware-RELEASE/1.15.0-Finchley-RELEASE 及之前的版本,使用方法参考 【Spring Cloud SDK 历史版本使用方法】 。

  1. 向工程中添加依赖。 在 pom.xml 中添加以下代码:
   <dependency>
   <groupId>com.tencent.tsf</groupId>
   <artifactId>spring-cloud-tsf-starter</artifactId>
   <version><!-- 调整为 SDK 最新版本号 --></version> 
   </dependency>
  1. 向 Application 类中添加注解 @EnableTsf
   // 下面省略了无关的代码
   @SpringBootApplication
   @EnableTsf
   public class ProviderApplication {
   public static void main(String[] args) {
       SpringApplication.run(ProviderApplication.class, args);
   }
   }

服务鉴权

您需要在服务主调方和被调方都添加依赖项和注解的开启。此时您已经对服务开启了鉴权功能,任何到达服务的请求都会被鉴权,鉴权不通过时会返回 HTTP 403 Forbidden。

如果请求双方想使用基本 tag 的鉴权规则,那么:

  • 对于 provider 而言,需要在控制台上设置 tag 鉴权规则。

  • 对于 consumer 而言,需要在业务代码中设置 tag 的内容。

  1. 控制台上配置鉴权规则 。

  2. 在 consumer 中设置 tag ,使用org.springframework.tsf.core包中的TsfContext类。设置 Tag 的方法签名如下:

/**
    * 设置多个 tag。如果有某个 tag 之前已经被设置过,那么它的值会被覆盖。
    */
   public static void putTags(Map<string, string=""> tagMap, Tag.ControlFlag... flags) {}</string,></dx-codeblock>

/\*\*
\* 设置单个 tag。如果该 key 之前已经被设置过,那么它的值会被覆盖。
\*/
public static void putTag(String key, String value, Tag.ControlFlag... flags) {}

其中 flags 决定 tag 的使用场景,如果您没有特殊需要,不传即可:

public enum ControlFlag {
    TRANSITIVE,     // 表示标签要传递下去,默认不启用。
    NOT_IN_AUTH,    // 表示标签不被使用在服务鉴权,默认是被使用的。
    NOT_IN_ROUTE,   // 表示标签不被使用在服务路由,默认是被使用的。
    NOT_IN_SLEUTH   // 表示标签不被使用在调用链,默认是被使用的。
}

TSF 提供的 Demo consumer-demo/src/main/java/com/tsf/demo/consumer/Controller.java 中提供了一个设置 tag 的例子:

@RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
public String rest(@PathVariable String str, @RequestParam String user) {
    TsfContext.putTag("user", user); 
    return restTemplate.getForObject("http://provider-demo/echo/" + str, String.class);
}

服务限流

在应用工程中添加依赖和注解后,您可以直接在控制台上配置限流规则 。

当您开启服务限流功能后,任何到达的请求都会被限流模块处理。如果该服务上的配额已经消耗完,会对请求返回 HTTP 429 Too Many Requests;否则会正常放行。

服务路由

在应用工程中添加依赖和注解后,您可以直接在控制台上配置限流规则 。

服务熔断

TSF 摒弃了已经不再继续维护的 Hystrix 断路器,采用官方推荐的 Resilience4J 作为底层实现。相比较原有单一的接口级别熔断,我们在此之上扩展成为:实例、API、服务级别熔断。同时,除了错误比率,TSF 也支持超时比率熔断,允许用户根据业务自行选择熔断配置。请配合 TSF 其他功能一起使用。

  1. 关闭 Hystrix。 使用 TSF 熔断功能需要将 Hystrix 关闭(默认是关闭的,如果之前有打开还请关闭) 。

注意:

如果您已经使用了 feign 的 fallback 或者 fallbackFactory 功能,此处将会不再生效。如果您需要继续使用该功能或需要使用更丰富的容错功能 。

   feign:
   hystrix:
     enabled: false
  1. 进行熔断配置

目前支持两种方式的熔断配置:

  • 方式一:在线动态配置下发 。

  • 方式二:本地静态配置(适合本地联调使用,如果线上使用会被在线配置覆盖,请谨慎使用),配置在 yaml 配置文件中。

   #此处为namespaceId,若为本地联调,则保持一致即可。
   #线上环境不需要此字段
   tsf_namespace_id: default_namespace

   tsf:
     circuit-breaker:
       # 可以配置多条规则 
       rules:
         # 需要熔断的目标微服务名
         - targetServiceName: provider-demo
           # 熔断级别 API/SERVICE/INSTANCE
           isolationLevel: API
           # 目标熔断服务的namespaceId,如果本地联调,需与tsf_namespace_id保持一致
           targetNamespaceId: "default_namespace"
           # SERVICE和INSTANCE级别,只允许配置一个策略
           # API级别可以针对不同的API配置多个策略,也可以多个API配置一个策略
           strategyList:
               # 滑动窗口大小
             - slidingWindowSize: 10
               # 最小熔断请求数
               minimumNumberOfCalls: 10
               # 熔断错误比例
               failureRateThreshold: 60
               # 打开到半开状态的时间
               waitDurationInOpenState: 5
               # 最大熔断实例个数百分比
               # 只在INSTANCE级别生效
               maxEjectionPercent: 51
               # 慢请求阈值,单位为ms
               slowCallDurationThreshold: 60000
               # 慢请求熔断比例
               slowCallRateThreshold: 50
               # 该策略作用的API,可以同时作用于多个API
               apiList:
                 - method: GET
                   path: "/echo/{param}"
                 - method: GET
                   path: "/echo2/{str}"