七、Spring Cloud Alibaba Sentinel简介
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
一、特性
丰富的场景:Sentinel支持阿里巴巴双11购物节的关键场景超过10年,如秒杀(即控制突然爆发的流量,使其在系统容量的可接受范围内)、消息负载转移、不可靠的下游应用断路。
全面的实时监控:Sentinel提供实时监控功能。您可以以秒为单位查看服务器的监控数据,甚至可以查看节点少于500个的集群的总体运行时状态。
广泛的开源生态系统:Sentinel提供开箱即用的模块,可以轻松地与其他开源框架/库集成,如Spring Cloud、Dubbo和gRPC。要使用Sentinel,您只需要引入相关的依赖项并进行一些简单的配置。
完善的SPI扩展:Sentinel提供易于使用的完善的SPI扩展接口。您可以使用SPI扩展快速定制逻辑,例如,您可以定义自己的规则管理,或者适应特定的数据源。
二、使用Sentinel Dashboard
Sentinel仪表板是一个轻量级控制台,提供机器发现、单服务器资源监控、集群资源数据概述以及规则管理等功能。需要下载Sentinel Dashboard jar包。下载地址是:https://github.com/alibaba/Sentinel/releases 。下载完成后,用以下命令启动:
java -Dserver.port=9000 -Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.4.jar
这里选择的端口是9000。sentinel-dashboard版本是1.8.4。
启动成功后,访问http://localhost:9000/
,默认登陆的用户名和密码是sentinel/sentinel
。
三、资源与规则
的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几个步骤:
- 定义资源
- 定义规则
- 检验规则是否生效
先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
定义资源有很多方式,可以参考 https://sentinelguard.io/zh-cn/docs/basic-api-resource-rule.html 。最方便可能是使用@SentinelResource注解,通过 @SentinelResource 注解定义资源并配置 blockHandler 和 fallback 函数来进行限流之后的处理。注意 blockHandler 函数会在原方法被限流/降级/系统保护的时候调用,而 fallback 函数会针对所有类型的异常。
规则的种类
Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。
Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。
四、简单使用
要在Spring Cloud Alibaba中使用Sentinel,只需要加入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
这里用Consumer模块做演示。启动nacos和Sentinel Dashboard并加入依赖后在application.properties配置:
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=localhost:9000
spring.cloud.sentinel.transport.dashboard配置Sentinel Dashboard的ip和端口,spring.cloud.setinel.transport.port中指定的端口号将在应用程序的相应服务器上启动HTTP服务器,该服务器将与sentinel仪表板交互。例如,如果在Sentinel仪表板中添加了流控规则,则规则数据将被推送到HTTP服务器并由其接收,然后HTTP服务器将规则注册到Sentinel。
在HelloConsumer增加:
@RequestMapping("/index")
@SentinelResource("HelloConsumer-index")
public String index() {
return "index";
}
指定资源名是HelloConsumer-index。启动后访问Sentinel Dashboard,如果看不到Consumer,可以访问http://localhost:7001/consumer/index,重启Sentinel Dashboard或Consumer:
看到簇点链路什么都没有,在浏览器访问http://localhost:7001/consumer/index,再看Sentinel Dashboard:
现在看到记录了。
设置HelloConsumer-index的流控规则:
设置QPS为10。用jmeter访问,设置QPS为20,访问后:
看到异常率是45%。流控已生效。