还记得我们前所说的服务降级吗,也就是说我们需要在整个微服务调用链路出现问题的时候,及时对服务进行降级,以防止问题进一步恶化。

那么,各位是否有思考过,如果在某一时刻,服务B出现故障(可能就卡在那里了),而这时服务A依然有大量的请求,在调用服务B,那么,由于服务A没办法再短时间内完成处理,新来的请求就会导致线程数不断地增加,这样,CPU的资源很快就会被耗尽。

那么要防止这种情况,就只能进行隔离了,这里我们提两种隔离方案:

  1. 线程池隔离
    线程池隔离实际上就是对每个服务的远程调用单独开放线程池,比如服务A要调用服务B,那么只基于固定数量的线程池,这样即使在短时间内出现大量请求,由于没有线程可以分配,所以就不会导致资源耗尽了。

  1. 信号量隔离
    信号量隔离是使用Semaphore类实现的(如果不了解,可以观看本系列 并发编程篇 视频教程),思想基本上与上面是相同的,也是限定指定的线程数量能够同时进行服务调用,但是它相对于线程池隔离,开销会更小一些,使用效果同样优秀,也支持超时等。
    Sentinel也正是采用的这种方案实现隔离的。

好了,说回我们的熔断和降级,当下游服务因为某种原因变得不可用或响应过慢时,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务而是快速返回或是执行自己的替代方案,这便是服务降级。

整个过程分为三个状态:

  • 关闭:熔断器不工作,所有请求全部该干嘛干嘛。
  • 打开:熔断器工作,所有请求一律降级处理。
  • 半开:尝试进行一下下正常流程,要是还不行继续保持打开状态,否则关闭。

那么我们来看看Sentinel中如何进行熔断和降级操作,打开管理页面,我们可以自由新增熔断规则:

其中,熔断策略有三种模式:

  1. 慢调用比例:如果出现那种半天都处理不完的调用,有可能就是服务出现故障,导致卡顿,这个选项是按照最大响应时间(RT)进行判定,如果一次请求的处理时间超过了指定的RT,那么就被判定为慢调用,在一个统计时长内,如果请求数目大于最小请求数目,并且被判定为慢调用的请求比例已经超过阈值,将触发熔断。经过熔断时长之后,将会进入到半开状态进行试探(这里和Hystrix一致)
    然后修改一下接口的执行,我们模拟一下慢调用:
@RequestMapping("/borrow2/{uid}")
UserBorrowDetail findUserBorrows2(@PathVariable("uid") int uid) throws InterruptedException {Thread.sleep(1000);return null;
}

重启,然后我们创建一个新的熔断规则:

可以看到,超时直接触发了熔断,进入到阻止页面:

  1. 异常比例:这个与慢调用比例类似,不过这里判断的是出现异常的次数,与上面一样,我们也来进行一些小测试:
@RequestMapping("/borrow2/{uid}")
UserBorrowDetail findUserBorrows2(@PathVariable("uid") int uid) {throw new RuntimeException();
}

启动服务器,接着添加我们的熔断规则:

现在我们进行访问,会发现后台疯狂报错,然后就熔断了:

  1. 异常数:这个和上面的唯一区别就是,只要达到指定的异常数量,就熔断,这里我们修改一下熔断规则:

    现在我们再次不断访问此接口,可以发现,效果跟之前其实是差不多的,只是判断的策略稍微不同罢了:

那么熔断规则如何设定我们了解了,那么,如何自定义服务降级呢?之前在使用Hystrix的时候,如果出现异常,可以执行我们的替代方案,Sentinel也是可以的。

同样的,我们只需要在@SentinelResource中配置blockHandler参数(那这里跟前面那个方法限流的配置不是一毛一样吗?没错,因为如果添加了@SentinelResource注解,那么这里会进行方法级别细粒度的限制,和之前方法级别限流一样,会在降级之后直接抛出异常,如果不添加则返回默认的限流页面,blockHandler的目的就是处理这种Sentinel机制上的异常,所以这里其实和之前的限流配置是一个道理,因此下面熔断配置也应该对value自定义名称的资源进行配置,才能作用到此方法上):

@RequestMapping("/borrow2/{uid}")
@SentinelResource(value = "findUserBorrows2", blockHandler = "test")
UserBorrowDetail findUserBorrows2(@PathVariable("uid") int uid) {throw new RuntimeException();
}UserBorrowDetail test(int uid, BlockException e){return new UserBorrowDetail(new User(), Collections.emptyList());
}

接着我们对进行熔断配置,注意是对我们添加的@SentinelResource中指定名称的findUserBorrows2进行配置:

OK,可以看到熔断之后,服务降级之后的效果:

最后我们来看一下如何让Feign的也支持Sentinel,前面我们使用Hystrix的时候,就可以直接对Feign的每个接口调用单独进行服务降级,而使用Sentinel,也是可以的,首先我们需要在配置文件中开启支持:

feign:sentinel:enabled: true

之后的步骤其实和之前是一模一样的,首先创建实现类:

@Component
public class UserClientFallback implements UserClient{@Overridepublic User getUserById(int uid) {User user = new User();user.setName("我是替代方案");return user;}
}

然后直接启动就可以了,中途的时候我们吧用户服务全部下掉,可以看到正常使用替代方案:

这样Feign的配置就OK了,那么传统的RestTemplate呢?我们可以使用@SentinelRestTemplate注解实现:

  @Bean@LoadBalanced@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class,fallback = "fallback", fallbackClass = ExceptionUtil.class) //这里同样可以设定fallback等参数public RestTemplate restTemplate() {return new RestTemplate();}

这里就不多做赘述了。

Sentinel服务熔断和降级相关推荐

  1. 服务熔断、降级、限流、异步RPC -- HyStrix

    本人新书出版,对技术感兴趣的朋友请关注: https://mp.weixin.qq.com/s/uq2cw2Lgf-s4nPHJ4WH4aw 在今天,基于SOA的架构已经大行其道.伴随着架构的SOA化 ...

  2. SpringCloud Hystrix服务熔断和降级的理解

    (个人理解,不喜勿喷)假如我要开发一个项目,但是开发的过程中遇到一个问题,我不会操作数据库(包括数据库连接,数据查询等),我只能向我的朋友请教,朋友A会使用Hibernate,朋友B会JDBC访问数据 ...

  3. 服务熔断与降级(Sentinel)

    文章目录 1.概述 ①.什么是Sentinel ②.Windows下载安装 ③.Docker安装 2.工程案例 ①.建Module ②.POM ③.YML ④.主启动 ⑤.业务类 ⑥.测试 3.流控规 ...

  4. Sentinel服务熔断Ribbon环境预说_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0048

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们看服务熔断功能 然后这里我们要说上面的内容 首先我们准备环境,服务提供者是,9003,90 ...

  5. 微服务技术栈:流量整形算法,服务熔断与降级

    本文源码:GitHub·点这里 || GitEE·点这里 一.流量控制 1.基本概念 流量控制的核心作用是限制流出某一网络的某一连接的流量与突发,使这类报文以比较均匀的速度流动发送,达到保护系统相对稳 ...

  6. SpringCloud Day12---SpringCloud Alibaba Sentinel 服务熔断与限流

    文章目录 15. SpringCloud Alibaba Sentinel实现熔断与限流 15.1 概述 15.1.1 官网 15.1.2 介绍 15.1.3 去哪下 15.1.4 能干嘛 15.1. ...

  7. SpringCloud系列7:安检员豪猪哥——Hystrix服务熔断、降级及监控

    文章目录 1.概述 分布式面临的问题 Hystrix介绍 2.服务熔断 1.新建模块 lingluocloud-provider-dept-hystrix-8001 3.服务降级 1.修改linglu ...

  8. spring cloud alibaba 学习(二十一)Sentinel服务熔断降级DegradeSlot

    目录 一.DegradeRule 一.DegradeSlot 三.ResponseTimeCircuitBreaker 四.ExceptionCircuitBreaker 一.DegradeRule ...

  9. Sentinel服务熔断配置fallback和blockHandler_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0052

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 咱们以前配置的时候要么就只配置了fallback,进行熔断,程序错误的处理, 要么只配置了bloc ...

最新文章

  1. 软件安装:原始码与 Tarball
  2. wordpress-基础插件,常用函数
  3. HDS HDIM背后的小秘密
  4. elasticsearch亿级数据量全量索引导入优化方案
  5. 灵机一动之优雅实现用例顺序插入
  6. C语言练习:第二大整数
  7. html网页老是崩溃,MSHTML.dll 错误模块导致ie9最近经常崩溃
  8. keil 之Vscode编辑器插件、格式化代码插件和最新注册机分享
  9. Linux下mysql数据恢复
  10. ubuntu中firfox插件xmarks的同步问题
  11. 物联网数据多又杂?好用的数据可视化服务来了
  12. 赫兹的单位换算_hz是什么单位(频率和赫兹的换算)
  13. Tomcat传url地址中的特殊字符无法识别问题
  14. 设计模式六大原则的理解与归纳
  15. IP数据包在网络中的传输过程
  16. Android 第三方QQ分享功能实现
  17. CSDN的博客搜索功能太弱,教你怎么搜索自己博客的文章
  18. html自定义列表标签报错,HTML入门标签汇总
  19. 基于 vue.js 的仿QQ聊天室
  20. 这些常用的java工具类你都知道吗?

热门文章

  1. php 按key降序排序,PHP程序按升序和降序对整数数组进行排序
  2. 我读《怪诞行为学2》(续)
  3. 不同VLAN间是如何通信的?
  4. 尚医通-项目介绍(一)
  5. GB/T28181 视频预览如何选择主码流还是子码流
  6. python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面
  7. MacType 文字之美 – 让 Windows 字体更漂亮
  8. 【PM产品】读点淘(淘宝直播)产品分析有感
  9. 基于javaEE健康系统的设计及开发
  10. Jmeter IF控制器