【微服务】服务熔断降级 Sentinel
创始人
2024-06-02 09:01:58

  1.高并发带来的问题             

        在微服务架构中,我们将业务拆分成⼀个个的服务,服务与服务之间可以相互调⽤,但是由于⽹络原因或者⾃身的原因,服务并不能保证服务的100%可⽤,如果单个服务出现问题,调⽤这个服务就会 出现⽹络延迟,此时若有⼤量的⽹络涌⼊,会形成任务堆积,最终导致服务瘫痪。            接下来,我们来模拟⼀个⾼并发的场景         1. 在订单服务中新建SentinelController.java
/*** Created by mxin5* 验证高并发*/
@RestController
public class SentinelController {@RequestMapping("/sentinel1")public String sentinel1(){//模拟一次网络延时try {//进行休眠TimeUnit.SECONDS.sleep(3);System.out.println("sentinel1开始执行");} catch (InterruptedException e) {e.printStackTrace();}return "sentinel1";}@RequestMapping("/sentinel2")public String sentinel2(){System.out.println("sentinel2开始执行");return "测试高并发下的问题";}@RequestMapping("/sentinel3")public String sentinel3(){return "sentinel3";}
}
2. 修改配置⽂件中tomcat的并发数
server:port: 8091  #商品订单的端口号tomcat:threads:max: 10 #tomcat的最大并发值10,正常是200多个,测试高并发,就需要sentinel进行限流
3. 接下来使⽤压测⼯具,对请求进⾏压⼒测试 下载地址https://jmeter.apache.org/ 第⼀步:修改配置,并启动软件 进⼊bin⽬录,修改jmeter.properties⽂件中的语⾔⽀持为language=zh_CN

然后点击jmeter.bat,启动软件。

第⼆步:添加线程组

第三步:配置线程并发数

 第四步:添加Http请求

 第五步:配置取样,并启动测试

 第六步:访问 http://localhost:8091/sentinel2 观察结果,会出现转圈等待的效果。

结论:
此时会发现, 由于sentinel1能够承受的并发数为10个,而jmeter压测的时候50个线程同事访问sentinel1导致囤积了⼤量请求, 从而在访问sentinel2的时候,没有线程进行处理sentinel2的访问,这就是服务雪崩的雏形。
服务器雪崩效应 在分布式系统中,由于⽹络原因或⾃身的原因,服务⼀般⽆法保证 100% 可⽤。如果⼀个服务出现 了问题,调⽤这个服务就会出现线程阻塞的情况,此时若有⼤量的请求涌⼊,就会出现多条线程阻塞 等 待,进⽽导致服务瘫痪。 由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就 是服务故障的 “雪崩效应” 。 情景1: 微服务之间相互调⽤,关系复杂,正常情况如下图所示:

 情景2:某个时刻,服务A挂了,服务B和服务C依然在调⽤服务A

 情景3:由于服务A挂了,导致服务C和服务B⽆法得到服务A的响应,这时候服务C和服务B由于⼤量线程积压,最终导致服务C和服务B挂掉.

 情景4: 相同道理,由于服务之间有关联,所以会导致整个调⽤链上的所有服务都挂掉.

         服务器的雪崩效应其实就是由于某个微⼩的服务挂了,导致整⼀⼤⽚的服务都不可⽤.类似⽣活中的雪崩效应,由于落下的最后⼀⽚雪花引发了雪崩的情况. 雪崩发⽣的原因多种多样,有不合理的容量设计,或者是⾼并发下某⼀个⽅法响应变慢,亦或某 台机器的资源耗尽。我们⽆法完全杜绝雪崩源头的发⽣,只有做好⾜够的容错,保证在⼀个服务发⽣问题,不会影响到其它服务的正常运⾏。

常见容错方案

        要防⽌雪崩的扩散,我们就要做好服务的容错,容错说⽩了就是保护⾃⼰不被猪队友拖垮的⼀些措 施, 下⾯介绍常⻅的服务容错思路和组件。 常⻅的容错思路 常⻅的容错思路有隔离、超时、限流、熔断、降级这⼏种,下⾯分别介绍⼀下。

隔离机制:

⽐如服务A内总共有100个线程, 现在服务A可能会调⽤服务B,服务C,服务D.我们在服务A 进⾏远程调⽤的时候,给不同的服务分配固定的线程,不会把所有线程都分配给某个微服务. ⽐如调⽤ 服务B分配30个线程,调⽤服务C分配30个线程,调⽤服务D分配40个线程. 这样进⾏资源的隔离,保证即使下游某个服务挂了,也不⾄于把服务A的线程消耗完。⽐如服务B挂了,这时候最多只会占⽤ 服务A的30个线程,服务A还有70个线程可以调⽤服务C和服务D

超时机制

在上游服务调⽤下游服务的时候,设置⼀个最⼤响应时间,如果超过这个时间,下游未 作出反应,就断开请求,释放掉线程。

限流机制

限流就是限制系统的输⼊和输出流量已达到保护系统的⽬的。为了保证系统的稳固运⾏, ⼀旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的⽬的。

熔断机制: 在互联⽹系统中,当下游服务因访问压⼒过⼤⽽响应变慢或失败,上游服务为了保护系 统整体的可⽤性,可以暂时切断对下游服务的调⽤。这种牺牲局部,保全整体的措施就叫做熔断。

服务熔断⼀般有三种状态: 熔断关闭状态(Closed) 服务没有故障时,熔断器所处的状态,对调⽤⽅的调⽤不做任何限制 熔断开启状态(Open) 后续对该服务接⼝的调⽤不再经过⽹络,直接执⾏本地的fallback⽅法 半熔断状态(Half-Open) 尝试恢复服务调⽤,允许有限的流量调⽤该服务,并监控调⽤成功率。如果成功率达到预 期,则说明服务已恢复,进⼊熔断关闭状态;如果成功率仍旧很低,则重新进⼊熔断关闭状态。

降级机制

降级其实就是为服务提供⼀个兜底⽅案,⼀旦服务⽆法正常调⽤,就使⽤兜底⽅案。

 常见的容错组件

Hystrix Hystrix是由Netflflix开源的⼀个延迟和容错库,⽤于隔离访问远程系统、服务或者第三⽅库,防⽌ 级联失败,从⽽提升系统的可⽤性与容错性。 Resilience4J Resilicence4J⼀款⾮常轻量、简单,并且⽂档⾮常清晰、丰富的熔断⼯具,这也是Hystrix官⽅推 荐的替代产品。不仅如此,Resilicence4j还原⽣⽀持Spring Boot 1.x/2.x,⽽且监控也⽀持和 prometheus等多款主流产品进⾏整合。 Sentinel Sentinel 是阿⾥巴巴开源的⼀款断路器实现,本身在阿⾥内部已经被⼤规模采⽤,⾮常稳定。

Sentinel入门

1 什么是Sentinel

Sentinel (分布式系统的流量防卫兵) 是阿⾥开源的⼀套⽤于服务容错的综合性解决⽅案。它以流量 为切⼊点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性 Sentinel 具有以下特征: 丰富的应⽤场景:Sentinel 承接了阿⾥巴巴近 10 年的双⼗⼀⼤促流量的核⼼场景, 例如秒杀(即 突发流量控制在系统容量可以承受的范围)、消息削峰填⾕、集群流量控制、实时熔断下游不可⽤ 应⽤等。 完备的实时监控:Sentinel 提供了实时的监控功能。通过控制台可以看到接⼊应⽤的单台机器秒 级数据, 甚⾄ 500 台以下规模的集群的汇总运⾏情况。 ⼴泛的开源⽣态:Sentinel 提供开箱即⽤的与其它开源框架/库的整合模块, 例如与 SpringCloud、Dubbo、gRPC 的整合。只需要引⼊相应的依赖并进⾏简单的配置即可快速地接⼊Sentinel。 Sentinel分为两个部分: 核⼼库(Java 客户端)不依赖任何框架/库,能够运⾏于所有 Java 运⾏时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的⽀持。 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运⾏,不需要额外的 Tomcat 等 应⽤容器。

2 订单微服务集成Sentinel

为微服务集成Sentinel⾮常简单, 只需要加⼊Sentinel的依赖即可 在shop-order-server项⽬的pom⽂件中添加如下依赖

com.alibaba.cloudspring-cloud-starter-alibaba-sentinel

3 安装Sentinel控制台

Sentinel 提供⼀个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。 1. 下载jar包 https://github.com/alibaba/Sentinel/releases 2. 启动控制台
# 直接使⽤jar命令启动项⽬(控制台本身是⼀个SpringBoot项⽬) java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 - Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
或者直接创建一个快捷打开方式sentinelStart.bat文件

 

3. 修改shop-order-server项⽬中的配置⽂件application.yml,新增如下配置:

spring:cloud:sentinel:transport:port: 9999 #跟控制台交流的端口,随意指定一个未使用的端口即可dashboard: localhost:1111 # 指定控制台服务的地址
4. 通过浏览器访问localhost:8080 进⼊控制台 ( 默认⽤户名密码是 sentinel/sentinel ) 注意: 默认是没显示order-service的,需要访问几次接⼝,然后再刷新sentinel管控台才可以看到.

 

 4 实现⼀个接口的限流

第⼀步: 簇点链路--->流控

第⼆步: 在单机阈值填写⼀个数值,表示每秒上限的请求数

 第三步:通过控制台快速频繁访问, 观察效果

 5 Sentinel容错的维度

相关内容

热门资讯

美国原油期货收跌超4.5% 格隆汇1月16日|WTI 2月原油期货收跌2.83美元,跌幅4.56%,报59.19美元/桶。布伦特...
南京千名家长在自家孩子学校当大... (来源:南京晨报)转自:南京晨报 王丽 谈静 顾宁宁 丁常美 陈绍峰 ...
一颗枇杷做出几样文章 米易县本报讯“看这颗枇杷,金黄透亮、果肉饱满,这是今年头茬果……”1月14日一早,米易县草场镇龙华村...
香港特区政府保安局:大埔火灾死... (来源:上观新闻)香港特区政府保安局局长邓炳强15日表示,香港大埔火灾死亡人数增至168人。因尊重家...
严惩群众身边腐败 转自:贵州日报黔西南州晴隆县纪检监察干部在东观街道老营社区走访,向群众了解退耕还林等补助资金发放情况...