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

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录

  • 前言
  • 一、雪崩问题及其解决方案
    • 1.1 什么是雪崩问题
    • 1.2 雪崩问题的原因
    • 1.3 解决雪崩问题的方法
    • 1.4 总结
  • 二、初识 Sentinel 框架
    • 2.1 什么是 Sentinel
    • 2.2 Sentinel 和 Hystrix 的对比
  • 三、Sentinel 的安装部署
  • 四、集成 Sentinel 到微服务


前言

微服务架构在现代软件开发中变得越来越重要。它通过将大型应用程序拆分成小而自治的服务单元,使开发、部署和维护变得更加灵活和高效。然而,微服务架构也引入了一些新的挑战,其中之一就是“雪崩”问题。

在这篇文章中,我们将探讨什么是雪崩问题,以及如何应对它。 雪崩问题是指在微服务架构中,一个微服务的故障可能会引发级联效应,导致整个系统不可用。这个问题可能会对业务造成严重影响,因此了解如何预防和处理雪崩问题至关重要。

此外,还将介绍 Sentinel 框架,这是一款由阿里巴巴开源的微服务流量控制组件。 Sentinel 可以帮助我们实时监控微服务的性能,并提供流量控制和熔断降级功能,以减轻雪崩问题的影响。然后,我还将探讨 Sentinel 的功能和优势,并演示如何将其集成到微服务项目中。

一、雪崩问题及其解决方案

1.1 什么是雪崩问题

在微服务架构中,各个微服务之间的依赖错综复杂,一个微服务通常需要依赖多个其他微服务,形成了复杂的调用关系,如下图所示:

微服务依赖关系

在这种情况下,如果某个微服务(如服务I)发生故障,它所依赖的微服务(如A、P、H等)的业务也会受到阻塞。初始阶段,只有依赖服务I的部分业务受到影响,而不依赖服务I的业务似乎不受影响:

部分业务受影响

然而,由于依赖服务I的业务请求被阻塞,这导致Tomcat服务器上的线程不会释放,从而导致越来越多的用户请求堆积,进一步导致越来越多的线程被阻塞:

线程堆积

服务器的线程和并发处理能力是有限的,如果请求持续阻塞,最终会导致服务器资源耗尽,使得所有其他服务也变得不可用,从而导致整个系统陷入瘫痪,这就是所谓的"雪崩"现象:

雪崩效应

在雪崩现象中,一个微服务的故障会引发级联效应,使得整个系统不可用。为了防止雪崩问题的发生,需要采取一些措施来提高系统的稳定性和可用性。接下来,将讨论雪崩问题的原因以及解决方案。

1.2 雪崩问题的原因

雪崩问题通常由以下几个因素引起:

  1. 微服务依赖关系: 微服务之间的复杂依赖关系使得一个微服务的故障可能影响到许多其他微服务。这种依赖关系网络增加了系统的脆弱性。

  2. 延迟积累 :当一个微服务变得不可用或响应变慢时,请求会在等待响应的过程中逐渐积累。这会导致服务器资源不断耗尽,进而导致系统崩溃。

  3. 高并发请求 :随着时间的推移,越来越多的请求会积累,而且这些请求通常是高并发的。这会导致服务器的线程资源耗尽,无法响应新的请求。

1.3 解决雪崩问题的方法

解决雪崩问题的常见方式有四种:

1. 超时处理

超时处理是通过设置合理的请求超时时间来应对雪崩问题。当一个微服务无法及时响应请求时,系统会设定一个最大允许等待时间。如果请求处理时间超过了这个时间限制,系统会立即返回错误信息,而不会无限制地等待。这可以防止请求积累并占用系统资源。

超时处理

2. 仓壁模式

仓壁模式是一种线程隔离的策略,它通过限制每个业务能够使用的线程数来避免耗尽整个Tomcat服务器的资源。在这种模式下,每个微服务的线程资源被隔离开,因此如果一个微服务出现异常,只会影响到其自身的线程,而不会影响其他微服务的线程。

仓壁模式

例如,如上图所示,服务A依赖于服务B和服务C,在服务A中为服务B和服务C分别分配了各自的线程池,即使其中一个微服务发生异常,也只会浪费该微服务的线程,不会影响其他微服务。

3. 熔断降级

熔断降级是通过断路器来统计业务执行的异常比例,当异常比例超出阈值时,会触发熔断机制,拦截访问该业务的所有请求。这样可以避免异常的微服务继续接受请求,减轻其负载,同时也阻止了可能导致雪崩的请求传递。

断路器会统计访问某个服务的请求数量以及异常比例,如下图所示:

断路器统计

当异常比例过高时,认为服务存在导致雪崩的风险,断路器将拦截访问该服务的所有请求,形成熔断,如下图所示:

断路器熔断

此时,访问服务D的请求会被拦截,从而避免雪崩效应的扩散。

4. 流量控制

流量控制是通过限制业务访问的每秒查询率(QPS)来防止雪崩问题。这可以确保系统不会因流量的突然增加而崩溃。通过设定每个微服务的最大QPS值,可以限制请求的数量,防止过多的请求积累并占用系统资源。

流量控制

例如,如上图所示,现在有大量的请求,但只有在限定的QPS下的请求数量才能访问该服务,从而防止过多的请求对系统造成负担。

1.4 总结

雪崩问题是指在微服务架构中,微服务之间相互依赖,当其中一个微服务发生故障或不可用时,其它微服务的请求也会受到影响,最终导致整个系统不可用的现象。可以总结为:

  • 微服务之间的复杂依赖关系导致某个微服务的故障可能会引发级联故障,使整个系统受到影响。

针对雪崩问题,可以采取以下措施:

  • 限流:限制每个微服务的请求并发数,防止过多请求积累,从而减轻服务器压力。是一种预防措施。

  • 超时处理线程隔离降级熔断:这些方法是在某个微服务出现故障时,将故障控制在一定范围,避免它蔓延至整个系统,从而避免雪崩。是一种补救措施。

这些措施有助于提高系统的稳定性和可用性,防止雪崩问题的发生。限流是一种预防措施,而超时处理、线程隔离、降级熔断等是应对已发生问题时的补救措施。综合使用这些方法可以有效应对雪崩问题。

二、初识 Sentinel 框架

2.1 什么是 Sentinel

Sentinel 是一款由阿里巴巴开源的微服务流量控制组件。它被设计用来解决微服务架构中的流量控制和熔断降级等问题。

官网地址:https://sentinelguard.io/zh-cn/index.html。

Sentinel 具有以下特点和功能:

  • 丰富的应用场景: Sentinel可以应用于多种场景,包括处理突发流量、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。它在阿里巴巴双十一大促销活动等高流量场景中得到了验证。

  • 完备的实时监控: Sentinel提供实时的监控功能,允许您查看接入应用的单台机器的秒级数据,甚至是小型集群的汇总运行情况。这有助于及时发现问题并进行调整。

  • 广泛的开源生态: Sentinel提供了与其他开源框架和库的整合模块,如与Spring Cloud、Dubbo、gRPC等的整合。这使得在不同技术栈中快速接入Sentinel变得更加容易。

  • 完善的SPI扩展点: Sentinel具有丰富的扩展接口,允许开发人员通过实现这些接口来定制逻辑,如规则管理和动态数据源适配等。这提供了高度的可扩展性。

Sentinel 的核心功能包括流量控制、熔断降级、系统负载保护、实时监控和控制台等,它在微服务架构中起到了重要的作用,帮助开发者确保系统的稳定性和可用性。

2.2 Sentinel 和 Hystrix 的对比

Hystrix 是 Netflix 开源的一款用于处理分布式系统中的延迟和容错问题的库。它和 Sentinel 的作用差不多,主要用于防止分布式系统中的雪崩效应,提供了线程隔离、熔断降级、超时控制等功能。Hystrix已经被广泛用于构建弹性和可靠的微服务架构。

Sentinel 和 Hystrix 的对比:

SentinelHystrix
隔离策略信号量隔离线程池隔离/信号量隔离
熔断降级策略基于慢调用比例或异常比例基于失败比率
实时指标实现滑动窗口滑动窗口(基于 RxJava)
规则配置支持多种数据源支持多种数据源
扩展性多个扩展点插件的形式
基于注解的支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持
流量整形支持慢启动、匀速排队模式不支持
系统自适应保护支持不支持
控制台开箱即用,可配置规则、查看秒级监控、机器发现等不完善
常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix

上述表格总结了这两个流量控制和容错处理框架的主要特点。这些特点包括隔离策略、熔断降级策略、实时指标实现、规则配置、扩展性、基于注解的支持、限流、流量整形、系统自适应保护、控制台功能以及常见框架的适配。

使用 Sentinel 的情况:

  1. 需要细粒度的流量控制: 如果需要对不同的微服务或接口进行精细的流量控制,Sentinel 提供了信号量隔离和基于 QPS 的限流策略,可以更灵活地管理流量。

  2. 实时监控和控制台功能: Sentinel 提供了实时监控和丰富的控制台功能,允许查看秒级监控数据、配置规则以及进行机器发现。这对于监控和管理微服务非常有用。

  3. 支持多种数据源: Sentinel 支持多种数据源,包括内存、Nacos、Zookeeper等,这使得配置规则更加灵活。

  4. 需要灵活的扩展性: Sentinel 提供多个扩展点,允许通过自定义实现来满足特定需求,如规则管理、动态数据源等。

  5. 需要支持流量整形: Sentinel 支持慢启动和匀速排队模式,可帮助应对流量突发情况。

  6. 需要系统自适应保护: Sentinel 支持系统自适应保护,可以根据系统状态动态调整保护策略。

使用 Hystrix 的情况:

  1. Spring Cloud项目: 如果项目是基于Spring Cloud构建的,Hystrix 是 Spring Cloud Netflix 的一部分,因此更容易集成。

  2. 需要线程池隔离: 如果需要使用线程池隔离来隔离不同微服务的调用,Hystrix 提供了线程池隔离的支持。

  3. 需要更广泛的社区支持: Hystrix 有一个广泛的社区支持,因为它是 Netflix 开源的项目之一,有更多的文档和教程可供参考。

总之,应该根据项目需求、技术栈和团队的熟悉程度来选择使用 Sentinel 还是 Hystrix 。在某些情况下,两者也可以同时使用以获得更全面的容错和熔断降级能力。

三、Sentinel 的安装部署

1. 下载 Sentinel:

Sentinel 官方提供了一个UI控制台,方便我们对系统进行保护的操作,下载 Sentinel 的地址:https://github.com/alibaba/Sentinel/releases。

选择下载 JAR 包即可:

2. 运行:
将 JAR 包放到任意非中文目录,执行下面的命令运行 Sentinel:

java -jar sentinel-dashboard-1.8.1.jar

可以发现,Sentinel 是一个 Spring Boot 项目,默认的端口号是 8080:

如果要修改 Sentinel 的默认端口、账户、密码,可以通过下列配置:

配置项默认值说明
server.port8080服务端口
sentinel.dashboard.auth.usernamesentinel默认用户名
sentinel.dashboard.auth.passwordsentinel默认密码

例如,修改端口:

java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar

3. 服务 Sentinel 控制台

访问http://localhost:8080页面,就可以看到 Sentinel 的控制台,默认的用户和密码都是 sentinel

登录成功后,就可以看到Sentinel的控制台了:

四、集成 Sentinel 到微服务

下面,我们的目标是将Sentinel集成到 cloud-demo 项目中,cloud-demo 是一个简单的微服务项目demo,其结构如下图所示:


现在要求在 order-service 微服务中集成 Sentinel,实现的步骤如下:

  1. 引入 Sentinel 依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. application.yml 配置文件中添加 Sentinel 控制台地址
spring:cloud:sentinel:transport:dashboard: localhost:8080 # Sentinel 控制台地址
  1. 重启 order-service服务,访问任意接口,触发 Sentinel 监控

例如,在浏览器中服务一个订单信息:

再次查看 Sentinel 控制台:


可以发现,此时控制台中出现了一个 orderservice 服务,然后可以对该服务配置各种限流规则。

相关文章:

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…...

20231023 比赛总结

比赛链接 反思 A 花了很长时间&#xff0c;幸亏没怎么调就对了&#xff0c;以后还是应该先看其他题的 括号匹配题的套路感觉没有掌握透&#xff0c;感觉无非就是单调栈&#xff0c;哈希&#xff0c;折线图 B 感觉比 T 1 T1 T1 简单 C 正解还是很妙的&#xff0c;但 68…...

Vite创建vue3+ts+pinia+vant项目起步流程

pnpm介绍&安装 本质上他是一个包管理工具&#xff0c;和npm/yarn没有区别&#xff0c;主要优势在于 包安装速度极快磁盘空间利用效率高 安装&#xff1a; npm i pnpm -g使用&#xff1a; npm命令pnpm等效npm installpnpm installnpm i axiospnpm add axiosnpm i webpa…...

JVM 类的加载子系统

文章目录 类的加载过程加载阶段链接阶段初始化 类的加载器测试代码中获取对应的加载器获取加载器加载的路径不同类对应的加载器自定义加载器自定义加载器的方式 获取类的加载器的方式双亲委派机制双亲委派机制的好处 Java 的 SPI 机制1. 接口定义2. 具体实现3. 配置 META-INF/s…...

什么是1024程序员节

一年一度专属于程序员的节日“1024程序员节”要到来了&#xff0c;相信有很多的小伙伴跟我一样&#xff0c;对这个节日非常的熟悉&#xff0c;但也有一下小伙伴对这个节日非常陌生&#xff0c;没事&#xff0c;下面由我来讲解一下1024程序员节。 目录 节日背景 节日由来 社…...

spark获取hadoop服务token

spark 作业一直卡在accepted 问题现象问题排查1.查看yarn app日志2.问题分析与原因 问题现象 通过yarn-cluster模式提交spark作业&#xff0c;客户端日志一直卡在submit app&#xff0c;没有运行 问题排查 1.查看yarn app日志 appid已生成&#xff0c;通过yarn查看app状态为…...

Simulink 最基础教程(一)

1.1基本概念 一个典型的Simulink模型大致如上图这样&#xff1a; 1&#xff09;模块 block&#xff1a;图中画圈的那些&#xff0c;每个模块可以完成一些特定的任务&#xff0c;类似MATLAB中函数的概念。软件提供了很多模块&#xff0c;当然也可以自定义新的模块 2&#xff0…...

微信小程序:单行输入和多行输入组件

微信小程序提供了两种输入类型的输入框组件&#xff0c;分别是单行输入框 <input> 和多行输入框 <textarea>。 1. 单行输入组件&#xff08;input&#xff09; 单行输入框 <input> <input> 是一个用于收集用户输入的组件&#xff0c;主要用于收集单行…...

1024程序员

听说今天可以拿勋章&#xff0c;嘿嘿...

【Segment Anything Model】八:修改SAM源码做分类任务

🍉 博主微信 cvxiayixiao 🍓 【Segment Anything Model】计算机视觉检测分割任务专栏。 链接 🍑 【公开数据集预处理】特别是医疗公开数据集的接受和预处理,提供代码讲解。链接 🍈 【opencv+图像处理】opencv代码库讲解,结合图像处理知识,不仅仅是调库。链接 文章目…...

Java后端开发——实现登录验证程序

一、实现一个简单登录验证程序 实现一个简单的用户登录验证程序&#xff0c;如果用户名是 abc &#xff0c;密码是 123&#xff0c;则显示欢迎用户的信息&#xff0c;否则显示“用户名或密码不正确”。 【分析】 该案例采用 JSP 页面只完成提交信息和验证结果的显示&#xff…...

CSS高频面试题

1.行内元素有哪些?块级元素有哪些?空元素有哪些&#xff1f;CSS的盒模型? 块级元素&#xff1a;div, p, h1-h6,form, ul ,li行内元素&#xff1a;a, b, br, span, i, input, select行内块级元素&#xff1a;img , input空元素&#xff1a;即没有内容的HTML元素&#xff0c;…...

解决matlab报错“输入参数的数目不足”

报错语句&#xff1a;tanh((peakNums-parameter)/2) 报错提示&#xff1a;输入参数的数目不足 运行环境&#xff1a;matlab2021b 分析原因&#xff1a; 当执行peakNums - parameter时&#xff0c;如果peakNums和parameter都是向量&#xff0c;那么这并不一定意味着会得到对应…...

使用python_opencv比较图像差异/使用python_opencv找出两张图像的差异范围

目录 1 创建conda环境 2 安装python库 2.1 报错 ModuleNotFoundError: No module named numpy 3 image_diff.py...

NOIP2023模拟1联测22 爆炸

NOIP2023模拟1联测22 爆炸 题目大意 ​ 自己看 思路 当一个炸弹被引爆后&#xff0c;它的方向是固定的。如果被竖着引爆&#xff0c;那么应该选择横着引爆&#xff0c;否则选择竖着引爆&#xff0c;这是显然 的。 考虑对于每个炸弹 ( i , j ) (i , j) (i,j) 将第 i i i 行…...

http post协议实现简单的rpc协议,WireShark抓包分析

文章目录 1.http 客户端-RPC客户端1.http 服务端-RPC服务端3.WireShark抓包分析3.1客户端到服务端的HTTP/JSON报文3.2服务端到客户端的HTTP/JSON报文 1.http 客户端-RPC客户端 import json import requests# 定义 RPC 客户端类 class RPCClient:def __init__(self, server_url…...

1024程序员节

一年一年真快啊&#xff0c;...

嵌入式--->怎样选择编译语言,C C++或是Rust?

C 老牌语言&#xff0c;不可替代&#xff0c;速度和资源占用都是嵌入式领域着重考虑的 Rust 作为新生语言&#xff0c;已经成长到可以和C进行竞争的地步&#xff0c;不论是速度还是资源占用看&#xff0c;还是安全性 C 嵌入式开发使用C的思想&#xff0c;可以极大地简化代码&am…...

一起学数据结构(12)——归并排序的实现

1. 归并排序原理&#xff1a; 归并排序的大概原理如下图所示&#xff1a; 从图中可以看出&#xff0c;归并排序的整体思路就是把已给数组不断分成左右两个区间&#xff0c;当这个区间中的数据数量到达一定数值时&#xff0c;便返回去进行排序&#xff0c;整体的结构类似二叉树…...

读书笔记之《敏捷测试从零开始》(一)

大家好&#xff0c;我是rainbowzhou。 子曰&#xff1a;学而时习之&#xff0c;不亦说乎&#xff1f;今天我想和大家分享一本测试书籍——《敏捷测试从零开始》。以下为我的读书笔记&#xff1a; 精彩片段摘录&#xff1a; 焦虑往往来自于对比&#xff0c;当你在自己的圈子里面…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...