Sentinel的官方标题是:分布式系统的流量防卫兵。从名称上看,很容易猜出它是用来保证服务稳定性的。如果您熟悉Spring的服务稳定性保证组件 Hystrix应该是Cloud用户的第一反应。不幸的是,Netflix已经宣布停止更新Hystrix。那么,未来我们还有什么更好的选择呢?除Spring外 除了Cloud官方推荐的resilience4j,目前Springn Cloud 集成在Alibaba下的Sentinel也是用户可以关注和选择的目标。
Sentinel有很多功能和细节,很难完整介绍一篇文章。所以下面我将分多篇文章逐一介绍Sentinel的重要功能。本文从限流入手,谈谈如何将Sentinel整合到Spring中 在Cloud应用中,以及如何使用Sentinel 配置限流规则的Dashboard。通过这个简单的例子,首先建立这套基本配置。
使用Sentinel实现接口限流Sentinel的使用分为两部分:
- sentinel-dashboard:类似于hystrix-dashboard,但更强大。除了像hystrix-dashboard一样提供实时监控外,还提供流量控制规则和熔断规则的在线维护。
- 客户端集成:每个微服务客户端都需要集成sentinel的客户端包装和配置,才能向dashboard报告监控信息,实时更改限流或熔断规则。
让我们分两部分来看看如何使用Sentienl来实现界面限流。
部署Sentinel Dashboard- 下载地址:sentinel-dashboard-1.6.0.jar
- 其他版本:Sentinel/releases
我们目前正在使用1.6.目前已升级到1.88.3了。
通过命令启动:
java -jar sentinel-dashboard-1.6.0.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 分钟;
输入帐户密码登录后,登录成功。
Sentinel集成第一步:Spring Cloud应用pom.xml
引入Spring Cloud Sentinel模块Alibaba:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
第二步:Spring 通过Cloud应用spring.cloud.sentinel.transport.dashboard
sentinel参数配置 dashboard访问地址,如:
spring.application.name=alibaba-sentinel-rate-limitingserver.port=8003# sentinel dashboardspring.cloud.sentinel.transport.dashboard=http://localhost:8080
第三步:创建应用主类,并提供rest接口,例如:
@SpringBootApplicationpublic class SentinelRateApplication { public static void main(String[] args) { SpringApplication.run(SentinelRateApplication.class); } @Slf4j @RestController static class TestController { @GetMapping("/hello") public String hello(@RequestParam(value = "name") String name) { log.info("server name:"+name); return "hello:" + name; } }}
第四步:启动应用程序,然后通过postman或curl访问几次localhost:8003/hello?name=222
接口。
此时,Sentinel在上一节开始 我们目前可以在Dashboard中启动alibaba-sentinel-rate-limiting
实时监控此服务和接口调用。具体如下图所示:
特别说明:
然而,有一种情况,例如,我们的sentinel部署在A服务器上,但我们必须将服务部署到本地,并在服务看到上面实时监控。
问题原因:一般是sentinel
由于服务器与项目服务器时间不一致而导致服务器与项目服务器时间不一致
把sentinel
将服务器和项目服务器的时间改为一致,重新启动项目访问接口是正常的(最好部署到同一个服务器)
以上两节完成后,我们在alibaba-sentinel-rate-limiting
点击服务下簇点链路
菜单,可以看到以下界面:
其中/hello
接口是我们在上一节中实现和调用的接口。点击流控
为接口设置限流规则的按钮,如:
以下是最简单的配置:
- 阈值类型选择:QPS
- 单机阈值:1
综合配置效果是界面限流策略每秒最多允许两个请求进入。
点击新增
按钮后,您可以看到以下界面:
实际上是左边菜单流控规则
在界面上,您可以看到当前设置的所有限流策略。
在完成上述所有内容后,我们可以尝试快速调用接口,看看它是否会触发限流控制,例如:
Blocked by Sentinel (flow limiting)
可以看出,快速调用两次/hello
接口完成后,第二次调用受到限制。