微服务Sentinel组件:服务保护详解

ops/2025/3/14 20:35:27/

目录

服务保护简介

服务保护方案

安装与介绍Sentinel

Sentinel整合微服务

服务保护实现

请求限流

线程隔离

OpenFeign整合Sentinel

配置线程隔离

服务熔断

编写降级逻辑

实现服务熔断

服务保护总结


服务保护简介

微服务保护是为了保障系统整体的稳定性和可靠性,保证服务运行的健壮性,避免级联失败导致的雪崩问题。这个是针对于服务之间的调用所呈现的方案。

服务保护方案

请求限流:通过限制到达服务的请求数量来保护后端服务不被过多请求压垮。

线程隔离:将不同服务或任务分配到不同的线程池中执行,以避免某一个服务出现问题时影响其他服务的正常运行。

服务熔断:当某个服务出现故障或者响应时间过长时,自动切断该服务的调用,防止因为等待该服务而导致整个系统的阻塞。

安装与介绍Sentinel

下载jar包

java">https://github.com/alibaba/Sentinel/releases

然后运行如下命令启动控制台:(打开cmd窗口)

java">java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

访问http://localhost:8090页面,就可以看到sentinel的控制台了:

输入用户和密码,都是sentinel,即可登录成功。

Sentinel整合微服务

微服务模块,引入sentinel依赖

java"><!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

修改application.yaml文件,添加下面内容:

java">spring:cloud:sentinel:transport:dashboard: localhost:8090 # sentinelhttp-method-specify: true # 是否设置请求方式作为资源名称

随意测试CRUD的接口,观察控制台如下:即整合成功


服务保护实现

请求限流

问题描述:在流量出现突发增长时,由于并发请求过高,在面对突如其来的流量高峰时容易发生过载,进而引发服务故障。

解决方案:通过实施请求限流措施来限制或控制接口访问的并发流量,可以在很大程度上避免因流量激增而导致的服务故障,从而保障服务的正常运行。

实现过程:

打开Sentinel控制台,点击簇点链路,看到查询接口的流控按钮

点击,设置QPS为5即可

使用Jemeter做限流测试

经过测试对比,明显可以观察到流量削峰。


线程隔离

问题描述:当一个业务接口响应时间长,而且并发高时,就可能耗尽服务器的线程资源,导致服务内的其它接口受到影响。

解决方案:通过实施线程隔离,我们可以将不同接口的执行分配给独立的线程池,从而防止因单一接口耗尽资源而拖垮整个服务的情况发生。这样做的目的是限制故障范围。

OpenFeign整合Sentinel

修改cart-service模块的application.yml文件,开启Feign的sentinel功能:

java">feign:sentinel:enabled: true # 开启feign对sentinel的支持

需要配置一下cart-service模块的application.yml文件,修改tomcat连接:

java">server:port: 8082tomcat:threads:max: 50 # 允许的最大线程数accept-count: 50 # 最大排队等待数量max-connections: 100 # 允许的最大连接

然后重启cart-service服务,可以看到查询商品的FeignClient自动变成了一个簇点资源。

配置线程隔离

接下来,点击查询商品的FeignClient对应的簇点资源后面的流控按钮:

将并发线程数设置为5(如果QPS为5,那么接口一秒只能接收25条请求)

我们利用Jemeter测试,每秒发送100个请求:

观察结果可知:我们去访问其他接口,不会被拖慢速度,实现线程隔离


服务熔断

问题描述:当服务中某个组件或接口出现故障或者响应时间过长时,会导致整个系统性能下降甚至完全不可用。特别是在高并发场景下,如果某个业务接口出现问题,大量的请求会堆积等待,导致线程资源被迅速耗尽,进而影响到整个服务的正常运行。

解决方案:服务熔断正是为此设计的一种保护措施,它能够在检测到指定服务或接口出现问题时,主动切断对该部分的调用,使其进入快速失败模式,从而保护系统的其余部分不受影响,并为故障恢复争取时间。

编写降级逻辑

在公共模块中给ItemClient定义降级处理类,实现FallbackFactory

java">@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Set<Long> ids) {log.error("查询商品失败", cause);return CollUtils.emptyList();}@Overridepublic List<OrderDetailDTO> deductStock(List<OrderDetailDTO> items) {log.error("扣减库存失败", cause);throw new RuntimeException(cause);}

在配置类中注册为bean:

java"> @Beanpublic ItemClientFallbackFactory imageClientFallbackFactory() {return new ItemClientFallbackFactory();}

在OpenFegin配置的远程调用类上使用:

实现服务熔断

服务熔断流程图:

在Sentinel控制台通过点击簇点后的熔断按钮来配置熔断策略:

如下图所示填写对应数据:

我们利用Jemeter测试,每秒发送100个请求,观察结果:

在一开始一段时间是允许访问的,后来触发熔断后,查询商品服务的接口通过QPS直接为0,所有请求都被熔断了。所以成功实现服务熔断。

服务保护总结

在之前,我们为了实现服务之间的远程调用,采用OpenFegin大大简化了客户端代码,轻松实现服务之间的访问。但是,服务之间的访问保护却没有实现。所以,我们引入了Sentinel。

为了防止某个服务因为过载而导致整个系统的响应时间变慢或者崩溃,配置Sentinel的流量控制规则,可以限制对特定微服务的请求频率。请求限流

为了防止一旦某个服务出现故障,因而拖慢了其他服务,导致发生雪崩,可以配置Sentinel限制对特定微服务的请求线程数,限制隔离范围。线程隔离

为了能够在检测到指定服务或接口出现问题时,主动切断对该部分的调用,可以让Sentinel会自动触发熔断机制,阻止对该服务的进一步请求,并快速失败,避免雪崩效应的发生。服务熔断

文章来源:https://blog.csdn.net/2201_75732091/article/details/146163599
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/ops/165760.html

相关文章

【PyTorch教学】pytorch 基本语法

文章目录 PyTorch tensor cheatsheet PyTorch tensor cheatsheet from: https://github.com/hkproj/torch_notes/blob/main/TensorOperations.ipynb Tensor creation / initialization Convert between Numpy and Torch Tensor math Matrix multiplication Batch matrix multip…

蓝桥杯省赛真题C++B组2024-握手问题

一、题目 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人&#xff0c;这 7 人彼此之间没有进行握手(但这…

Uniapp当中的scroll-view滚动条不出现或者触底刷新事件不触发

一、未正确设置容器高度 问题描述 scroll-view 未设置明确高度或高度值无效&#xff0c;导致无法形成有效滚动区域。 解决方案 • 使用行内样式直接设置 height&#xff08;如 style"height: 500rpx;"&#xff09;&#xff0c;避免类名样式被覆盖。 • 动态计算高度…

计算机视觉算法实战——手势识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域简介&#xff1a;手势识别的价值与挑战 手势识别是连接人类自然行为与数字世界的核心交互技术&#xff0c;在智能设备控制、…

代码随想录 DP day2

746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;递推公式和爬楼梯类似&#xff0c;都是思考第i层由什么得来的呢&#xff1f;即i-1和i-2加上对应的cost。 class Solution { public:int minCostClimbingStairs(vector<int>& cost…

科技创新:改变生活的力量与未来趋势

人工智能在智能客服中的应用越来越普遍。它改变了传统的客服模式。AI可以快速回答用户的问题&#xff0c;提高了客服效率和服务质量。 首先&#xff0c;人工智能能够处理大量信息。智能客服可以在几秒钟内回应客户的请求。这比人工客服快得多。客户不需要等待很久就能得到答案…

Visual Studio关闭警告

Visual Studio关闭警告信息 下面的例子基于VS2019, 其他版本类似。 新建项目之后&#xff0c;在里面写一些会产生警告的代码&#xff0c;如&#xff1a; char c 666; 编译器会警告&#xff1a; 除了警告&#xff0c;运行结果也会有问题。可以考虑把警告信息关掉&#xff1a; …

详细解析 ListView_GetEditControl()

书籍&#xff1a;《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.28】支持主项可编辑的列表视图控件 说明&#xff1a;以下内容大部分来自腾讯元宝。 ​函数原型 HWND ListView_GetEditControl(HWND hwndL…