当前位置: 首页 > news >正文

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 — 微服务保护

微服务架构将大型应用程序拆分为多个小而独立的服务&#xff0c;每个服务可以独立部署和扩展。然而&#xff0c;微服务系统需要面对的挑战也随之增加&#xff0c;例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此&#xff0c;微服务保护措施是确保系统在高并发、资…...

Cynet:全方位一体化安全防护工具

前言 1999年&#xff0c;布鲁斯施奈尔曾说过&#xff1a;“复杂性是安全最大的敌人。”彼时还是19年前&#xff0c;而现在&#xff0c;网络安全已然变得更加繁杂。 近日我在网上冲浪过程中发现了这么一个平台性质的软件&#xff0c;看似具有相当强的防护能力。 根据Cynet的描…...

python中常见的8种数据结构之一数组的应用

在Python中&#xff0c;数组是一种常见的数据结构&#xff0c;用于存储一系列相同类型的元素。在实际应用中&#xff0c;数组可以用于解决各种问题。 以下是数组在Python中的一些常见应用&#xff1a; 1. 存储和访问数据&#xff1a;数组可以用于存储和访问一组数据。可以通过…...

安装多个低版本谷歌Chrome浏览器用于测试,适配Vue3+vite项目

安装多个低版本谷歌Chrome浏览器用于测试&#xff0c;适配Vue3vite项目 问题&#xff1a;使用vue3tsvite搭建了一个项目&#xff0c;在chrome新版本浏览器上无问题&#xff0c;但是部署到现场页面直接空白&#xff0c;且控制台报错&#xff1a; Uncaugnt SyntaxError: Unexpe…...

UI组件---如何设置el-pagination分页组件的背景色

1. 要替换 el-pagination 组件的背景色&#xff0c;您可以通过自定义CSS来实现。 具体的CSS规则取决于您想要更改的是哪个部分的背景色&#xff0c;例如普通页码、活跃页码、上下导航箭头等。以下是一些示例CSS规则&#xff0c;您可以根据自己的需求进行调整&#xff1a; /* …...

LabVIEW编程过程中为什么会出现bug?

在LabVIEW编程过程中&#xff0c;Bug的产生往往源自多方面原因。以下从具体的案例角度分析一些常见的Bug成因和调试方法&#xff0c;以便更好地理解和预防这些问题。 ​ 1. 数据流错误 案例&#xff1a;在一个LabVIEW程序中&#xff0c;多个计算节点依赖相同的输入数据&#…...

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步&#xff0c;但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术&#xff0c;它改进了目前…...

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…...

线程与进程的区别(面试)

一.进程 进程&#xff1a;一个程序启动起来&#xff0c;就会对应一个进程&#xff0c;进程就是系统分配资源的基本单位。 上面一部分进程是我们自己去执行应用的可执行文件, 而另一部分是操作系统自动启动的进程. 二.线程 线程&#xff1a;线程是进程中的一个执行单元&#xff…...

OpenDroneMap Webodm

OpenDroneMap & Webodm OpenDroneMap Webodm 开源无人机航拍系列图像及其它系列图像三维重建软件。很棒的开源无人机测绘软件OpenDroneMap,从航拍图像生成精确的地图、高程模型、3D 模型和点云。 应用领域 Mapping & Surveying 测绘和测量 从图像测量获得高精度的可…...

Could not create task ‘:shared_preferences_android:generateDebugUnitTestConfig‘

flutter项目使用shared_preferences库的时候&#xff0c;打开flutter项目中的android项目运行&#xff0c;会出现如下错误信息&#xff1a; A build operation failed. Could not create task :shared_preferences_android:generateDebugUnitTestConfig. Could not create…...

CSS教程(四)- 字体

1、尺寸单位 px 像素单位% 百分比&#xff0c;参照父元素对应属性的值进行计算em 字体尺寸单位&#xff0c;参照父元素的字体大小计算&#xff0c;1em16pxrem字体尺寸单位,参照根元素的字体大小计算&#xff0c;1rem16px 2、字体属性 介绍 CSS Fonts (字体)属性用于定义字体…...

深入理解Java中的Lambda表达式

在Java 8中&#xff0c;Lambda表达式的引入无疑是一个重大的里程碑。 Lambda表达式以其简洁的语法和强大的功能&#xff0c;极大地改变了Java开发者编写代码的方式。本文将深入探讨Lambda表达式的概念、语法、使用场景以及其在函数式编程中的意义。 一、Lambda表达式的基本概…...

C#里怎么样判断一个数是偶数还是奇数

一般是采用取余的做法。 程序如下&#xff1a; /** 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

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Prefix-Tuning: Optimizin…...

GNN系统学习:消息传递图神经网络

引言 在开篇中我们介绍了&#xff0c;为节点生成节点表征&#xff08;Node Representation&#xff09;是图计算任务成功的关键&#xff0c;我们要利用神经网络来学习节点表征。 消息传递范式是一种聚合邻接节点信息来更新中心节点信息的范式&#xff0c;它将卷积算子推广到了…...

基于gewe制作第一个微信聊天机器人

现在我们制作一个微信智能聊天机器人。发送文字它可以回复一段话&#xff0c;或一张图片&#xff0c;是不是有点小酷&#xff01; 当然&#xff0c;这种智能回复的算法和数据库我们自己肯定是没有的&#xff0c;所以我们借助于gewe框架的开放API接口来完成我们的功能。 请求参…...

【Python】python使用Moviepy库对mp3文件进行剪切,并设置输出文件的码率

【Python】python使用Moviepy库对mp3文件进行剪切&#xff0c;设置输出文件的码率 一、安装Moviepy库二、代码 一、安装Moviepy库 pip install -i https://mirrors.aliyun.com/pypi/simple/ moviepy二、代码 #!/usr/bin/python # -*- coding: UTF-8 -*- from moviepy.editor …...

海外云手机在出海业务中的优势有哪些?

随着互联网技术的快速发展&#xff0c;海外云手机已在出海电商、海外媒体推广和游戏行业都拥有广泛的应用。对于国内的出海电商企业来说&#xff0c;短视频引流和社交平台推广是带来有效流量的重要手段。借助云手机&#xff0c;企业能够更高效地在新兴社交平台上推广产品和品牌…...

这10款PDF转Word在线转换工具的个人使用经历!!

身为现代办公室中的一位经常需要处理各种文件格式的牛马&#xff0c;在PDF和Word之间转换文件是我时常要处理的事。我试过不少PDF转Word的在线工具&#xff0c;前前后后尝试了10款左右的PDF转word转换工具&#xff0c;其中有四大霸主&#xff0c;深深占据了我对这方面的印象。下…...

认识QT以及QT的环境搭建

认识QT 什么是QT&#xff1f; Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。 认识客户端 现在我们所说的客户端开发其实大致分为三种&#xff1a; 1.网页前端开发。 2.桌面应用开发&#xff08;电脑的应用层序&#xff09; 3.移动应用开发。 而我们的QT的主战场就是在…...

Rollup failed to resolve import “destr“ from ***/node_modules/pinia-plugin-pers

在使用uni-appvuu3piniapinia-plugin-persistedstate开发中&#xff0c; 使用pinia-plugin-persistedstate 一直在报错&#xff0c;其实代码也是比较简单的&#xff0c; import { createPinia } from pinia // 创建 pinia 实例 const pinia createPinia(); import piniaPlugi…...

Python小白学习教程从入门到入坑------第三十课 文件定位操作(语法进阶)

一、文件指针 python中严格来说没有指针这个说法&#xff0c;但有指针这个用法的体现。指针概念常用于c语言、c语言中 在Python的文件操作中&#xff0c;文件指针&#xff08;也称为文件游标或文件句柄的位置&#xff09;是一个内部标记&#xff0c;它指示了当前文件操作的读…...

人工智能、机器学习与深度学习:层层递进的技术解读

引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为一个热门话题&#xff0c;几乎渗透到了我们生活的方方面面。从智能手机的语音助手&#xff0c;到自动驾驶汽车&#xff0c;再到医疗诊断中的图像识别&#xff0c;人工智能的应用正在改变我…...

Code Inspector——页面开发提效的神器

写在前面 优点&#xff1a; 开发提效&#xff1a;点击页面上的 DOM 元素&#xff0c;它能自动打开 IDE 并将光标定位至 DOM 的源代码位置&#xff0c;大幅提升开发体验和效率简单易用&#xff1a;对源代码无任何侵入&#xff0c;只需要在打包工具中引入就能够生效&#xff0c…...

如何定制RockyLinux ISO

目标 基于Rocky9官方ISO做定制&#xff0c;构建自己的ISO 可以添加非官方预装的RPM包实现Kickstart自动化安装, 完成分区等操作ISO安装后&#xff0c;可以执行自定义脚本&#xff0c;比如安装你手动添加的RPM包 Rocky9 官方ISO内容分析 挂载Rocky9 ISO&#xff0c;得到如下…...

python基于深度学习的音乐推荐方法研究系统

需求设计 一款好的音乐推荐系统其目的是为用户进行合理的音乐推荐&#xff0c;普通的用户在登录到系统之后&#xff0c;能够通过搜索的方式获取与输入内容相关的音乐推荐&#xff0c;而以管理员登录到系统之后&#xff0c;则可以进行徐昂管的数据管理等内容操作。此次的需求主…...

机器学习系列----介绍前馈神经网络和卷积神经网络 (CNN)

前言 在深度学习领域&#xff0c;神经网络是一种模拟人脑神经元结构和功能的数学模型。它通过大量的层次结构和参数调整来实现模式识别、分类、回归等任务。常见的神经网络结构有前馈神经网络&#xff08;Feedforward Neural Networks&#xff0c;简称 FNN&#xff09;和卷积神…...

vue.js组件和传值以及微信小程序组件和传值

微信小程序组件以及vue.js组件 一.微信小程序组件引用1.创建组件Component2.页面组件引用3.组件传值3.1 父视图传值到子组件 &#xff08;父---->子&#xff09;3.2 子组件传值给父组件 (子---->父)3.3 父组件方法传递到子组件 4. 界面之间的传值4.1 正向传值4.2 反向传值…...

c语言编程题(函数)

1编写函数将一个仅包含整数&#xff08;可能为负&#xff09;的字符串转换为对应的整数 方法一使用标准库函数 atoi atoi 函数是C语言标准库中的一个函数&#xff0c;用于将字符串转换为整数。 代码&#xff1a; #include <stdio.h> #include <stdlib.h> // 包含…...

网站建设电子商务/推广营销方案

Java中的TCP通信程序TCP可以实现两台计算机之间的数据交互通信的两端&#xff0c;要严格区分客户端与服务端两端通信时的步骤&#xff1a;1.服务端程序&#xff0c;需要事先启动&#xff0c;等待客户端连接2.客户端主动连接服务器端&#xff0c;才能成功通信&#xff0c;服务器…...

深圳企业模板建站/seo技术平台

2019独角兽企业重金招聘Python工程师标准>>> (Class<E>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[1]; &#xff0d;&#xff0d;&#xff0d;待续 转载于:https://my.oschina.net/frankies/blog/134329...

网站显示时间代码/app拉新接单平台

在《Elasticsearch 父子关系维护和检索案例分享》一文中介绍了Elasticsearch 父子关系维护和检索的基本功能&#xff0c;本文接着上篇文档&#xff0c;分享同时返回父子数据Elasticsearch 关联查询案例。 本文涉及到的技术点&#xff1a; inner_hits的使用&#xff0c;通过inne…...

东莞手机网站模板/制作网站

win10系统可以直接把U盘格式化成FAT32、NTFS和exFAT格式&#xff0c;但是怎么把U盘格式化成FAT? 【如果要把U盘刷成此格式&#xff0c;要求U盘容量低于4G】 介绍一个简单方法&#xff0c;可以直接使用win10系统。 1、打开cmd命令行&#xff0c;输入 format/? 命令&#xff…...

武昌网站建设公司/特色产品推广方案

为什么要有Set接口? set接口中的方法和Collection中的一样&#xff0c;求大神给我一个set存在的理由~ 2014-03-07 11:51提问者悬赏&#xff1a;5分 | 梁东8 | 分类&#xff1a;JAVA相关 |浏览240次曾是一道去哪网的面试题~~ 分享到&#xff1a; 2014-03-07 12:18网友采纳Set接…...

怎么做公司/seo优化关键词是什么意思

【Flask启动】 在讲解Flask框架的第一章节提到&#xff0c;启动Flask可以直接运行如下代码&#xff1a; if __name__ "__main__":app.run()但启动之后的日志中会包含如下提示&#xff1a; WARNING: This is a development server. Do not use it in a production …...