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

news2024/11/18 3:26:41

文章目录

  • 前言
  • 一、雪崩问题及其解决方案
    • 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.coloradmin.cn/o/1115544.html

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

相关文章

Rust通用编程概念

文章目录 变量与可变性数据类型标量类型整数类型浮点类型布尔类型字符类型 复合类型元组数组 函数注释控制流if表达式循环 变量与可变性 变量与可变性 在Rust中&#xff0c;声明变量使用let关键字&#xff0c;并且默认情况下&#xff0c;声明的变量是不可变的&#xff0c;要使变…

C语言实现用递归法将一个整数 n 转换成字符串。例如,输入 483,应输出字符串“483“。n 的位数不确定,可以是任意位数的整数

完整代码&#xff1a; /*用递归法将一个整数 n 转换成字符串。例如&#xff0c;输入 483&#xff0c;应输出字符串"483"。n 的 位数不确定&#xff0c;可以是任意位数的整数。*/ #include<stdio.h> //long long int让n的取值范围更广 void func(long long int…

手搭手zabbix5.0监控redis7

Centos7安装配置Redis7 安装redis #安装gcc yum -y install gcc gcc-c #安装net-tools yum -y install net-tools #官网https://redis.io/ cd /opt/ wget http://download.redis.io/releases/redis-7.0.4.tar.gz 解压至/opt/目录下 tar -zxvf redis-7.0.4.tar.gz -C /opt/ #…

SpringCloud链路追踪——Spring Cloud Sleuth 和 Zipkin 介绍 Windows 下使用初步

前言 在微服务中&#xff0c;随着服务越来越多&#xff0c;对调用链的分析越来越复杂。如何能够分析调用链&#xff0c;定位微服务中的调用瓶颈&#xff0c;并对其进行解决。 本篇博客介绍springCloud中用到的链路追踪的组件&#xff0c;Spring Cloud Sleuth和Zipkin&#xf…

扩散模型学习

第一章 1.1 的原理 给定一批训练数据X&#xff0c;假设其服从某种复杂的真实 分布p(x)&#xff0c;则给定的训练数据可视为从该分布中采样的观测样本x。 生成模型就是估计训练数据的真实分布&#xff0c;使得估计的分布q(x)和真实分布p(x)差距尽可能能的小。 使得所有训练…

【五:Httprunner的介绍使用】

接口自动化框架封装思想的建立。httprunner&#xff08;热加载&#xff1a;动态参数&#xff09;&#xff0c;去应用 意义不大。 day1 一、什么是Httprunner? 1.httprunner是一个面向http协议的通用测试框架&#xff0c;目前最新的版本3.X。以前比较流行的 2.X的版本。2.它的…

FPGA的音乐彩灯VHDL流水灯LED花样,源码和视频

名称&#xff1a;FPGA的音乐彩灯VHDL流水灯LED 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; &#xff08;1&#xff09;设计一彩灯控制电路&#xff0c;按要求控制8路&#xff08;彩灯由发光 二极管代替&#xff0c;受实验箱限制&#xff0c;多路同…

CUDA 学习记录

1.关于volatile&#xff1a; 对于文章中这个函数&#xff0c; __global__ void reduceUnrollWarps8 (int *g_idata, int *g_odata, unsigned int n) {// set thread IDunsigned int tid threadIdx.x;unsigned int idx blockIdx.x * blockDim.x * 8 threadIdx.x;// convert…

李m圆申论

听话出活 3小时 /处理7500字 /一共5题 /写出2200字 字写得好看点&#xff0c;符号也算字数&#xff0c;占一个格 基本思路&#xff1a;考什么范围答什么 。。。落后&#xff1b;资源闲置、缺乏 申论&#xff1a; 作文题&#xff1a;举例子 处理材料 摘抄&#xff1a; 有人出…

《数据结构、算法与应用C++语言描述》-队列的应用-电路布线问题

《数据结构、算法与应用C语言描述》-队列的应用-电路布线问题 问题描述 在 迷宫老鼠问题中&#xff0c;可以寻找从迷宫入口到迷宫出口的一条最短路径。这种在网格中寻找最短路径的算法有许多应用。例如&#xff0c;在电路布线问题的求解中&#xff0c;一个常用的方法就是在布…

Linux进程(三)--进程切换命令行参数

继上回书Linux进程概念&#xff08;二&#xff09;--进程状态&进程优先级&#xff0c;我们在了解了Linux进程状态和优先级的概念&#xff0c;初步掌握了进程状态的相关知识&#xff0c;最终&#xff0c;我们以Linux进程的优先级&#xff0c;引出了一些其他的概念&#xff1…

非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

高校教务系统登录页面JS分析——华南理工大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

可以更改字体颜色的便签备忘录工具选择用哪个

日常添加笔记记录是一个非常好的习惯&#xff0c;通过笔记来记录一些重要的内容一方面可以帮助大家回顾过去的相关记录&#xff0c;另一方面如果记录的笔记是有关学习类的&#xff0c;还有助于大家随时查看记录的笔记。 多数时候记录笔记内容大家通常会选择一些比较方便易操作…

Spring中配置文件参数化

目录 一、什么是配置文件参数化 二、配置文件参数化的开发步骤 一、什么是配置文件参数化 配置文件参数化就是将Spring中经常需要修改的字符串信息&#xff0c;转移到一个更小的配置文件中。那么为什么要进行配置文件参数化呢&#xff1f;我们看一个代码 <bean id"co…

Chrome插件精选 — 扩展管理插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. 扩展管理器 下…

推荐《全职猎人》

电视动画《全职猎人》是由MADHOUSE公司制作的长篇电视动画&#xff0c;改编自日本漫画家富坚义博创作的同名漫画。该动画于2011年10月2日—2014年9月23日在日本电视网协议会首播&#xff0c;全148话。 剧场版动画《全职猎人&#xff1a;绯色的幻影》和《全职猎人&#xff1a;最…

Influence on Social media(素论+思维)

传送门&#xff1a;nefu_10-18 - Virtual Judge (vjudge.net) 思路&#xff1a; 每次给n个数&#xff0c;判断每个数的除数总数是否为奇素数。 对于整数&#xff1a;可质因子分解&#xff0c;,除数总数为&#xff08;i11&#xff09;*(i21)*(i31).... 若除数总数为奇素数&a…

golang笔记17--编译调试go源码

golang笔记17--编译调试go源码 前置条件编译源码在 fmt 包中加自定义函数说明 当前go语言越来越流行了&#xff0c;各大厂商都有加大go工程师的需求&#xff0c;作为go语言的学习者&#xff0c;我们除了要了解如何使用go语言外&#xff0c;也有必要了解一下如何编译、调试go源码…

双网关备份(bfd+VRRP+策略路由配置)企业网搭建

设备选型 vlan规划 Ip地址规划 产品名字 产品型号 设备命名 登录密码 路由器 Ar2220 Dianxin 123456 路由器 Ar2220 Dianxin 123456 路由器 Ar2220 Liantong 123456 路由器 Ar2220 R3 123456 交换机 S5700 S1 123456 交换机 S5700 S2 123456 交换机…