1. 微服务框架为什么要使用流控降级组件?
为了提高系统运行期间的稳定性和可用性。
在微服务环境下,服务之间存在复杂的调用关系,单个服务的故障或过载可能迅速影响到整个系统,导致服务雪崩效应。流控组件可以限制进入系统的流量,防止系统因超出处理能力而崩溃。降级组件则在服务不可用或响应过慢时,提供降级逻辑,如返回备用数据或执行降级操作,以保证核心业务的正常运行。
需求:对下单接口进行流控。
2. Sentinel 是什么?
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
3. Sentinel 的安装
官方参考文档:quick-start | Sentinel
3.1. sentinel 有两部分构成
- 核心库(Java 客服端):不依赖任何框架/库,能够运行域 Java8 及以上的版本的运行时环境,同时对 Dubbo/Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
3.2. 安装 Sentinel 控制台
3.2.1. 注意版本
Sentinel Version:1.8.6
3.2.2. 官方文档地址
3.2.3. 下载地址
https://github.com/alibaba/Sentinel/releases
3.2.4. 启动 sentinel 客户端
java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
3.2.5. 访问 sentinel 控制台
http://icoolkj-mall-sentinel-dashboard:8888/#/login
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本登录功能,默认用户名和密码都是 sentinel 。
4. sentinel 整合微服务
4.1. 官方参考文档
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
4.2. 以订单服务为例
4.2.1. 引入 sentinel 的依赖
<!-- sentinel 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
4.2.2. 业务代码中配置需要保护的资源
当 SpringBoot 应用接入 Sentinel starter 后,可以针对某个 URL 进行流控,所有的 URL 就自动称为 Sentinel 中的埋点资源,可以针对某个 URL 进行流控。或者使用 @SentinelResource 注解用来标识资源是否被限流、降级。
注意:
- MVC 接口方法自动埋点,不需要配置;
- 非 MVC 接口方法可以使用 @SentinelResource 注解用来标识资源是否被限流、降级;
- 对下单接口进行流控,此处不需要配置处理。
4.2.3. 订单服务添加 application.yml 配置,为订单服务设置 sentinel 控制台地址
spring:
cloud:
sentinel:
transport:
# 添加sentinel的控制台地址 (icoolkj-mall-sentinel-dashboard 注意 host 映射配置)
dashboard: icoolkj-mall-sentinel-dashboard:8888
优化:可以将 sentinel-dashboard 配置移到 Nacos 配置中心。
-
- Nacos 控制台创建 dataId 为 sentinel-dashboard.yml 配置文件,配置内容如下:
spring:
cloud:
sentinel:
transport:
# 添加sentinel的控制台地址
dashboard: icoolkj-mall-sentinel-dashboard:8888
注意:
这里可以指定 spring.cloud.sentinel.transport.port
端口配置,会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
-
- 订单微服务的 application.yml 引入 sentinel-dashboard.yml 配置
spring:
config:
import:
- optional:nacos:${spring.application.name}.yml
- optional:nacos:db-mysql-common.yml # mysql数据库公共配置
- nacos:nacos-discovery.yml
- optional:nacos:seata-client.yml # Seata Client 配置
- optional:nacos:sentinel-dashboard.yml # Sentinel Dashboard 配置
4.3. 重启订单服务,测试
4.3.1. 启动 sentinel 控制台,在 sentinel 控制台配置下单资源的流控规则。
-
- 资源名: 接口的API
- 针对来源: 默认是default,当多个微服务都调用这个资源时,可以配置微服务名来对指定的微服务设置阈值
- 阈值类型: 分为QPS和线程数 假设阈值为10
- QPS类型: 只得是每秒访问接口的次数>10就进行限流
- 线程数: 为接受请求该资源分配的线程数>10就进行限流
注意:需要先访问一次下单接口,sentinel 控制台才会有订单服务配置菜单。
4.3.2. 测试,调整下单接口资源的单机阈值为 1,进行用户下单接口,是否被流控。
注意:
sentinel 需要与应用能够交互,Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。如果你本地应用,远程云服务部署 sentinel 控制台,就无法交互。
5. 小结
通过 sentinel 可以实现微服务的流控降级。