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

ops/2025/1/22 17:58:53/

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


http://www.ppmy.cn/ops/152246.html

相关文章

路径规划之启发式算法之二十八:候鸟优化算法(Migrating Birds Optimization, MBO)

候鸟优化算法(Migrating Birds Optimization, MBO)是一种基于群体智能的元启发式优化算法,其灵感来源于候鸟迁徙时的“V”字形飞行队列。这种队列结构能够有效减少能量消耗,同时提高飞行效率。MBO算法通过模拟候鸟的迁徙行为,利用群体间的协作和信息共享来优化问题的解。 …

63,【3】buuctf web Upload-Labs-Linux 1

进入靶场 点击pass1 查看提示 既然是上传文件&#xff0c;先构造一句话木马&#xff0c;便于用蚁剑连接 <?php eval($_POST[123])?> 上传木马 文件后缀写为.php.jpg 右键复制图片地址 打开蚁剑连接 先点击测试连接&#xff0c;显示成功后&#xff0c;再点击添加即可 …

深入 Java Stream 流

目录 一、Stream 流是什么&#xff0c;为啥它如此重要 二、Stream 流的创建 1. 通过集合创建 2. 通过数组创建 3. 使用 Stream.of () 方法 三、Stream 流的中间操作 1. 过滤&#xff08;filter&#xff09; 2. 映射&#xff08;map&#xff09; 3. 排序&#xff08;so…

Gitlab搭建npm仓库

由于图片和格式解析问题&#xff0c;为了更好阅读体验可前往 阅读原文 使用gitlab的仓库注册表特性需要版本14.0&#xff0c;如果你的版本比较低&#xff0c;请先根据自己的需求合理升级后再使用 npm私有仓库的搭建方式有很多种&#xff0c;比如使用docker(阅读此篇)&#xff…

【基础篇】什么是SQL注入,如何防止?

什么是 SQL 注入&#xff0c;如何防止&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;它发生在 Web 应用程序中&#xff0c;当恶意用户在输入数据时&#xff0c;将恶意的 SQL 代码插入到输入中&#xff0c;从而导致应用程序…

C++ 中的最大值和最小值判断

1. 使用 std::numeric_limits<T>::max() 和 std::numeric_limits<T>::min() std::numeric_limits 是 C 标准库中的模板类&#xff0c;用于获取各种数据类型的最大值和最小值。它提供了一种通用的方式&#xff0c;适用于所有标准数据类型&#xff08;如 int、long、…

网创资源采集插件自动采集更新网站

现在的资源站越来越多人们对资源的需求也是越来越大但是对站长们来说对对资源的争议是比较耗时的比如大家想开一个网状的资源整合站又比较困难大家需要投入很多的人工经历但是我们如果使用插件自动化的采集发布实验全自动交易是一件非常理想的事情利用插件我们可以实现这一目的…

【算法笔记】力扣热题100(LeetCode hot-100)560. 和为 K 的子数组

力扣热题100&#xff08;LeetCode hot-100&#xff09;之 560. 和为 K 的子数组 本文主要记录算法思路&#xff0c;着急要答案的同学可以直接跳转到最后的代码。 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。子数…