操作场景
服务治理功能包含服务鉴权、服务限流、服务路由和服务熔断,该任务指导您在应用开发过程中配置服务治理功能。
前提条件
在开始开发前,请确保您已经参见 下载 Maven 下载安装了 Java 和 Maven,并且配置了 TSF 私服地址。
说明
若要使用服务熔断功能,请确保 SDK 版本高于1.19。
不支持创建子线程进行调用后的服务治理。
已参见 服务治理 文档熟悉了服务治理功能。
添加依赖
向工程中添加
spring-cloud-tsf-starter
依赖并开启 @EnableTsf
注解。注意
1. 向工程中添加依赖。
在
pom.xml
中添加以下代码:<dependency><groupId>com.tencent.tsf</groupId><artifactId>spring-cloud-tsf-starter</artifactId><version><!-- 调整为 SDK 最新版本号 --></version></dependency>
spring-cloud-tsf-starter
中包含了服务注册发现、服务路由、服务鉴权、服务限流、服务熔断、服务容错、服务监控、分布式配置、调用链功能。
2. 向 Application 类中添加注解 @EnableTsf
:// 下面省略了无关的代码@SpringBootApplication@EnableTsfpublic 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) {}/*** 设置单个 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 功能,此处将会不再生效。如果您需要继续使用该功能或需要使用更丰富的容错功能,请参见 服务容错 步骤3进行配置。
feign:hystrix:enabled: false
2. 进行熔断配置。
目前支持两种方式的熔断配置:
方式一:在线动态配置下发。 具体配置方法请参见 服务熔断使用方法。
方式二:本地静态配置(适合本地联调使用,如果线上使用会被在线配置覆盖,请谨慎使用),配置在 yaml 配置文件中。
tsf_namespace_id: default_namespacetsf: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: GETpath: "/echo/{param}"- method: GETpath: "/echo2/{str}"