微服务学习-Sentinel 限流保护服务

1. 微服务框架为什么要使用流控降级组件?

为了提高系统运行期间的稳定性和可用性。

在微服务环境下,服务之间存在复杂的调用关系,单个服务的故障或过载可能迅速影响到整个系统,导致服务雪崩效应。流控组件可以限制进入系统的流量,防止系统因超出处理能力而崩溃。降级组件则在服务不可用或响应过慢时,提供降级逻辑,如返回备用数据或执行降级操作,以保证核心业务的正常运行。

需求:对下单接口进行流控。

2. Sentinel 是什么?

官方文档:introduction | 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. 官方文档地址

dashboard | Sentinel

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 配置中心。

    1. 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 中。

    1. 订单微服务的 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 控制台配置下单资源的流控规则。
    1. 资源名: 接口的API
    2. 针对来源: 默认是default,当多个微服务都调用这个资源时,可以配置微服务名来对指定的微服务设置阈值
    3. 阈值类型: 分为QPS和线程数 假设阈值为10
    4. QPS类型: 只得是每秒访问接口的次数>10就进行限流
    5. 线程数: 为接受请求该资源分配的线程数>10就进行限流

注意:需要先访问一次下单接口,sentinel 控制台才会有订单服务配置菜单。

4.3.2. 测试,调整下单接口资源的单机阈值为 1,进行用户下单接口,是否被流控。

注意:

sentinel 需要与应用能够交互,Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。如果你本地应用,远程云服务部署 sentinel 控制台,就无法交互。

5. 小结

通过 sentinel 可以实现微服务的流控降级。

相关推荐
DKPT6 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好好研究9 小时前
学习栈和队列的插入和删除操作
数据结构·学习
新中地GIS开发老师10 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
SH11HF11 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上11 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
Chef_Chen12 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
掘金-我是哪吒12 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
X_StarX14 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生
MingYue_SSS14 小时前
开关电源抄板学习
经验分享·笔记·嵌入式硬件·学习
weixin_4373982115 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang