Sentinel — 微服务保护
微服务架构将大型应用程序拆分为多个小而独立的服务,每个服务可以独立部署和扩展。然而,微服务系统需要面对的挑战也随之增加,例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此,微服务保护措施是确保系统在高并发、资源消耗和恶意攻击等压力下依然稳定运行的重要手段。
保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护。
1. 微服务保护方案
微服务保护的方案有很多,比如:请求限流、线程隔离、服务熔断等
这些方案或多或少都会导致服务的体验上略有下降,比如请求限流,降低了并发上限;线程隔离,降低了可用资源数量;服务熔断,降低了服务的完整度,部分服务变的不可用或弱可用。因此这些方案都属于服务降级的方案。但通过这些方案,服务的健壮性得到了提升,
1.1 请求限流
服务故障最重要原因,就是并发太高!解决了这个问题,就能避免大部分故障。当然,接口的并发不是一直很高,而是突发的。因此请求限流,就是限制或控制接口访问的并发流量,避免服务因流量激增而出现故障。
请求限流往往会有一个限流器,数量高低起伏的并发请求曲线,经过限流器就变的非常平稳。这就像是水电站的大坝,起到蓄水的作用,可以通过开关控制水流出的大小,让下游水流始终维持在一个平稳的量。
1.2 线程隔离
为了避免某个接口故障或压力过大导致整个服务不可用,我们可以限定每个接口可以使用的资源范围,也就是将其“隔离”起来。
将不同的服务或模块隔离开来,每个服务或模块拥有独立的资源配额和线程池,防止资源被耗尽。
1.3 服务熔断
在某个服务出现故障时,快速失败而不是等待超时,以防止故障传播。
线程隔离虽然避免了雪崩问题,但故障服务依然会拖慢服务调用方的接口响应速度。
所以,我们要做两件事情:
-
编写服务降级逻辑:就是服务调用失败后的处理逻辑,根据业务场景,可以抛出异常,也可以返回友好提示或默认数据。
-
异常统计和熔断:统计服务提供方的异常比例,当比例过高表明该接口会影响到其它服务,应该拒绝调用该接口,而是直接走降级逻辑。
2. 微服务保护实现
微服务保护的技术有很多,但在目前国内使用较多的还是Sentinel。
2.1 Sentinel介绍
Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。
官方网站:https://sentinelguard.io/zh-cn/
2.2 Sentinel服务部署
2.2.1 下载
下载jar包,下载地址:https://github.com/alibaba/Sentinel/releases
2.2.2 运行
将jar包放在任意非中文、不包含特殊字符的目录下,重命名为sentinel-dashboard.jar
然后运行如下命令启动控制台:
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
其它启动时可配置参数可参考官方文档:https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9
2.2.3 访问
访问http://ip:8090(ip替换为部署Sentinel的服务器的ip)页面,就可以看到sentinel的控制台了
需要输入账号和密码,默认都是:sentinel
登录后,即可看到控制台,默认会监控sentinel-dashboard服务本身
2.3 微服务整合
2.3.1 引入依赖
<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.3.2 配置
application.yaml文件,添加下面内容:
spring:cloud: sentinel:transport:dashboard: ip:8090http-method-specify: true # 开启请求方式前缀
2.4 请求限流
sentinel控制台,在簇点链路后面点击流控按钮,即可对其做限流配置。
选择阈值类型为:QPS,单机阈值假设为6。
这样就把这个簇点资源的流量限制在了每秒6个,也就是最大QPS为6。
2.5 线程隔离
限流可以降低服务器压力,尽量减少因并发流量引起的服务故障的概率,但并不能完全避免服务故障。一旦某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩。
首先,开启Feign的sentinel功能:
feign:sentinel:enabled: true # 开启feign对sentinel的支持
然后,在某个接口A下的,Feign接口调用簇点,后面点击流控按钮,即可对其做隔离配置。
选择阈值类型为:并发线程数,单机阈值假设为6。
这里勾选的是并发线程数限制,也就是说这个Feign接口调用最多使用6个线程,而不是6QPS。
此时如果我们通过页面访问接口A所在服务的其它接口,发现不受影响。这就证明线程隔离起到了作用,尽管接口A并发很高,但是它能使用的线程资源被限制了,因此不会影响到其它接口。
2.6 服务熔断
在上面,我们利用线程隔离对接口A业务进行隔离,保护其它接口。由于接口A下的Feign接口调用服务的耗时较高,再加上线程隔离限定了线程数为6,导致接口吞吐能力有限。这就导致了几个问题:
第一,Feign接口调用超出上限的请求就只能抛出异常,从而导致接口A业务失败。但从业务角度来说,即便Feign接口调用失败,接口A数据也应该展示给用户,用户体验更好。也就是给Feign接口调用失败设置一个降级处理逻辑。
第二,由于Feign接口调用业务的延迟较高,从而导致接口A的响应时间也变的很长。这样不仅拖慢了接口A服务,消耗了接口A服务的更多资源,而且用户体验也很差。对于Feign接口调用服务这种不太健康的接口,我们应该直接停止调用,直接走降级逻辑,避免影响到当前服务。也就是将Feign接口调用接口熔断。
2.6.1 降级处理
触发限流或熔断后的请求不一定要直接报错,也可以返回一些默认数据或者友好提示,用户体验会更好。
(1)在Feign模块中给ItemClient定义降级处理类,实现FallbackFactory
package com.cyt.api.client.fallback;@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause);// 查询允许失败,查询失败,返回空集合return CollUtils.emptyList();} };}
}
(2)在Feign模块中的com.cyt.api.config.DefaultFeignConfig类中将ItemClientFallback注册为一个Bean
(3)在Feign模块中的ItemClient接口中使用ItemClientFallbackFactory

重启后,再次测试,发现被限流的请求不再报错,走了降级逻辑。
2.6.2 熔断
Sentinel中的断路器不仅可以统计某个接口的慢请求比例,还可以统计异常请求比例。当这些比例超出阈值时,就会熔断该接口,即拦截访问该接口的一切请求,降级处理;当该接口恢复正常时,再放行对于该接口的请求。
断路器的工作状态切换有一个状态机来控制:
状态机包括三个状态:
-
closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
-
open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态持续一段时间后会进入half-open状态
-
half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
-
请求成功:则切换到closed状态
-
请求失败:则切换到open状态
-
我们可以在控制台通过点击簇点后的熔断按钮来配置熔断策略。这里是,接口A下的,Feign接口调用簇点后的熔断按钮。

这种是按照慢调用比例来做熔断,上述配置的含义是:
-
RT超过200毫秒的请求调用就是慢调用
-
统计最近1000ms内的最少5次请求,如果慢调用比例不低于0.5,则触发熔断
-
熔断持续时长20s
3. 总结
假设在微服务架构中,有 微服务 A 的接口 A 通过 OpenFeign 远程调用了 微服务 B 的接口 B。为了保证系统的稳定性和可靠性,我们可以通过以下策略来实现对请求的保护和故障隔离:
3.1 请求限流
请求限流主要作用在接口 A 上,用于限制进入接口 A 的并发请求数量。限流可以设定每秒钟允许的最大请求数,以防止突发流量导致服务过载。比如,如果我们设置接口 A 的限流为每秒最多 100 次请求,当达到上限后,多余的请求会被拒绝或延迟处理,避免接口 A 过载。
3.2 线程隔离
线程隔离则用于接口 B 的调用。为了防止接口 B 的性能问题影响 微服务 B 内部的其他接口或服务,我们可以为接口 B 配置一个独立的线程池或信号量,限制其并发请求数。例如,将接口 B 的线程池大小设置为 10,可以确保在高并发场景下接口 B 不会占用过多的资源,保护微服务 B 的其他功能模块。这样,即使接口 B 出现性能问题,也能与其他接口实现隔离,避免影响微服务 B 的整体服务能力。
3.3 服务熔断
服务熔断是一种故障保护机制,当接口 B 的健康状况不佳时,主动中断调用链,以保护调用方 微服务 A 的稳定性。熔断机制通常基于请求的失败率、超时率或慢请求比例等指标。例如,我们可以统计接口 B 的慢请求(即超过设定时间的请求)比例和异常请求(抛出异常的请求)比例,当这些比例超出预设阈值(如,10 秒内错误请求比例超过 50%),就触发熔断。
一旦触发熔断,调用接口 B 的所有请求将被短路,不再真正调用接口 B,而是直接执行降级逻辑,避免系统资源浪费在不可用的服务上。熔断状态会持续一段时间,直到系统检测到接口 B 的健康状况恢复,才会重新允许请求流入。
3.4 降级处理
在服务熔断触发后,可以执行降级策略。降级策略可以包括返回默认数据、从缓存中读取数据,或者提供友好的错误提示,确保即使接口 B 不可用,微服务 A 也能继续对外提供服务,改善用户体验。降级处理有助于提升系统的可用性,避免因部分微服务不可用而导致整体服务崩溃。
综上所述,这些微服务保护措施(限流、线程隔离、熔断和降级)共同协作,有助于在高并发和异常情况下保障系统的稳定性和用户体验。其中,限流用于限制接口 A 的流量,线程隔离保证接口 B 的资源独立性,熔断机制快速响应接口 B 的故障,降级策略则提供友好的故障处理机制。
相关文章:
Sentinel — 微服务保护
微服务架构将大型应用程序拆分为多个小而独立的服务,每个服务可以独立部署和扩展。然而,微服务系统需要面对的挑战也随之增加,例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此,微服务保护措施是确保系统在高并发、资…...
Cynet:全方位一体化安全防护工具
前言 1999年,布鲁斯施奈尔曾说过:“复杂性是安全最大的敌人。”彼时还是19年前,而现在,网络安全已然变得更加繁杂。 近日我在网上冲浪过程中发现了这么一个平台性质的软件,看似具有相当强的防护能力。 根据Cynet的描…...
python中常见的8种数据结构之一数组的应用
在Python中,数组是一种常见的数据结构,用于存储一系列相同类型的元素。在实际应用中,数组可以用于解决各种问题。 以下是数组在Python中的一些常见应用: 1. 存储和访问数据:数组可以用于存储和访问一组数据。可以通过…...
安装多个低版本谷歌Chrome浏览器用于测试,适配Vue3+vite项目
安装多个低版本谷歌Chrome浏览器用于测试,适配Vue3vite项目 问题:使用vue3tsvite搭建了一个项目,在chrome新版本浏览器上无问题,但是部署到现场页面直接空白,且控制台报错: Uncaugnt SyntaxError: Unexpe…...
UI组件---如何设置el-pagination分页组件的背景色
1. 要替换 el-pagination 组件的背景色,您可以通过自定义CSS来实现。 具体的CSS规则取决于您想要更改的是哪个部分的背景色,例如普通页码、活跃页码、上下导航箭头等。以下是一些示例CSS规则,您可以根据自己的需求进行调整: /* …...
LabVIEW编程过程中为什么会出现bug?
在LabVIEW编程过程中,Bug的产生往往源自多方面原因。以下从具体的案例角度分析一些常见的Bug成因和调试方法,以便更好地理解和预防这些问题。 1. 数据流错误 案例:在一个LabVIEW程序中,多个计算节点依赖相同的输入数据&#…...
论文阅读《Structure-from-Motion Revisited》
摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步,但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术,它改进了目前…...
RK android14 第三方app获取su权限
需要修改的地方如下 frameworks/base/core/jni/com_android_internal_os_Zygote.cpp kernel-6.1/security/commoncap.c system/core/init/selinux.cpp system/core/libcutils/fs_config.cpp system/extras/su/su.cpp device/rockchip/common/BoardConfig.mk device/rockchip…...
线程与进程的区别(面试)
一.进程 进程:一个程序启动起来,就会对应一个进程,进程就是系统分配资源的基本单位。 上面一部分进程是我们自己去执行应用的可执行文件, 而另一部分是操作系统自动启动的进程. 二.线程 线程:线程是进程中的一个执行单元ÿ…...
OpenDroneMap Webodm
OpenDroneMap & Webodm OpenDroneMap Webodm 开源无人机航拍系列图像及其它系列图像三维重建软件。很棒的开源无人机测绘软件OpenDroneMap,从航拍图像生成精确的地图、高程模型、3D 模型和点云。 应用领域 Mapping & Surveying 测绘和测量 从图像测量获得高精度的可…...
Could not create task ‘:shared_preferences_android:generateDebugUnitTestConfig‘
flutter项目使用shared_preferences库的时候,打开flutter项目中的android项目运行,会出现如下错误信息: A build operation failed. Could not create task :shared_preferences_android:generateDebugUnitTestConfig. Could not create…...
CSS教程(四)- 字体
1、尺寸单位 px 像素单位% 百分比,参照父元素对应属性的值进行计算em 字体尺寸单位,参照父元素的字体大小计算,1em16pxrem字体尺寸单位,参照根元素的字体大小计算,1rem16px 2、字体属性 介绍 CSS Fonts (字体)属性用于定义字体…...
深入理解Java中的Lambda表达式
在Java 8中,Lambda表达式的引入无疑是一个重大的里程碑。 Lambda表达式以其简洁的语法和强大的功能,极大地改变了Java开发者编写代码的方式。本文将深入探讨Lambda表达式的概念、语法、使用场景以及其在函数式编程中的意义。 一、Lambda表达式的基本概…...
C#里怎么样判断一个数是偶数还是奇数
一般是采用取余的做法。 程序如下: /** C# Program to Check whether the Entered Number is Even or Odd*/ using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace check1 {class Program{static void Main(string[]…...
【论文笔记】Prefix-Tuning: Optimizing Continuous Prompts for Generation
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Prefix-Tuning: Optimizin…...
GNN系统学习:消息传递图神经网络
引言 在开篇中我们介绍了,为节点生成节点表征(Node Representation)是图计算任务成功的关键,我们要利用神经网络来学习节点表征。 消息传递范式是一种聚合邻接节点信息来更新中心节点信息的范式,它将卷积算子推广到了…...
基于gewe制作第一个微信聊天机器人
现在我们制作一个微信智能聊天机器人。发送文字它可以回复一段话,或一张图片,是不是有点小酷! 当然,这种智能回复的算法和数据库我们自己肯定是没有的,所以我们借助于gewe框架的开放API接口来完成我们的功能。 请求参…...
【Python】python使用Moviepy库对mp3文件进行剪切,并设置输出文件的码率
【Python】python使用Moviepy库对mp3文件进行剪切,设置输出文件的码率 一、安装Moviepy库二、代码 一、安装Moviepy库 pip install -i https://mirrors.aliyun.com/pypi/simple/ moviepy二、代码 #!/usr/bin/python # -*- coding: UTF-8 -*- from moviepy.editor …...
海外云手机在出海业务中的优势有哪些?
随着互联网技术的快速发展,海外云手机已在出海电商、海外媒体推广和游戏行业都拥有广泛的应用。对于国内的出海电商企业来说,短视频引流和社交平台推广是带来有效流量的重要手段。借助云手机,企业能够更高效地在新兴社交平台上推广产品和品牌…...
这10款PDF转Word在线转换工具的个人使用经历!!
身为现代办公室中的一位经常需要处理各种文件格式的牛马,在PDF和Word之间转换文件是我时常要处理的事。我试过不少PDF转Word的在线工具,前前后后尝试了10款左右的PDF转word转换工具,其中有四大霸主,深深占据了我对这方面的印象。下…...
Roast:颠覆AI助手模式,打造苏格拉底式思维拷问引擎
1. 项目概述:当AI开始“拷问”你如果你用过市面上那些主流的AI助手,不管是ChatGPT、Claude还是DeepSeek,你大概率有过这样的体验:你抛出一个想法,它总能给你一堆“哇,这个想法太棒了!”、“很有…...
离线语音识别性能提升:Vosk API的3大架构优化策略实践
离线语音识别性能提升:Vosk API的3大架构优化策略实践 【免费下载链接】vosk-api Offline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node 项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api …...
从原理图到Vivado:手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束
从原理图到Vivado:手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束 在ZYNQ7000系列开发中,EMIO引脚的正确分配与约束是实现PS与PL协同工作的关键环节。许多工程师在初次接触ZYNQ架构时,往往会被MIO、EMIO和AXI_GPIO的关系所困扰ÿ…...
流处理优化:提高实时数据处理性能
流处理优化:提高实时数据处理性能 一、流处理优化概述 1.1 流处理优化的定义 流处理优化是指通过优化流处理系统的性能、吞吐量和延迟,提高实时数据处理能力的过程。它涉及优化数据处理管道、资源配置和算法实现。 1.2 流处理优化的价值 低延迟ÿ…...
避坑指南:SciencePlots安装后样式不生效?手把手教你排查Matplotlib的stylelib路径问题
科学绘图样式失效?彻底解决Matplotlib样式库路径配置难题 当你第一次尝试用SciencePlats的science样式美化科研图表时,却发现Python报出KeyError: science is not a valid style的错误提示——这种挫败感我深有体会。作为每天与数据可视化打交道的从业者…...
Taotoken用量看板与成本管理功能的实际使用体验
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板与成本管理功能的实际使用体验 对于需要持续调用大模型API的项目而言,成本的可观测与可控性是管理中的…...
FanControl中文设置终极指南:3个简单步骤让Windows风扇控制说中文
FanControl中文设置终极指南:3个简单步骤让Windows风扇控制说中文 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_…...
工程师幽默竞赛:从技术梗到团队文化的创意表达
1. 项目概述:一场工程师的幽默竞赛如果你在电子工程行业待过一段时间,大概率在《EE Times》这样的行业媒体上,见过那种线条简洁、寓意深刻的单格漫画。漫画本身往往描绘一个充满电子元件、示波器或一脸困惑的工程师的实验室场景,但…...
Acrylic Paint风格在Midjourney中失效的5大隐性陷阱(附官方未公开的--s 700+--style raw协同调参公式)
更多请点击: https://intelliparadigm.com 第一章:Acrylic Paint风格在Midjourney中的本质定义与失效现象全景图 Acrylic Paint(丙烯画)风格在Midjourney中并非原生语义标签,而是一种通过视觉特征逆向建模的提示工程产…...
在Windows上安装Android应用:APK Installer让跨平台操作变得简单
在Windows上安装Android应用:APK Installer让跨平台操作变得简单 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否想过在Windows电脑上直接运行Androi…...
