Sentinel的线程隔离和熔断降级

这篇具有很好参考价值的文章主要介绍了Sentinel的线程隔离和熔断降级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一节整理了Sentinel的限流,限流可以降低微服务的负载,避免因为高并发而故障,进而传递给其他相关服务而引发服务雪崩。以上仅为避免服务故障,而当某个服务真正故障时,如何处理才能防止服务雪崩? ⇒ Sentinel支持隔离和降级两种方案

1、线程隔离和熔断降级

采用线程隔离,即舱壁模式:

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 业务1:服务A到服务B,限制10线程数
  • 业务2:服务A到服务C,限制10线程数

此时,服务C故障,最大损失10个线程,不会长期占用其他线程,如此,服务A到服务B仍可正常访问,阻止了故障的传递。

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

熔断降级,即当请求的失败比例超过阈值时,熔断器阻断服务A到服务D的请求,以后服务A到服务D的请求过来就会直接失败,它没压根机会去访问,也就不会导致资源耗尽,也就不会发生故障传递。

可以看到,不管是线程隔离还是熔断降级,都是对服务调用方的保护,别因为别的服务故障而拖垮自己。

2、Feign整合Sentinel

SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel

  • 修改服务调用方的application.yaml文件,开启Feign的Sentinel功能
feign:
  sentinel:    
  	enabled: true # 开启Feign的Sentinel功能

  • 给FeignClient编写失败后的降级逻辑(被阻断了,走另一条路,比如返回msg调用xxService失败)
方式一:FallbackClass,不能对远程调用的异常做处理
方式二:FallbackFactory,可以对远程调用的异常做处理,常选这种

3、FallbackFactory代码逻辑

这是未处理前,feign处理的接口:

@FeignClient(value = "userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
  • 在feing-api项目中定义类,实现FallbackFactory接口,且FallbackFactory的泛型中即为关联接口的类型
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {   //泛型中指定关联的接口的类型
    @Override
    public UserClient create(Throwable throwable) {
    	// 创建UserClient接口实现类(匿名内部类),实现其中的方法,编写失败降级的处理逻辑
        return new UserClient() {
            @Override
            public User findById(Long id) {
            	// 记录异常信息
                log.error("查询用户异常", throwable);
                // 根据业务需求返回默认的数据,这里是空用户
                return new User();
            }
        };
    }
}


  • 在模块的配置类DefaultFeignConfiguration中将UserClientFallbackFactory注册为一个Bean:
public class DefaultFeignConfiguration {

	//new个对象返回
    @Bean
    public UserClientFallbackFactory userClientFallbackFactory(){
        return new UserClientFallbackFactory();
    }
}
  • 在feing-api项目中的UserClient接口中用fallbackFactory属性,使用UserClientFallbackFactory
@FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
  • 重启服务,在Sentinel簇点链路中可以看到被远程调用的服务

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

到此,Feign整合Sentinel成功。也可再看下降级处理的效果(停掉被调用服务):

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离
Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

4、线程隔离

实现线程隔离有两种方式:

  • 线程池隔离
  • 信号量隔离(Sentinel默认采用)

基于信号量即这个资源请求能用的线程就10个,有个计数器,用一个少一个,请求完后还回去,用完后面的请求就没得用了,以达到舱壁隔离的效果。
Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

两种方式的优缺点:

  • 基于计数器模式,简单,开销小
  • 基于线程池模式,有额外开销,但隔离控制更强

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离
Sentinel中的配置示例如下:

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • QPS:就是每秒的请求数
  • 线程数:是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量,实现舱壁模式
需求:给 UserClient的查询用户接口设置流控规则,线程数不能超过 2
  • Sentinel中添加流控规则,阈值类型选择线程数

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 启动Jmeter,对/order/101发起测试

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 查看结果数,10个请求,8个返回结果user为null且控制台输出报错日志(请求不会失败,因为上面已经做了降级的逻辑处理)

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

5、Sentinel熔断的实现原理

由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器才会放行访问该服务的请求。实现思路如下:

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 断路器处于closed时,一切请求都不被拦截,且会被统计异常和慢的比例
  • 当比例达到失败阈值,断路器open,所有请求一过来就快速失败
  • 当熔断时间结束,切换好半开放状态,即Half-Open
  • Half-Open状态会尝试放行一些请求,如果依旧失败,则回到Open状态继续拦截,如果成功,则回到Closed状态

6、熔断策略–慢调用

达到某个阈值时,触发熔断,这个就是断路器的熔断策略,分为这三种:慢调用、异常比例、异常数

慢调用:业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

关于慢调用,即正常蹲坑6分钟,你蹲一小时,半天不释放资源,自然会影响到其他请求。

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离
以上这个Sentinel配置,即:

- RT超过500ms的调用是慢调用
- 统计最近10000ms内的请求
- 如果请求量超过10次,并且慢调用比例不低于0.5,则触发熔断
- 熔断时长为5秒,然后进入half-open状态,放行一次请求做测试

接下来完成一个实际例子:

需求:
给 UserClient的查询用户接口设置降级规则,慢调用的RT阈值为50ms,统计时间为1秒,最小请求数量为5,失败阈值比例为0.4,熔断时长为5

为了触发慢调用规则,这里修改UserService中的业务,使用休眠来模拟慢调用:

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

开始演示:
  • 配置Sentinel降级规则

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 狂刷/order/101接口(或者Ctrl+R),/order/101调用的user id就是1,即可触发熔断

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 此时访问其他用户,也返回空,因为阻断器open,直接挡回去了

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 估摸着5s过去了,阻断器进入到了Half-Open,再重新请求,可以看到正常返回了,当然此时熔断器变为Closed状态

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

7、熔断策略–异常比例、异常数

一定时间内的请求,异常请求所占的比例达到设定的比例阈值,或者异常请求的数量达到了设定的数量阈值,即熔断。

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离
此配置即统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.4,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。


Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离
此配置即统计最近1000ms内的请求,如果请求量超过10次,并且异常数不低于2个,就触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。

需求:
给 UserClient的查询用户接口设置降级规则,统计时间为1秒,最小请求数量为5,失败阈值比例为0.4,熔断时长为5s

这里手动抛异常模拟异常的发生:

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 配置降级规则

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 刷/order/102,查uid为2的用户,达到异常比例来触发熔断

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 然后再访问/order/103,此时103立即失败(被阻断了,所以耗时极小,这里只有7ms)

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

  • 等过了阻断器open的时间,再访问就正常了

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离

熔断策略小结:

Sentinel的线程隔离和熔断降级,SpringCloud,sentinel,微服务,流量控制,熔断,线程隔离文章来源地址https://www.toymoban.com/news/detail-583310.html

到了这里,关于Sentinel的线程隔离和熔断降级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud学习6(Spring Cloud Alibaba)断路器Sentinel熔断降级

    SpringCloud、SpringCloudAlibaba、SpringBoot版本选择。为了避免各种千奇百怪的bug,我们还是采用官方推荐的毕业版本。 修改tomcat配置最大线程数 引入测试依赖 编写测试代码 这里同时我们在浏览器去请求该地址,响应会变得很慢 测试结论:此时会发现由于thread接口囤积大量请求,

    2023年04月08日
    浏览(51)
  • 【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍

    这篇文章,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。 目录 一、Sentinel组件 1.1、Sentinel介绍 1.2、Sentinel环境搭建 (1)引入依赖 (2)资源和规则 1.3、使用SphU定义资源 (1)定义资源 (2)定义规则 1.4、使用SphO定义资源 (1)定义资源 (2)定义规则 1.5、

    2024年04月17日
    浏览(63)
  • 聊一聊服务治理三板斧:限流、熔断、降级和go-sentinel的实现

    我们知道,对于一个项目之初,我们不可能上来就按几千的并发去配置,为什么?两个方面,第一个是成本高。第二个是维护难度大。即便是天猫淘宝这种,也是采用的动态扩容的方式来应对双十一。那么一个项目如何应对突然的高并发,我们有哪些常用的措施和处理呢?我

    2024年01月19日
    浏览(46)
  • Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月12日
    浏览(43)
  • Sentinel 降级、限流、熔断

    在现代分布式系统中,如何有效地保护系统免受突发流量和故障的影响,是每个开发人员和架构师都需要思考的重要问题。在这样的背景下,Sentinel作为一个强大的系统保护和控制组件,为我们提供了降级、限流、熔断等多种策略,帮助我们更好地保障系统的稳定性和可用性

    2024年01月24日
    浏览(44)
  • Sentinel流量控制与熔断降级

    📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。 💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者

    2024年02月10日
    浏览(50)
  • 【微服务篇】深入理解资源隔离,限流,熔断原理(Hystrix、Resilience4j和Sentinel)

    限流、降级和资源隔离 是分布式系统设计中常用的三种技术手段,它们主要目的是增强系统的稳定性和可用性,尤其在高并发和不稳定网络环境下显得尤为重要 资源隔离通常有两种主要的实现方式: 线程池隔离和信号量隔离 。 线程池隔离 线程池隔离是通过为每个微服务或

    2024年04月11日
    浏览(45)
  • SpringCloud之Gateway整合Sentinel服务降级和限流

    1.下载Sentinel.jar可以图形界面配置限流和降级规则 地址:可能需要翻墙 下载jar文件 2.引入maven依赖 3.写个自动注入Resource的过滤器类(可以不写注解直接使用) 4.写配置文件 application.properties 5.cmd命令行启动jar文件访问localhost:18080页面,自己设置QPS java -jar -server.port=18080 sentinel-dash

    2024年02月07日
    浏览(45)
  • Hystrix和Sentinel熔断降级设计理念

    Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。 Sentinel 对这个问题采取了两种手段: 通过并发线程数进

    2024年02月09日
    浏览(44)
  • Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包