feign直接走熔断_SpringCloud微服务面试必问:Hystrix 服务降级、熔断

27c52b84d75c48a1693426b748f21637.png

本文作者:JLSong
本文链接:https://www.cnblogs.com/songjilong/p/12770999.html

1、Hystrix是什么?

Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix 能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

「断路器」本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

2、Hystrix 的几个概念

2.1服务降级

不让客户端等待,并立即返回一个友好的提示(服务器忙,请稍后再试)

哪些情况会发生服务降级:

  • 程序运行异常
  • 超时
  • 服务熔断引起服务降级
  • 线程池/信号量打满也会导致服务降级

2.2服务熔断

类似保险丝,电流过大时,直接熔断断电。

熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息,当检测到该节点微服务调用响应正常后,恢复调用链路。

服务降级 → 服务熔断 → 恢复调用链路

2.3服务限流

对于高并发的操作,限制单次访问数量

3、服务降级的用法与分析

超时导致服务器变慢:超时不再等待; 出错(宕机或程序运行出错):要有备选方案

  • 服务提供者超时了,调用者不能一直卡死等待,必须要服务降级
  • 服务提供者宕机了,调用者不能一直卡死等待,必须要服务降级
  • 服务提供者没问题,调用者自己出现故障或者有自我要求(自己的等待时间必须小于服务提供者)

3.1给服务提供方设置服务降级

1、在需要服务降级的方法上标注注解,fallbackMethod 代表回退方法,需要自己定义,@HystrixProperty 中设置的是该方法的超时时间,如果超过该事件则自动降级

当运行超时或服务内部出错都会调用回退方法

@HystrixCommand(    fallbackMethod = "timeoutHandler",     commandProperties = {    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")})public String timeout(Long id) {    int time = 3000;    try {        TimeUnit.MILLISECONDS.sleep(time);    } catch (InterruptedException e) {        e.printStackTrace();    }    //模拟异常    //int i = 10 / 0;    return "线程:" + Thread.currentThread().getName();}

2、在启动类上添加注解,开启降级

@EnableCircuitBreaker

3.2给服务消费方设置服务降级

①.添加配置

# 在feign中开启hystrixfeign:  hystrix:    enabled: true

②.和服务提供方一样,照葫芦画瓢

@HystrixCommand(    fallbackMethod = "timeoutHandler",     commandProperties = {    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")})public String timeout(@PathVariable("id") Long id) {    int i = 1/0;    return hystrixService.timeout(id);}

③.在启动类上添加注解

@EnableHystrix

3.3问题

以上配置方式存在的问题:

  • 每个业务方法对应一个回退方法,代码膨胀
  • 每个业务方法上都配置相同的处理,代码冗余

解决方式1:在类上配置一个全局回退方法,相当于是一个通用处理,当此回退方法能满足你的需求,就无需在方法上指定其它回退方法,如果需要使用特定的处理方法可以再在业务方法上定义

@DefaultProperties(defaultFallback = "globalFallbackMethod")

解决方式2:但此时处理代码和依然和业务代码混合在一起,我们还可以使用另一种方式:编写一个类实现 Feign 的调用接口,并重写其方法作为回退方法,然后在 @FeignClient 注解上添加 fallback 属性,值为前面的类。

4、服务熔断的用法与分析

在SpringCloud中,熔断机制通过 Hystrix 实现。Hystrix 监控微服务间的调用状况,当失败的调用到一定阈值,默认 5 秒内 20 次调用失败就会启动熔断机制。熔断机制的注解是 @HystrixCommand

@HystrixCommand(    fallbackMethod = "paymentCircuitBreakerFallback",     commandProperties = {        @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //是否开启断路器        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求次数        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //时间窗口期        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") //失败率达到多少后跳闸})public String circuitBreaker(Long id) {    if (id < 0) {        throw new RuntimeException("id 不能为负数");    }    return Thread.currentThread().getName() + "" + "调用成功,流水号:" + IdUtil.simpleUUID();}public String circuitBreakerFallback(Long id) {    return "id 不能为负数,你的id = " + id;}

@HystrixProperty 中的配置可以参考 com.netflix.hystrix.HystrixCommandProperties 类

详见官方文档:https://github.com/Netflix/Hystrix/wiki/Configuration

也有雷锋同志做了翻译:https://www.jianshu.com/p/39763a0bd9b8

熔断类型

  • 熔断打开:请求不再调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态。
  • 熔断半开:部分请求根据规则调用服务,如果请求成功且符合规则,则关闭熔断。
  • 熔断关闭:不会对服务进行熔断。

断路器什么时候起作用?

根据上面配置的参数,有三个重要的影响断路器的参数

  • 快照时间窗:回路被打开、拒绝请求到再尝试请求并决定回路是否继续打开的时间范围,默认是 5 秒
  • 请求总数阈值:在一个滚动窗口中,打开断路器需要的最少请求数,默认是 20 次(就算前 19 次都失败了,断路器也不会被打开)
  • 错误百分比阈值:错误请求数在总请求数所占的比例,达到设定值才会触发,默认是 50%

断路器开启或关闭的条件

  1. 当请求达到一定阈值时(默认 20 次)
  2. 当错误率达到一定阈值时(默认 50%)
  3. 达到以上条件断路器开启
  4. 当开启的时候,所有请求都不会转发
  5. 当断路器开启一段时间后(默认 5 秒)进入半开状态,并让其中一个请求进行转发,如果成功断路器关闭,如果失败继续开启,重复第 4 和 5 步

断路器开启之后会发生什么?

  • 再有请求调用时,不再调用主逻辑,而是调用降级 fallback。
  • 断路器开启之后,Hytrix 会启动一个休眠时间窗,在此时间内,fallback 会临时称为主逻辑,当休眠期到了之后,断路器进入半开状态,释放一个请求到原来的主逻辑上,如果请求成功返回,则断路器关闭,如果请求失败,则继续进入打开状态,休眠时间窗重新计时。

5、Hystrix服务熔断的工作流程

62349b225803a6783c5e1be9028f0607.png

详见官方文档:https://github.com/Netflix/Hystrix/wiki/How-it-Works

6、Hystrix DashBoard 上手

6.1搭建

①.新建一个项目,导入 maven 依赖

org.springframework.cloud    spring-cloud-netflix-hystrix-dashboardorg.springframework.boot    spring-boot-starter-actuator

②.添加配置

server:  port: 9001

③.开启 Hystrix DashBoard

@SpringBootApplication@EnableHystrixDashboardpublic class ConsumerHystrixDashBoard9001 {    public static void main(String[] args){        SpringApplication.run(ConsumerHystrixDashBoard9001.class, args);    }}

④.浏览器输入 http://localhost:9001/hystrix,出现以下界面即启动成功

9cd8f7077d24f0d22ff55a57f52a3d7c.png

7、使用

注意:想要被 Hystrix DashBoard 监控的服务必须导入此依赖

org.springframework.boot    spring-boot-starter-actuator

在被监控服务的主启动类里添加如下代码,否则某些旧版本可能报错 Unable to connect to Command Metric Stream.

/** * 此配置是为了服务监控而配置,与服务容错本身无关,SpringCloud升级后的坑 * ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream", * 只要在自己的项目里配置上下面的servlet就可以了 */@Beanpublic ServletRegistrationBean getServlet(){    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);    registrationBean.setLoadOnStartup(1);    registrationBean.addUrlMappings("/hystrix.stream");    registrationBean.setName("HystrixMetricsStreamServlet");    return registrationBean;}

在 Hystrix DashBoard 页面输入基本信息,进入仪表盘界面

6d64808812960f4e8d687268d7afa0c3.png

大致情况如下所示

41aa4863df7df208ab48a2bd809e214e.png

操作界面分析:

f83f838a11a2e205aee5b734bb8c9fce.png

代码地址:https://github.com/songjilong/springcloud-hoxton-learning

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575033.shtml

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

相关文章

python里面print是什么意思_python里print是什么意思

python里print是什么意思,多个,是一个,对象,默认值,一个函数 python里print是什么意思 易采站长站&#xff0c;站长之家为您整理了python里print是什么意思的相关内容。 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由Guido van Rossum于1989年底发明…

mysql 用户管理系统_mysql 用户管理

MySQL账户管理在我们之前登录MySQL的时候我们都是直接使用的root用户&#xff0c;root用户属于数据库系统中的超级管理员&#xff0c;有权限对mysql进行任何想要做的操作。如果在生产环境下操作数据库时也是全部直接使用root账户连接&#xff0c;这就和悬崖边跳舞差不多。所以 …

执行一次怎么会写入两次数据_浅谈 Redis 数据持久化之 AOF 模式

我们知道 Redis 之所以读写快、性能高&#xff0c;得益于它是一种基于内存的数据库&#xff0c;毫无疑问它的操作都几乎都是基于内存。但是内存型数据库也有一个很大的弊端&#xff1a;如果进程崩溃或者服务重启的时候内存数据得不到保存&#xff0c;就会造成数据丢失。为了解决…

数字化转型方法论_双中台:企业数字化转型的核心战略与方法论

当下&#xff0c;绝大部分企业的组织形态、经营模式基本都是垂直闭环型&#xff0c;即围绕一种业务或者管理&#xff0c;其计划、执行、检查、优化的闭环都是独立于企业生态之中。在过去的“局部竞争”、“渠道为王”、“终端为王”的时代&#xff0c;这种组织与经营形式很好地…

java获取cpu使用率_再一次生产 CPU 高负载排查实践

前言前几日早上打开邮箱收到一封监控报警邮件&#xff1a;某某 ip 服务器 CPU 负载较高&#xff0c;请研发尽快排查解决&#xff0c;发送时间正好是凌晨。其实早在去年我也处理过类似的问题&#xff0c;并记录下来&#xff1a;《一次生产 CPU 100% 排查优化实践》不过本次问题产…

《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析...

《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析&#xff0c;绝对的经典分析 原文:《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析&#xff0c;绝对的经典分析献给广大的三国爱好者们&#xff0c;希望喜欢三国的朋友一起讨论&#…

java map取值_Java Set接口 Map 与枚举

Set接口概述一个不包含重复元素的 collection。更确切地讲&#xff0c;set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2&#xff0c;并且最多包含一个 null 元素特点Set接口是无序的 Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。Set可以存储null值,但是nu…

linux调用ocx插件_Wordpress file manager插件任意文件上传

白斩鸡卫兵实验室近日&#xff0c;Wordpress 插件file manager被爆出严重0day漏洞&#xff0c;本着技术研究角度&#xff0c;和大家分享、探讨其漏洞原因。该修复程序已在同一天发布&#xff0c;并且WP File Manager插件6.9版通过删除允许未经授权的文件上传访问的端点来解决当…

树莓派安装mysql5.6_Linux上安装MySQL5.6

OS & MySQL的版本号和配置&#xff1a;MySQL Version: 5.6.19Linux Version: Linux boston.oracle.com 2.6.18-164.el5 #1 SMP Thu Sep 3 02:16:47 EDT 2009 i686 i686 i386 GNU/Linux一。下载MySQL安装软件。请到www.oracle.com去找DATABASE DOWNLOAD。下载MySQL须要注冊一…

java获取cpu使用率_2019年阿里P8架构师的解析:最新Java性能测试、调优策略

一、性能测试Ⅰ.测试方法微基准性能测试可以精准定位到某个模块或者某个方法的性能问题&#xff0c;例如对比一个方法使用同步实现和非同步实现的性能差异宏基准性能测试宏基准性能测试是一个综合测试&#xff0c;需要考虑到测试环境、测试场景和测试目标测试环境&#xff1a;模…

java在线编辑器_微软开源在线代码编辑器——Monaco Editor

介绍Monaco Editor是为VS Code提供支持的代码编辑器&#xff0c;运行在浏览器环境中。编辑器提供代码提示&#xff0c;智能建议等功能。供开发人员远程更方便的编写代码。移动浏览器或移动Web框架不支持Monaco编辑器。简单的理解就是VSCode中的代码编辑器和Monaco Editor使用的…

java的核心类库_Java核心类库,集合框架

Java集合框架的由来&#xff1a;Java最初版本只为最常用的数据结构提供了很少的一组类&#xff1a;比如Vector、Stack、Hashtable、BitSet、Enumerrationr接品&#xff0c;其中Enumerrationr接口提供了一种用于访问任意容器中各个元素的抽象机制。这是一种很明智的选择&#xf…

js splice方法_我用JS刷LeetCode | Day 8

如有兴趣&#xff0c;微信搜索「九零后重庆崽儿」&#xff0c;我们一起学前端。删除排序数组中的重复项:说明&#xff1a;现阶段的解题暂未考虑复杂度问题首发地址&#xff1a;我用JS刷LeetCode | Day 8​www.brandhuang.comQuestion&#xff1a;Given an array nums and a val…

js 根据掩码位计算可用ip地址_变长子网掩码:轻松分配IP地址(下)

Hello,World.如约而至土土来更文咯[吐舌]图1首先先揭晓一下上一篇文章的答案那就是192.168.1.0/24与192.168.2.0/24不能ping通192.168.1.0/16与192.168.2.0/16能ping通图2还记得土土的提示吗&#xff1f;网络号相同则能够ping通那么根据/24可以看出这两个IP地址有24个网络号,即…

java break递归_【Java】递归总结

摘要&#xff1a;大师 L. Peter Deutsch 说过&#xff1a;To Iterate is Human, to Recurse, Divine.中文译为&#xff1a;人理解迭代&#xff0c;神理解递归。毋庸置疑地&#xff0c;递归确实是一个奇妙的思维方式。对一些简单的递归问题&#xff0c;我们总是惊叹于递归描述问…

[翻译] RDVTabBarController

RDVTabBarController https://github.com/robbdimitrov/RDVTabBarController 效果&#xff1a; Supports iPad and iPhone 支持iPad与iPhoneSupports landscape and portrait orientations 支持横竖屏切换动画Can be used inside UINavigationController 可以用在UINavigationC…

内存位置访问无效 midas.dll_java并发之内存模型

作者&#xff1a;killianxu来源&#xff1a;https://www.cnblogs.com/killianxu/p/11665903.htmljava内存模型知识导图一 并发问题及含义并发编程存在原子性、可见性、有序性问题。原子性即一系列操作要么都执行&#xff0c;要么都不执行。 可见性,一个线程对共享变量的修改&am…

程序一旦发觉写得不理想,那就得重构它

早上有写一篇《设计模式--建造者(Builder)模式》http://www.cnblogs.com/insus/p/4179620.html。是在ASP.NET环境中&#xff0c;应用与演示设计模式(Builder)。现在Insus.NET从博文中最后的下载链接下载取源程序&#xff0c;它是有写得不够理想&#xff0c;现在重构它。问题点&…

template标签_C++核心准则T.65:使用标签分发提供函数的不同实现

T.65: Use tag dispatch to provide alternative implementations of a functionT.65:使用标签分发提供函数的不同实现Reason(原因)A template defines a general interface.模板定义普遍接口。Tag dispatch allows us to select implementations based on specific properties…

Windows服务器学习篇:服务器连接与退出

此文是我早期在公司内部发布的一篇给予新入职程序员基础技术培训的文章&#xff0c;非常基础简单&#xff0c;现拿出来给大家分享。当然&#xff0c;已工作人士可直接忽略... 一、Windows服务器连接 1. 在桌面菜单中的“运行”里&#xff0c;输入mstsc命令&#xff0c;然后回车…