Spring Cloud Alibaba 参考文档(4)——Sentinel

5. Spring Cloud Alibaba Sentinel

5.1. 简介

随着微服务的流行,服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点,在流量控制、断路、负载保护等多个领域开展工作,保障服务可靠性。
Sentinel 有以下特性:

  • 丰富的使用场景:十年来,Sentinel支撑起了Alibaba双11购物节的关键场景,比如说秒杀活动(也就是控制突发的高并发,使其处于系统容量的可接受范围内),消息负载转移,不可靠下游应用程序的断路。
  • 全面实时监控:Sentinel提供了实时监控的能力,您可以对数据进行秒级监控,甚至可以监控小于500个节点的集群的总体运行时状态。
  • 广泛的开源生态系统:Sentinel提供了开箱即用的模块,可以很容易地与其他开源框架/库集成,比如Spring Cloud, Dubbo, 和 gRPC。您只需要引入相关的依赖项并进行一些简单的配置就可以使用Sentinel。
  • Sound SPI Extensions:Sentinel提供了简单易用的 SPI 扩展接口。您可以很轻松地使用 SPI 扩展来自定义逻辑,比如您可以定义自己的规则管理,或兼容特定的数据源。

5.2. 如何使用 Sentinel

如果您想在您的项目中使用 Sentinel, 需要引入以下依赖:

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>

下面这段代码是使用Sentinel的简单示例:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); } } @RestController public class TestController { @GetMapping(value = "/hello") @SentinelResource("hello") public String hello() { return "Hello Sentinel"; } }

@SentinelResource注解用来定义一个资源是否被限制流量或流量降级的。注解的属性“hello”用作标识资源的名称。

@SentinelResource注解也提供了其他属性比如blockHandler, blockHandlerClass, 和 fallback来定义限流和降级操作。更多细节请参考Sentinel Annotation Support

以上的例子都是运行在 WebServlet 环境下的。现在Sentinel同样支持 WebFlux, 不过这需要结合spring-boot-starter-webflux依赖来触发Sentinel Starter 中WebFlux相关的自动配置。

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); } } @RestController public class TestController { @GetMapping(value = "/hello") @SentinelResource("hello") public String hello() { return "Hello Sentinel"; } } The @SentinelResource annotation is used to identify if a resource is rate limited or degraded. In the above sample, the 'hello' attribute of the annotation refers to the resource name. @SentinelResource also provides attributes such as blockHandler, blockHandlerClass, and fallback to identify rate limiting or degradation operations. For more details, refer to Sentinel Annotation Support. The above examples are all used in the WebServlet environment. Sentinel currently supports WebFlux and needs to cooperate with the spring-boot-starter-webflux dependency to trigger the WebFlux-related automation configuration in sentinel starter. @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); } } @RestController public class TestController { @GetMapping("/mono") @SentinelResource("hello") public Mono<String> mono() { return Mono.just("simple string") .transform(new SentinelReactorTransformer<>("otherResourceName")); } }

5.2.1. Sentinel dashboard

Sentinel dashboard是一个轻量级控制台,它提供了诸如机器发现、单服务器资源监视、集群资源数据概览以及规则管理等功能。要使用这些特性,您只需要完成几个步骤。
注意: 集群统计概览只支持少于500个节点的集群,约为有1到2秒的延迟。
image.png
图3. Sentinel dashboard

获取 Dashboard

您可以从Release Page下载最新的dashboard jar包。
当然您也可以下载源码自己构建Sentinel dashboard。

  • 下载Dashboard项目
  • 运行命令将代码打包成jar包。mvn clean package

启动 Dashboard

Sentinel dashboard 是一个标准的Spring Boot应用程序。您可以使用Spring Boot应用的模式来运行Sentinel dashboard。

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

如果8080端口被占用了,您可以使用-Dserver.port=new port来指定一个新的端口

5.2.2 配置 Dashboard

application.yml

spring: cloud: sentinel: transport: port: 8719 dashboard: localhost:8080

spring.cloud.sentinel.transport.port指定的端口将在相应的应用程序中启动一个Http服务器,这个服务器将会于 Sentinel Dashboard 交互。举个例子,如果在Sentinel Dashboard 添加了速率限制规则,该规则将被推送到HTTP服务器并由其接收,后者将该规则注册到Sentinel。
关于Sentinel dashboard的更多信息,参考Sentinel dashboard

5.3. OpenFeign 支持

Sentinel 兼容了OpenFeign组件。为了使用OpenFeign, 除了引入sentinel-starter依赖之外,还需要以下两个步骤:

  • 在属性文件中启用Sentinel对OpenFeign的支持:feign.sentinel.enabled = true
  • 添加openfeign starter依赖来启用 Sentinel 支持OpenFeign的自动配置
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>

以下是使用 FeignClient 的示例:

@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class) public interface EchoService { @GetMapping(value = "/echo/{str}") String echo(@PathVariable("str") String str); } class FeignConfiguration { @Bean public EchoServiceFallback echoServiceFallback() { return new EchoServiceFallback(); } } class EchoServiceFallback implements EchoService { @Override public String echo(@PathVariable("str") String str) { return "echo fallback"; } }

注意:Feign对应接口的资源名策略为:httpmethod:protocol://requesturl。Sentinel支持@FeignClient注解中的所有属性。

EchoService接口中echo方法的对应资源名是GET: http://servicprovider/echo/ {str}。

5.4. RestTemplate 支持

Spring Cloud Alibaba Sentinel 支持使用 Sentinel 保护 RestTemplate 服务调用。为此,您需要在构造 RestTemplate 时添加 @SentinelRestTemplate 注解。

@Bean @SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class) public RestTemplate restTemplate() { return new RestTemplate(); }

@SentinelRestTemplate注解的属性支持流控制(blockHandler, blockHandlerClass)和断路(fallback, fallbackClass)。

blockHandlerfallbackblockHandlerClassfallbackClass的静态方法。

@SentinelRestTemplate中的方法的参数和返回值与org.springframework.http.client.ClientHttpRequestInterceptor#interceptor相同,但是它还有一个额外的参数BlockException通过Sentinel来捕获异常。

上面ExceptionUtil中handleException的方法签名应该像这样:

public class ExceptionUtil { public static ClientHttpResponse handleException(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException exception) { ... } }

注意:当应用程序启动时,它将检查流控制或断路方法对应的@SentinelRestTemplate注解是否存在,如果不存在,它将抛出异常。

@SentinelRestTemplate注解的属性是可选的。

当您使用RestTemplate 被sentinel阻塞时,它将返回RestTemplate request block by sentinel。你可以用你自己的逻辑重写它。我们提供SentinelClientHttpResponse来处理响应。

Sentinel RestTemplate为资源速率限制提供了两种粒度:

  • httpmethod:schema://host:port/path: Protocol, host, port and path
  • httpmethod:schema://host:port: Protocol, host and port

注意: 以 Http GET https://www.taobao.com/test 为例. 相应的资源名称有两个粒度级别: GET:https://www.taobao.comGET:https://www.taobao.com/test

5.5. 动态数据源支持

SentinelProperties 提供了 datasource 属性来配置数据源。
举个例子,配置4个数据源:

spring.cloud.sentinel.datasource.ds1.file.file=classpath: degraderule.json spring.cloud.sentinel.datasource.ds1.file.rule-type=flow #spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json #spring.cloud.sentinel.datasource.ds1.file.data-type=custom #spring.cloud.sentinel.datasource.ds1.file.converter-class=JsonFlowRuleListConverter #spring.cloud.sentinel.datasource.ds1.file.rule-type=flow spring.cloud.sentinel.datasource.ds2.nacos.server-addr=localhost:8848 spring.cloud.sentinel.datasource.ds2.nacos.data-id=sentinel spring.cloud.sentinel.datasource.ds2.nacos.group-id=DEFAULT_GROUP spring.cloud.sentinel.datasource.ds2.nacos.data-type=json spring.cloud.sentinel.datasource.ds2.nacos.rule-type=degrade spring.cloud.sentinel.datasource.ds3.zk.path = /Sentinel-Demo/SYSTEM-CODE-DEMO-FLOW spring.cloud.sentinel.datasource.ds3.zk.server-addr = localhost:2181 spring.cloud.sentinel.datasource.ds3.zk.rule-type=authority spring.cloud.sentinel.datasource.ds4.apollo.namespace-name = application spring.cloud.sentinel.datasource.ds4.apollo.flow-rules-key = sentinel spring.cloud.sentinel.datasource.ds4.apollo.default-flow-rule-value = test spring.cloud.sentinel.datasource.ds4.apollo.rule-type=param-flow

此方法遵循Spring Cloud流绑定器的配置。TreeMap用于内部存储,比较器是String.CASE_INSENSITIVE_ORDER

阅读(227)
评论(0)
updated@2020-12-03
评论区
目录