【微服务保护】初识 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 服务,然后可以对该服务配置各种限流规则。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…

Unity Profiler 详细解析(一)

Overview: . Profiler简介 . Profiler各模块介绍 . 各平台下Profiler的使用 . 基于Profiler的优化定位 . Profiler的主要参数详解 . Profiler案例 Profiler简介 Profiler 是Unity中分析性能开销的工具 • 各种开销一览无遗 • 可跨平台使用&#xff08;Web、PC、iOS、Android、…

模拟 Junit 框架

需求 定义若干个方法&#xff0c;只要加了MyTest注解&#xff0c;就可以在启动时被触发执行 分析 定义一个自定义注解MyTest&#xff0c;只能注解方法&#xff0c;存活范围是一直都在定义若干个方法&#xff0c;只要有MyTest注解的方法就能在启动时被触发执行&#xff0c;没有这…

侯捷C++面向对象程序设计笔记(上)-Object Based(基于对象)部分

基于对象就是对于单一class的设计。 对于有指针的&#xff1a;complex.h complex-test.cpp 对于没有指针的&#xff1a; string.h string-test.cpp https://blog.csdn.net/ncepu_Chen/article/details/113843775?spm1001.2014.3001.5501#commentBox 没有指针成员——以复数co…

计算机网络,网络(OSI)七层模型,三次握手四次挥手,get与post请求区别,网络IO(BIO\NIO\AIO),TCP与UDP区别

1.OSI模型&#xff1f; 开放式系统互联通信参考模型(Open System Interconnection Reference Model) OSI网络七层模型&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP协议群简化了OSI七层模型&#xff1a;应用层、传输层、网络层、数据链路…

Ubuntu 安装 npm 和 node

前言 最近学习VUE&#xff0c;在ubuntu 2204 上配置开发环境&#xff0c;涉及到npm node nodejs vue-Cli脚手架等内容&#xff0c;做以记录。 一、node nodejs npm nvm 区别 &#xff1f; node 是框架&#xff0c;类似python的解释器。nodejs 是编程语言&#xff0c;是js语言的…

DDOS直接攻击系统资源

DDOS ——直接攻击系统资源 思路&#xff1a; 攻击机利用三次握手机制&#xff0c;产生大量半连接&#xff0c;挤占受害者系统资源&#xff0c;使其无法正常提供服务。 1、先体验下受害者的正常网速。在受害者主机上执行以下命令 (1)开启Apache。 systemctl start apache2 (2…

ROCESS SPID 代表什么进程

ROCESS 发出sql命令 所在主机的进程 可以不在数据库主机上发出 SPID 对应数据库的服务进程id select a.PROCESS,b.SPID From v$session a , v$process b where a.PADDRb.ADDR and a.USERNAMESYS SQL> !ps -ef|grep sqlplus oracle 385 2792 0 21:01 pts/…

如何创建前端绘图和图表?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PHP 预定义超全局变量 笔记/练习

预定义超全局数组变量 $_FILES 练习在最后 其他练习跟在每条笔记后 概述 预定义&#xff1a;预定义变量是 PHP 已定义&#xff0c;可以直接使用超全局&#xff1a;作用域是全局&#xff0c;可以在脚本的任何地方&#xff08;包括函数内部、外部&#xff09;都可以进行访问 常…

设计模式之装饰器模式

前言 上一篇文章中&#xff0c;分享了适配器模式的一些相关知识&#xff0c;在本篇文章将为大家分享装饰器模式&#xff0c;乍一听&#xff0c;适配器和装饰器&#xff0c;是不是有点类似的感觉&#xff1f;其实这两种模式&#xff0c;完全是两种不同的设计模式&#xff0c;下…

GoLong的学习之路(一)语法之变量与常量

目录 GoLang变量批量声明变量的初始化类型推导短变量声明匿名变量 常量iota&#xff08;特殊&#xff09;&#xff08;需要重点记忆&#xff09; GoLang go的诞生为了解决在21世纪多核和网络化环境越来越复杂的变成问题而发明的Go语言。 go语言是从Ken Thomepson发明的B语言和…

外网nat+nat server,内网做路由过滤,以及ppp CHAR认证 企业网搭建

作业 网络拓扑图如下所示&#xff1a; 要求&#xff1a;做适当的截图&#xff0c;表示完成相应的操作。 按照网络拓扑要求搭建网络结构&#xff0c;按照个人学号配置每个节点的IP地址&#xff0c;其中X为班级号&#xff0c;Y为学号末尾2位&#xff1b;Y1为学号末尾2位1&#…

Seata学习

Seata Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网地址&#xff1a;https://seata.io/zh-cn/index.html 为什么会产生分布式事务&#xff1f; 示例&#xff1a;用户下单后需要创建订单&#xff0c;同时…

高通Quick Charge快速充电原理分析

1 三段式AC充电器 涓流、恒流、恒压。 2 QC 2.0 2.1 高通Quick Charge 2.0 快速充电原理分析 QC 2.0快速充电需要手机端和充电器都支持才行。 当将充电器端通过数据线连到手机上时&#xff0c;充电器默认的是将D和D-短接的&#xff0c;这样手机端探测到的充电器类型是DCP&#…

网络编程 day3

#include <head.h> #define SER_PORT 6678 //服务器端口号 #define SER_IP "192.168.115.64"//服务器IP地址 #define CLI_PORT 6666 //客户端端口号 #define CLI_IP "192.168.115.93" int main(int argc, const char *argv[]) {//1.创建套接字,用于连…

structs2 重构成SpringBoot架构

structs2 重构成SpringBoot架构 目录参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve den…

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09; 目录 分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09;分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现…

Java将djvu文件转成pdf

需求来源 迫于有部分资源是djvu格式的文件&#xff0c;需要预览这部分文件&#xff0c;web端无法直接预览djvu&#xff0c;所以需要将djvu转成pdf。 转换方法 简单来说就是先把djvu文件转换成tiff文件&#xff0c;再将tiff文件转换成pdf文件。 Ubuntu服务器 如果服务器是U…

数据库管理-第112期 Oracle Exadata 03-网络与ILOM(20231020)

数据库管理-第112期 Oracle Exadata 03-网络与ILOM&#xff08;202301020&#xff09; 在Exadata中&#xff0c;除了对外网络以外&#xff0c;其余网络都是服务于一体机内部各组件的网络&#xff0c;本期对这些网络的具体情况和硬件管理相关做一个讲解。 1 网络分类 1.1 生产…