一、Sentinelg介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
1、Sentinel的历史
2012年,Sentinel诞生,主要功能为入口流量控制。
2013-2017年,Sentinel在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel也因此积累了大量的流量归整场景以及生产实践。
2018年,Sentinel开源,并持续演进。
2019年,Sentinel朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对Service Mesh场景也推出了 Envoy 集群流量控制支持,以解决Service Mesh架构下多语言限流的问题。
2020年,推出 Sentinel Go 版本,继续朝着云原生方向演进。
2、Sentinel是什么?
Sentinel的官方标题是:从名字上来看,很容易就能猜到它是用来作服务稳定性保障的。对于服务稳定性保障组分布式系统的流量防卫兵件,如果熟悉Spring Cloud的用户,第一反应应该就是Hystrix。但是比较可惜的是Netflix已经宣布对Hystrix停止更新。那么,在未来我们还有什么更好的选择呢?除了Spring Cloud官方推荐的resilience4j之外,目前Spring Cloud Alibaba下整合的Sentinel也是用户可以重点考察和选型的目标。
3、Sentinel基本概念
3.1、资源
资源是Sentinel 的关键概念。它可以是Java应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过Sentinel API定义的代码,就是资源,能够被Sentinel保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
3.2、规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
4、Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
- 完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
5、Sentinel与Hystrix、resilience4j[rɪˈzɪliəns]的对比:
Sentinel官方文档地址:
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
关于每个功能使用里面都有详细介绍。
二、使用Sentinel实现接口限流
Sentinel的使用分为两部分:
sentinel-dashboard:与hystrix-dashboard类似,但是它更为强大一些。除了与hystrix-dashboard一样提供实时监控之外,还提供了流控规则、熔断规则的在线维护等功能。
客户端整合:每个微服务客户端都需要整合sentinel的客户端封装与配置,才能将监控信息上报给dashboard展示以及实时的更改限流或熔断规则等。
下面我们就分两部分来看看,如何使用Sentienl来实现接口限流。
1、Sentinel Dashboard
下载:sentinel-dashboard-1.7.1.jar
其他版本:https://github.com/alibaba/Sentinel/releases
通过命令启动:
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
sentinel-dashboard不像Nacos的服务端那样提供了外置的配置文件,比较容易修改参数。不过不要紧,由于sentinel-dashboard是一个标准的spring boot应用,所以如果要自定义端口号等内容的话,可以通过在启动命令中增加参数来调整,比如:-Dserver.port=8888。
默认情况下,sentinel-dashboard以8080端口启动,所以可以通过访问:localhost:8080来验证是否已经启动成功,如果一切顺利的话,可以看到登录页面。
注意:只有1.6.0及以上版本,才有这个简单的登录页面。默认用户名和密码都是sentinel。对于用户登录的相关配置可以在启动命令中增加下面的参数来进行配置:
- -Dsentinel.dashboard.auth.username=sentinel: 用于指定控制台的登录用户名为sentinel。
- -Dsentinel.dashboard.auth.password=123456: 用于指定控制台的登录密码为123456;如果省略这两个参数,默认用户和密码均为sentinel。
- -Dserver.servlet.session.timeout=7200: 用于指定Spring Boot服务端session的过期时间,如7200表7200 秒;60m表示60分钟,默认为30分钟。
输入账户密码登录后,可以看到如下页面:
2、Sentinel的客户端
整合Sentinel新建模块:springcloudalibaba-sentinel
2.1、添加pom依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>c