SrpingCloud系统学习 - 熔断机制

SrpingCloud系统学习 - 熔断机制一 前言 SpringCloudN 实现了断路器库的名字叫 Hystrix 在微服务架构下 通常会有多个层次的服务调用 下面是微服架构下 浏览器端通过 API 访问后台微服务的一个示意图一个微服务的超时失败可能导致瀑布式连锁反映 下图中 Hystrix 通过自主反馈实现的断路器 防止了这种情况发生

一,前言

SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多个层次的服务调用. 下面是微服架构下, 浏览器端通过API访问后台微服务的一个示意图
在这里插入图片描述


一个微服务的超时失败可能导致瀑布式连锁反映,下图中,Hystrix通过自主反馈实现的断路器, 防止了这种情况发生。
在这里插入图片描述

图中的服务B因为某些原因失败,变得不可用,所有对服务B的调用都会超时。当对B的调用失败达到一个特定的阀值(5秒之内发生20次失败是Hystrix定义的缺省值), 链路就会被处于open状态, 之后所有所有对服务B的调用都不会被执行, 取而代之的是由断路器提供的一个表示链路open的Fallback消息. Hystrix提供了相应机制,可以让开发者定义这个Fallbak消息.

open的链路阻断了瀑布式错误, 可以让被淹没或者错误的服务有时间进行修复。这个fallback可以是另外一个Hystrix保护的调用, 静态数据,或者合法的空值. Fallbacks可以组成链式结构,所以,最底层调用其它业务服务的第一个Fallback返回静态数据.


在这里插入图片描述
源码下载:https://github.com/chenxingxing6/mycloud


二,测试Demo

假如我们HelloService服务部署在2台机器上,将服务加入断路器, 防止其中一个Hello挂掉后, 导致系统发生连锁超时失败。

2.1 pom.xml中添加hystrix库支持断路器

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> 

2.2 在Spring Boot启动类上添加@EnableCircuitBreaker注解

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

2.3 用@HystrixCommand注解标注访问服务的方法

@Service public class HelloService { 
    @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "serviceFailure") public String getHelloContent() { 
    return restTemplate.getForObject("http://SERVICE-HELLOWORLD/",String.class); } public String serviceFailure() { 
    return "hello world service is not available !"; } } 

@HystrixCommand注解定义了一个断路器,它封装了getHelloContant()方法, 当它访问的SERVICE-HELLOWORLD失败达到阀值后,将不会再调用SERVICE-HELLOWORLD, 取而代之的是返回由fallbackMethod定义的方法serviceFailure()。@HystrixCommand注解定义的fallbackMethod方法,需要特别注意的有两点:

第一, fallbackMethod的返回值和参数类型需要和被@HystrixCommand注解的方法完全一致。否则会在运行时抛出异常。比如本例中,serviceFailure()的返回值和getHelloContant()方法的返回值都是String。

第二, 当底层服务失败后,fallbackMethod替换的不是整个被@HystrixCommand注解的方法(本例中的getHelloContant), 替换的只是通过restTemplate去访问的具体服务。可以从中的system输出看到, 即使失败,控制台输出里面依然会有“call SERVICE-HELLOWORLD”。


2.4 在Feign应用中使用断路器

@FeignClient(name = "SERVICE-HELLOWORLD", fallback = HelloWorldServiceFailure.class) public interface HelloWorldService { 
    @RequestMapping(value = "/", method = RequestMethod.GET) public String sayHello(); } 

创建HelloWorldServiceFailure类, 必须实现被@FeignClient修饰的HelloWorldService接口。

@Component public class HelloWorldServiceFailure implements HelloWorldService { 
    @Override public String sayHello() { 
    System.out.println("hello world service is not available !"); return "hello world service is not available !"; } } 

Spring Cloud之前的Brixton版本中,Feign是缺省是自动激活了断路器的,但最近的Dalston版本已经将缺省配置修改为禁止。

可以一看到和Ribbon一样的效果。

今天的文章 SrpingCloud系统学习 - 熔断机制分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-25 15:33
下一篇 2024-12-25 15:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/96151.html