Sentinel — 微服务保护

news2024/11/28 10:23:36

微服务架构将大型应用程序拆分为多个小而独立的服务,每个服务可以独立部署和扩展。然而,微服务系统需要面对的挑战也随之增加,例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此,微服务保护措施是确保系统在高并发、资源消耗和恶意攻击等压力下依然稳定运行的重要手段。

保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护。

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:8090
      http-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> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public 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 的故障,降级策略则提供友好的故障处理机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Qt制作一个流程变更申请流程进度以及未读消息提醒

1.1加载界面&#xff1a; 界面要素&#xff1a; 成员信息 变更位置申请 接受消息列表 根据角色加载对应界面。 1.2发起变更申请&#xff1a; 用户点击“发起变更申请”按钮。变更申请对话框可编辑&#xff0c;用户填写申请信息&#xff1a; 申请方&#xff08;自动填充&…

Markdown 全面教程:从基础到高级

Markdown 全面教程&#xff1a;从基础到高级 Markdown 是一种轻量级的标记语言&#xff0c;它的设计目标是使书写和阅读文档变得简单而直观。无论是撰写博客、编写文档还是创建 README 文件&#xff0c;Markdown 都是一个非常实用的工具。 目录 Markdown 简介Markdown 的基…

无插件H5播放器EasyPlayer.js关于硬解码和软解码的详细介绍

在当今这个多媒体内容日益丰富的时代&#xff0c;视频播放体验的重要性不言而喻.EasyPlayer.js H5播放器作为一款专为现代Web环境设计的播放器&#xff0c;它不仅提供了流畅的播放体验&#xff0c;还特别注重性能优化。EasyPlayer.js支持多种解码方式&#xff0c;包括硬解码和软…

Multi‐modal knowledge graph inference via media convergenceand logic rule

摘要 媒体融合通过处理来自不同模式的信息并将其应用于不同的领域来实现。传统的知识图很难利用多媒体特征&#xff0c;因为从其他模态引入大量信息降低了表示学习的有效性&#xff0c;并降低了知识图推理的有效性。为了解决这一问题&#xff0c;提出了一种基于媒体融合和规则…

大模型应用编排工具Dify二开之工具和模型页面改造

1.前言 简要介绍下 dify&#xff1a; ​ 一款可以对接市面上主流大模型的任务编排工具&#xff0c;可以通过拖拽形式进行编排形成解决某些业务场景的大模型应用。 背景信息&#xff1a; ​ 环境&#xff1a;dify-0.8.3、docker-21 ​ 最近笔者在做 dify的私有化部署和二次…

【数学】通用三阶矩阵特征向量的快速求法 超简单!!!

目录 三个定理1、3个特征值&#xff08;即根互不相等&#xff09;例题实践2、2个特征值&#xff08;即有一个双重根&#xff09;3、1个特征值&#xff08;即有一个三重根&#xff09;定理证明 三个定理 本定理适用于 所有三阶矩阵 的特征向量求法&#xff01; 1、3个特征值&…

MapReduce 的 Shuffle 过程

MapReduce 的 Shuffle 过程指的是 MapTask 的后半程&#xff0c;以及ReduceTask的前半程&#xff0c;共同组成的。 从 MapTask 中的 map 方法结束&#xff0c;到 ReduceTask 中的 reduce 方法开始&#xff0c;这个中间的部分就是Shuffle。是MapReduce的核心&#xff0c;心脏。 …

【WebRTC】视频采集模块中各个类的简单分析

目录 1.视频采集模块中的类1.1 视频采集基础模块&#xff08;VideoCaptureModule&#xff09;1.2 视频采集工厂类&#xff08;VideoCaptureFactory&#xff09;1.3 设备信息的实现&#xff08;DeviceInfoImpl&#xff09;1.4 视频采集的实现&#xff08;VideoCaptureImpl&#…

江协科技STM32学习- P40 硬件SPI读写W25Q64

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

智慧场馆:安全、节能与智能化管理的未来

在当今社会&#xff0c;智慧场馆已经成为了现代场馆建设的一种重要模式。通过整合先进技术和智能系统&#xff0c;智慧场馆致力于提供全方位的解决方案&#xff0c;以实现场馆的安全性、节能性和智能化管理。本文将深入探讨智慧场馆如何实现安全、节能和全面智能化&#xff0c;…

Facebook与人工智能:推动社交媒体发展的新动力

在数字化时代的浪潮中&#xff0c;社交媒体已成为人们日常生活不可或缺的一部分。作为全球最大的社交平台之一&#xff0c;Facebook凭借其庞大的用户基础和先进的技术&#xff0c;正积极探索与人工智能&#xff08;AI&#xff09;的结合&#xff0c;以推动社交媒体的不断发展。…

【论文复现】自动化细胞核分割与特征分析

本文所涉及所有资源均在这里可获取。 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整…

阿里云文本内容安全处理

1、什么是内容安全 内容安全是一款基于AI算法和云计算技术&#xff0c;对多媒体内容的不宜或违规内容提供识别和标注的产品。该产品&#xff0c;支持对各行业及业务场景下的图片、视频、文本、语音等对象进行检测&#xff0c;可以帮助您提高内容审核效率、提高平台内容质量和用…

双指针算法习题解答

1.移动零 题目链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a;该题要求将数组中为0的元素全部转移到数组的末尾&#xff0c;同时不能改变非零元素的相对位置。 解题思路&#xff1a;我们可以用变量dest和cur将该数组分为三个区域。…

idea、pycharm等软件的文件名红色怎么变绿色

1.问题 有时候在写完代码打算提交的时候&#xff0c;会遇到某个资源文件不是绿色的&#xff0c;不能提交 2.解决方法 右键该文件——git——添加即可 3.不同颜色含义 3.1 蓝色&#xff08;Blue&#xff09; 含义&#xff1a;文件被修改了但尚未保存。蓝色通常表示文件自上…

Python进阶之IO操作

文章目录 一、文件的读取二、文件内容的写入三、之操作文件夹四、StringIO与BytesIO 一、文件的读取 在python里面&#xff0c;可以使用open函数来打开文件&#xff0c;具体语法如下&#xff1a; open(filename, mode)filename&#xff1a;文件名&#xff0c;一般包括该文件所…

ECharts折线图背景渐变设置

目录 引入 1.在一个HTML文件中编写两个图表 2.渐变背景 引入 如何在一个HTML文件中编写两个图表&#xff1a;&#xff08;这个例子基于这个篇文章的基础&#xff09;一篇搞懂前端获取数据-CSDN博客 一个例子&#xff1a; 1.在一个HTML文件中编写两个图表 重点在于名字的不重…

基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 二手…

CSS弹性布局:灵活布局的终极指南

在网页设计中&#xff0c;CSS 弹性布局&#xff08;Flexbox&#xff09;是一个不可或缺的工具。它能帮助你轻松地排列和对齐元素&#xff0c;尤其是在响应式设计中表现出色。今天&#xff0c;我们就来深入探讨一下 Flexbox 的各个属性&#xff0c;让你彻底掌握这个强大的布局工…

OpenJDK Vendor下载选择

首先JDK可以通过idea进行安装 File➡️Project Structure➡️SDK➡️Add SDK➡️Download JDK 然后在JDK版本选择时&#xff0c;Idea提供了很多版本&#xff0c;让我茫然了 OpenJDK国外厂商 供应商 说明 Amazon Corretto 亚马逊云基于OpenJDK构建&#xff0c;收费 Eclipse…