微服务学习-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 可以实现微服务的流控降级。

相关推荐
橘子遇见BUG16 分钟前
Unity Shader学习日记 part5 CG基础
学习·unity·游戏引擎·图形渲染
小扳2 小时前
博客之星2024年度-技术总结:技术探险家小板的一年的征程
java·大数据·spring boot·elasticsearch·搜索引擎·spring cloud·微服务
希望奇迹很安静2 小时前
[极客大挑战 2019]PHP
开发语言·学习·web安全·php·ctf·buuctf
ThisIsClark2 小时前
【gopher的java学习笔记】Java中Service与Mapper的关系详解
java·笔记·学习
程序员WANG2 小时前
论文+AI赋能教育:探索变革路径与创新实践。包括word和pdf格式。
人工智能·学习·pdf·教育·变革
123yhy传奇3 小时前
【学习总结|DAY034】Maven高级
java·学习·maven
我们的五年3 小时前
【Linux课程学习】:锁封装(Mutex)线程封装(Thread),this指针
linux·服务器·c语言·c++·学习
fechild3 小时前
npm和webpack学习
学习·webpack·npm
bjzhang753 小时前
微服务知识——4大主流微服务架构方案
微服务·架构
.弗兰克3 小时前
java微服务的异常
java·微服务