1、Sentinel 简介
1.1 Sentinel是什么:
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
1.2 Sentinel 的主要工作机制:
- 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
- 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
- Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。
1.3 Sentinel的功能特性:
- 流量控制
- 熔断降级
- 系统自适应保护
具体可参考官网介绍:https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5
本文主要从限流入手,说说如何把Sentinel整合到Spring Cloud应用中,以及如何使用Sentinel Dashboard来配置限流规则。
1.4 什么是流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:
流量控制设计理念
流量控制有以下几个角度:
- 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
- 运行指标,例如 QPS、线程池、系统负载等;
- 控制的效果,例如直接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。
2、Sentinel控制台
2.1 获取Sentinel控制台
您可以从 release 页面 下载最新版本的控制台 jar 包。
您也可以从最新版本的源码自行构建 Sentinel 控制台:
- 下载 控制台 工程
- 使用以下命令将代码打包成一个 fat jar:
mvn clean package -DskipTests
2.2 启动
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
使用如下命令启动控制台:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
其中 -Dserver.port=8080
用于指定 Sentinel 控制台端口为 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 分钟;
本地启动,访问:localhost:8080,
输入账户密码登录后,可以看到如下页面:
登录成功后:
注:首次登陆是显示空白,因为这里我启动了其他服务应用。
3、SpringCloud应用整合Sentinel
3.1 添加Sentinel依赖
基于SpringBoot构建一个SpringCloud应用:service-order,pom.xml
中需引入Spring Cloud Alibaba的Sentinel依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
版本号我使用的是 2.2.1.RELEASE,应保持和你的 Spring Cloud Alibaba 应用一致。
3.2 增加配置
spring.cloud.sentinel.transport.port=8719
#sentinel控制台
spring.cloud.sentinel.transport.dashboard=localhost:8080
#服务启动直接建立心跳连接
spring.cloud.sentinel.eager=true
其中,spring.cloud.sentinel.eager=true 可使 你的SpringCloud应用启动时,直接与Sentinel建立心跳连接,访问sentinel 控制台就可以看到服务连接情况,不需要第一次访问应用的某个接口,才连接sentinel。
这里的 spring.cloud.sentinel.transport.port
端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
Feign 的支持
Sentinel 适配了 Feign 组件。如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel
的依赖外还需要 2 个步骤:
- 配置文件打开 Sentinel 对 Feign 的支持,增加如下配置:
feign.sentinel.enabled=true
- 加入
spring-cloud-starter-openfeign
依赖使 Sentinel starter 中的自动化配置类生效:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.3 增加测试类
/**
* @description:
* @author: stwen_gan
* @date:
**/
@RestController
public class TestController {
@GetMapping("/test")
public String test(){
return "测试";
}
}
访问该接口:localhost:9009/test,然后刷新sentinel控制台:http://localhost:8080/
3.4 配置限流规则
在完成了上面后,我们在service-order
服务下,点击簇点链路
菜单,可以看到如下界面:
其中/test
接口,就是我们上一节中实现并调用过的接口。通过点击流控
按钮,来为该接口设置限流规则,比如:
这里做一个最简单的配置:
- 阈值类型选择:QPS
- 单机阈值:1
综合起来的配置效果就是,该接口的限流策略是每秒最多允许1个请求进入。
点击新增
按钮之后,可以看到如下界面:
其实就是左侧菜单中流控规则
的界面,这里可以看到当前设置的所有限流策略。
3.5 验证限流规则
在完成了上面所有内容之后,我们可以尝试一下快速的调用这个接口,看看是否会触发限流控制,比如:
我这里使用postman快速点击,访问多次,就会出现被限流情况(1秒钟内访问超过1次)。
4、网关流控
Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。
4.1 Spring Cloud Gateway网关整合Sentinel
从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:
- route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
- 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
基于SpringBoot再构建一个service-gateway网关模块,使用时需引入以下模块(以 Maven 为例):
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
增加配置:
spring.cloud.sentinel.transport.port=8719
# sentinel 控制台 sentinel/sentinel
spring.cloud.sentinel.transport.dashboard=localhost:8080
将上面的service-order模块配置到service-gateway网关模块统一入口,配置路由规则:
spring.cloud.gateway.routes[0].id=order
spring.cloud.gateway.routes[0].uri=lb://service-order
spring.cloud.gateway.routes[0].predicates[0]=Path=/serviceOrder/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1
启动网关应用,通过网关访问刚才那个测试接口:localhost:1234/serviceOrder/test
刷新sentinel控制台,如下:
gateway应用还可以自定义API分组管理
下一篇讲解:如何将 Sentinel使用Nacos存储限流规则:https://blog.csdn.net/a1036645146/article/details/107844149
参考:https://github.com/alibaba/Sentinel
●阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路
●SpringCloud电商秒杀微服务-Redisson分布式锁方案
查看更多好文,进入公众号--撩我--往期精彩
一只 有深度 有灵魂 的公众号0.0