史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)

史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)在微服务架构中 我们将业务拆分成一个个的服务 服务与服务之间可以相互调用 RPC 为了保证其高可用 单个服务又必须集群部署 由于网络原因或者自身的原因 服务并不能保证服务的 100 可用 如果单个服务出现问题 调用这个服务就会出现网络延迟 此时若有大量的网络涌入 会形成任务累计 导致服务瘫痪 甚至导致服务 雪崩 为了解决这个问题 就出现断路器模型

个人博客纯净版:https://www.fangzhipeng.com/springcloud/2017/06/04/sc04-hystrix.html

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。

为了解决这个问题,业界提出了断路器模型。

一、断路器简介

Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls.

. —-摘自官网

Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:

在这里插入图片描述

较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。

在这里插入图片描述

断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。

二、准备工作

这篇文章基于上一篇文章的工程,首先启动上一篇文章的工程,启动eureka-server 工程;启动service-hi工程,它的端口为8762。

三、在ribbon使用断路器

改造serice-ribbon 工程的代码,首先在pox.xml文件中加入spring-cloud-starter-hystrix的起步依赖:

 
   
   
     org.springframework.cloud 
    
   
     spring-cloud-starter-hystrix 
    
   

在程序的启动类ServiceRibbonApplication 加@EnableHystrix注解开启Hystrix:

@SpringBootApplication @EnableDiscoveryClient @EnableHystrix public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } } 

改造HelloService类,在hiService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串,字符串为”hi,”+name+”,sorry,error!”,代码如下:

@Service public class HelloService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "hiError") public String hiService(String name) { return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class); } public String hiError(String name) { return "hi,"+name+",sorry,error!"; } } 

启动:service-ribbon 工程,当我们访问http://localhost:8764/hi?name=forezp,浏览器显示:

hi forezp,i am from port:8762

此时关闭 service-hi 工程,当我们再访问http://localhost:8764/hi?name=forezp,浏览器会显示:

hi ,forezp,orry,error!

这就说明当 service-hi 工程不可用的时候,service-ribbon调用 service-hi的API接口时,会执行快速失败,直接返回一组字符串,而不是等待响应超时,这很好的控制了容器的线程阻塞。

四、Feign中使用断路器

Feign是自带断路器的,在D版本的Spring Cloud中,它没有默认打开。需要在配置文件中配置打开它,在配置文件加以下代码:

feign.hystrix.enabled=true

基于service-feign工程进行改造,只需要在FeignClient的SchedualServiceHi接口的注解中加上fallback的指定类就行了:

@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class) public interface SchedualServiceHi { @RequestMapping(value = "/hi",method = RequestMethod.GET) String sayHiFromClientOne(@RequestParam(value = "name") String name); } 

SchedualServiceHiHystric需要实现SchedualServiceHi 接口,并注入到Ioc容器中,代码如下:

@Component public class SchedualServiceHiHystric implements SchedualServiceHi { @Override public String sayHiFromClientOne(String name) { return "sorry "+name; } } 

启动四servcie-feign工程,浏览器打开http://localhost:8765/hi?name=forezp,注意此时service-hi工程没有启动,网页显示:

sorry forezp

打开service-hi工程,再次访问,浏览器显示:

hi forezp,i am from port:8762

这证明断路器起到作用了。

五、Hystrix Dashboard (断路器:Hystrix 仪表盘)

基于service-ribbon 改造,Feign的改造和这一样。

首选在pom.xml引入spring-cloud-starter-hystrix-dashboard的起步依赖:

 
   
   
     org.springframework.boot 
    
   
     spring-boot-starter-actuator 
    
   
   
   
     org.springframework.cloud 
    
   
     spring-cloud-starter-hystrix-dashboard 
    
   

在主程序启动类中加入@EnableHystrixDashboard注解,开启hystrixDashboard:

@SpringBootApplication @EnableDiscoveryClient @EnableHystrix @EnableHystrixDashboard public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } } 

打开浏览器:访问http://localhost:8764/hystrix,界面如下:

在这里插入图片描述

点击monitor stream,进入下一个界面,访问:http://localhost:8764/hi?name=forezp

此时会出现监控界面:

在这里插入图片描述

六、参考资料

circuit_breaker_hystrix

feign-hystrix

hystrix_dashboard

更多阅读

史上最简单的 SpringCloud 教程汇总

SpringBoot教程汇总

Java面试题系列汇总

史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)
扫码关注公众号有惊喜

(转载本站文章请注明作者和出处 方志朋的博客)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207532.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:40
下一篇 2026年3月19日 下午1:40


相关推荐

  • html中ul和li的使用_ul列表的html结构

    html中ul和li的使用_ul列表的html结构html中偶尔会使用到列表,记录一下。1.序号可以是数字、字母、罗马数字等,可以通过list-style-type属性设置。2.序号也可以显示图片,可以通过list-style-image

    2022年8月1日
    13
  • Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

    Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】一 讲故事看完官方文档 阅读了一些 Newtonsoft 源码 对它有了新的认识 先总结六个超经典又实用的特性 同大家一起分享 废话不多说 快来一起看看吧 二 特性分析 1 代码格式化如果你直接使用 JsonConvert SerializeObj 的话 默认情况下所有的 json 是挤压在一块的 特别不方便阅读 如下所示 staticvoidMa string args varreportMod

    2025年9月3日
    4
  • 直流电压前馈控制数字逆变电源设计与实现

    直流电压前馈控制数字逆变电源设计与实现引言逆变电源一般采用瞬时反馈控制技术来提高逆变电源的动态响应速度,减少输出电压的谐波含量,改善输出电压波形的质量。常见的逆变电源控制技术,有重复控制、谐波补偿控制、无差拍控制、电压瞬时值控制和带电流内环的电压瞬时值控制等类型[1~4]。其中,带电流内环电压瞬时值环路的双环控制方法因实现简单,系统动态性能优越和对负载的适应性强等优点,而逐渐成为高性能逆变电源的发展方向之一[4]。但传统控制方法是基于逆变电源直流侧输入电压为无脉动直流电压的假定,而实际逆变电源,存在因电网电压波动或负载突变而导致直流侧电压波

    2022年6月11日
    36
  • CLAHE的实现和研究

    CLAHE的实现和研究CLAHE 的实现和研究 CLAHE 算法对于医学图像 特别是医学红外图像的增强效果非常明显 CLAHE nbsp https en wikipedia org wiki Adaptive histogram equalization 中文方面非常好的资料限制对比度自适应直方图均衡化算法原理 实现及效果在 OpenCV 中已经实现了 CLAHE 但是它在使用过程中 存在参数选择的问题 为了从根本上搞明白 我参考了网络上的一些代码主要是来源 http blog csdn net abcd19

    2025年10月18日
    7
  • 微信小程序必用接口「建议收藏」

    微信小程序必用接口获取openiduni-app示例获取openidopenid是微信用户的一个唯一的标识,只针对当前的微信号有效。微信开发时,用户使用小程序需要授权,这时就要用到openid进行绑定这个用户。可用于永久标记一个用户,同时也是微信JSAPI支付的必传参数。一般都是将code值传到后端去获取openid,因为在前端可能会被抓包或爬取到你的appid和secret,不安全,如果放在后端获取openid,除非你的服务器被攻击了,不然就是安全的。下面的实例是在前端直接获取的,这个明白后,可

    2022年4月11日
    43
  • 超分辨率重建 matlab,基于Matlab的多图像超分辨率重建算法

    【实例简介】多图像超分辨率的实现主要就是将具有相似而又不同却又互相补充信息的配准影像融到一起,得到非均匀采样的较高分辨率数据,复原需要亚像素精度的运动矢量场,然而它们之间的运动模型估计精确与否直接影响到重建的效果,因此影像配准和运动模型的估计精度是高分辨率图像重建的关键。由于实际中不同时刻获得的影像数据间存在较大的变形、缩放、旋转和平移,因此必须对其进行配准,在此基础上进行运动模型估计。然后通过频…

    2022年4月9日
    103

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号