前言

最近在github里比较火的一个新闻就是trending的弃用;确实作为追求技术价值的组织机构,github弃用毫无价值感的trending,是一件好事,一些劣质的项目长期占用着榜单前列,确实对技术有误导的非常大的恶;同样作为国内某号称国内最大的IT技术论坛的网站,也应该认真的看待这个问题了;看看榜单前几篇文章,真够寒酸;今天在榜单里看到一个写springcloud的文章,熔断器停留在springboot2.1.x的版本基础上,这样的文章,还能叫创新吗;所以今天咱们就来好好的看看Springcloud中的几个主流熔断器

熔断器

在微服务体系架构中,业务被拆分成众多的单体微服务单元(Springboot程序),服务间通过服务发现机制,借用HTTP/TCP进行RPC调用。考虑到可能出现的网络原因或者服务本身原因,在服务或者RPC网络不可使用(访问)时,如果某源头服务出现问题,例如网络延迟,都会对调用服务造成相应的影响,有时甚至由于同时访问目标过多,会导致服务瘫痪,甚至导致服务“雪崩”。熔断器就是一种应对这种灾难风险的策略; 即当服务不可以使用是或者是服务到达某个临界点时, 对该服务进行阻断的处理方式, 通过这种方式,可以容忍这样的灾难服务,而不会使真个大的体系崩溃,有点像家庭用电里的断路保险盒,某个线路负载过重了,只是断掉该线路,而整个家庭线路依然可以提供服务。

几个Springcloud框架中的熔断器

这里注意,熔断器的产品有很多;我们这里特别强调的是,这里的熔断器是Springcloud架构中的, 也就是其是构建在Springcloud架构体系中的, 脱离了Springcloud,这些产品就没有生命了;也就只能是使用在java环境里,你的微服务也必须使用java来进行实现,而且要快速搭建,还必须使用springboot已经这些产品在springcloud里提供的组件(当然,可以自己通过这些产品的API来进行调用)

隔离级别

信号量模式

在该模式下,接收请求和执行下游依赖在同一个线程内完成,实现也很简单,一个简单的计数器,当请求进入熔断器时,执行tryAcquire(),计数器加1,结果大于阈值的话,就返回false,发生信号量拒绝事件,执行降级逻辑。当请求离开熔断器时,执行release(),计数器减1。

信号量模式由于都是在一个线程上下文中;不存在线程上下文切换所带来的性能开销,所以大部分场景应该选择信号量模式,但是在下面这种情况下,信号量模式并非是一个好的选择。

比如一个接口中依赖了3个下游:serviceA、serviceB、serviceC,且这3个服务返回的数据互相不依赖,这种情况下如果针对A、B、C的熔断降级使用信号量模式,那么接口耗时就等于请求A、B、C服务耗时的总和,无疑这不是好的方案。

线程池模式

在该模式下,用户请求会被提交到各自的线程池中执行,把执行每个下游服务的线程分离,从而达到资源隔离的作用。当线程池来不及处理并且请求队列塞满时,新进来的请求将快速失败,可以避免依赖问题扩散。线程池模式由于是线程资源分割的;减少所依赖服务发生故障时的影响面,比如ServiceA服务发生异常,导致请求大量超时,对应的线程池被打满,这时并不影响ServiceB、ServiceC的调用。

但是线程池模式的最大缺点: 请求在线程池中执行,肯定会带来任务调度、排队和上下文切换带来的开销。因为涉及到跨线程,那么就存在ThreadLocal数据的传递问题,比如在主线程初始化的ThreadLocal变量,在线程池线程中无法获取; 这里笔者在早期的微服务项目中使用Hystrix的线程池隔离方式,就遇到过类似的坑,当然知道了底层的原因有也相应的对策;这里可以单独写一个文章来讲讲这个坑。

三种主流熔断器的现况

Hystrix

Netfix已经停更了Hystrix项目,从SpringCloud版本2020.0.x项目开始,诸多的Netfix的组件都已经从springcloud的支持里移除,其中就包括Eureka,Hystrix, Ribbon; 所以Hystrix熔断器已经从Springcloud解决方案里废除掉了,如果你的项目里已经使用了Hystrix,那么请在你的SpringCloud下次升级的时候,找到替换产品;如果你的项目还没有开始的话,那就请不要再使用Hystrix,使用Springcloud官方推荐的Resilience;

Resilience4j

在Hystrix从SpringCloud家族中被删除后,SpringCloud官方推荐的是另一款目前来说还比较小众的项目的Resilience4j,可以在github上找到这个开源的项目;在上图的三种产品的比较中,我们就可以看到在三种产品中,resilience4j是一个适中的定位;在功能上没有sentinel支持的多,但是功能也一样可以覆盖到对熔断器的大多数要求; 就笔者个人使用而言,目前resilience的文档相对来说还不够丰富,使用的不多,文档就相对来说比较难找了,但是resilience4j非常的轻量级,作为开发中需要对熔断器有一些自己的定制化的话,比较推荐使用这个产品; 目前resilience对feign的支持,只能说是支持,但是还不是支持的特别方便,如果要比较方便的支持到feign的应用,只能在resilience4j的基础上进一步进行封装。总体来说,优于Hystrix, 可灵活进行扩展和应用。

Sentinel

首先来说这是Alibaba出品的一个产品;所有他有着alibaba产品共有的特点; 脏,乱,但不差! 在上面的图中三个产品的比较中,可以看到大部分比较的方面,Sentinel都是胜出的,确实,从功能上而言,Sentinel相对于另两个而言,是较全面的,还提供了一个Sentinel dashboard,可以图形化的进行查看,通过和nacos的集成,可以把只读的配置,实现成可读写的配置;但是整个项目封装性太强, 给你扩展和应用的空间不够开放; 对于要求不高的技术人员和项目,推荐使用Sentinel;但是如果有一定要求的,还是推荐使用Resilience4j。

浅谈Springcloud中的几个主流熔断器相关推荐

  1. 小谈Springcloud中的几个主流熔断器

    前言 最近在github里比较火的一个新闻就是trending的弃用:确实作为追求技术价值的组织机构,github弃用毫无价值感的trending,是一件好事,一些劣质的项目长期占用着榜单前列,确实对 ...

  2. 浅谈数据分析中的“暗物质”

    浅谈数据分析中的"暗物质" 我们分析数据,更重要的是看到数据中所隐藏的暗物质,即数据图中你看不见的数据\逻辑\知识. 开门见山,以下是某新闻媒体WAP\APP\PC三端的分周中和周 ...

  3. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  4. 浅谈EVE中的经济学问题

    浅谈EVE中的经济学问题 1.16340005 本人学院 目录 1.EVE中的货币 2.EVE中的市场 3.EVE中的战争 1.EVE中的货币 在EVE这个世界中,如果对制造业有着一定了解的话,你一定 ...

  5. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  6. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  7. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置

    声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...

  8. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  9. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

最新文章

  1. bzoj 1731 [Usaco2005 dec]Layout 排队布局——差分约束
  2. 谈谈NITE 2与OpenCV结合的第二个程序(提取人体骨骼坐标)
  3. 模式识别之车牌识别---一个开源车牌识别项目easypr
  4. 深度学习(22)神经网络与全连接层五: 误差计算
  5. 手机优酷APP怎么上传视频
  6. php.exe不是内部或外部命令,“php.exe”不被识别为内部或外部命令,可操作程序或batch file...
  7. mysql workbench 数据备份_如何使用MySQL Workbench进行MySQL数据库备份?
  8. 进程与线程的一个简单解释【摘】
  9. 芒果数据库备份与还原
  10. Chrome浏览器中比较实用的一些插件(文字复制、广告拦截、视频倍速、文献下载)
  11. cad卸载工具_Adobe软件卸载与常见问题解决方案
  12. ubuntu16.04上阅读CAJ格式的文件
  13. 资产监测设备中,使用浏览器解码Sigfox上行负载
  14. 中集集团[000039]人工智能企业CIMC中集飞瞳全球最先进集装箱人工智能,完成全球百万AI集装箱箱况残损检验,上亿集装箱检测
  15. C语言随机刷新,C语言 刷新缓冲区
  16. 八位“Booth二位乘算法”乘法器
  17. JVM Tomcat性能实战
  18. 2021-05-16刷题
  19. H5 IOS input输入框唤起键盘导致页面元素位置错乱问题
  20. canvas loadImage图片加载

热门文章

  1. 2018软工实践_团队作业_1
  2. 狗为什么吃屎?真相男默女泪,但看完后你也会流口水......
  3. 山西师范大学现代文理学院计算机一级试题,山西师范大学现代文理学院2007—2008学年第一学期期末考.doc...
  4. 2017,我们所经历的一切
  5. 谷歌浏览器模拟微信内置浏览器环境
  6. python爬虫实战练习 --- 喜马拉雅免费音频 下载到本地
  7. 论文,更不能培养自己研究问题的能力。
  8. 使用图片制作3D背景
  9. 好玩的农场游戏排行榜,好玩的农场游戏有哪些
  10. 考研数据结构之查找(9.8)——练习题之编写一个函数利用二分查找算法在一个有序表中插入关键字k并保持表的有序性(C表示)