服务治理
最近更新时间: 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 历史版本使用方法】 。
- 向工程中添加依赖。
在
pom.xml
中添加以下代码:
<dependency>
<groupId>com.tencent.tsf</groupId>
<artifactId>spring-cloud-tsf-starter</artifactId>
<version><!-- 调整为 SDK 最新版本号 --></version>
</dependency>
- 向 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 的内容。
控制台上配置鉴权规则 。
在 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 其他功能一起使用。
- 关闭 Hystrix。 使用 TSF 熔断功能需要将 Hystrix 关闭(默认是关闭的,如果之前有打开还请关闭) 。
注意:
如果您已经使用了 feign 的 fallback 或者 fallbackFactory 功能,此处将会不再生效。如果您需要继续使用该功能或需要使用更丰富的容错功能 。
feign:
hystrix:
enabled: false
- 进行熔断配置
目前支持两种方式的熔断配置:
方式一:在线动态配置下发 。
方式二:本地静态配置(适合本地联调使用,如果线上使用会被在线配置覆盖,请谨慎使用),配置在 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}"