博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springcloud入门之断路器Hystrix(四)
阅读量:5924 次
发布时间:2019-06-19

本文共 3657 字,大约阅读时间需要 12 分钟。

什么是断路器

断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。

  在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

Netflix Hystrix   在Spring Cloud中使用了Hystrix 来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。

  接下来我们就以一个简单的例子,介绍一下Spring cloud Hystrix的使用

  首先在工程中添加spring cloud hystrix的依赖:

org.springframework.cloud
spring-cloud-starter-hystrix
复制代码

在工程的启动类中加入@EnableCircuitBreaker开启熔断器功能

@SpringBootApplication@EnableDiscoveryClient@EnableCircuitBreakerpublic class Application {     @Bean    @LoadBalanced    public RestTemplate restTemplate(){        return new RestTemplate();    }     public static void main(String[] args){        SpringApplication.run(Application.class,args);    }}复制代码

这里也可以使用SpringCloud对应的@SpringCloudApplication注解来修饰启动类,从代码可以看到,该注解包含了其他的三个注解,也就以为着一个标准的SpringCloud程序包含着服务发现和熔断机制。欢迎大家一起学习研究相关技术愿意了解源码的朋友直接求求交流分享技术:2147775633

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootApplication@EnableDiscoveryClient@EnableCircuitBreakerpublic @interface SpringCloudApplication {}复制代码

新增ComputeService类,在使用ribbon消费服务的函数上增加@HystrixCommand注解来指定回调方法

@Servicepublic class ComputeService {     @Autowired    private RestTemplate restTemplate;     @HystrixCommand(fallbackMethod = "addServiceFallback")    public String addService(){        return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();    }     public String addServiceFallback() {        return "error";    }}复制代码

提供rest接口的Controller改为调用ComputeService的addService

@RestControllerpublic class ConsumerController {     @Autowired    private ComputeService computeService;     @RequestMapping(value = "/add", method = RequestMethod.GET)    public String add() {        return computeService.addService();    } }复制代码

 验证断路器的回调

依次启动eureka-server、compute-service、eureka-ribbon工程 访问http://localhost:1111/可以看到注册中心的状态 访问http://localhost:3333/add,页面显示:30 关闭compute-service服务后再访问http://localhost:3333/add,页面显示:error Feign使用Hystrix

  注意这里说的是“使用”,没有错,我们不需要在Feigh工程中引入Hystix,Feign中已经依赖了Hystrix,我们可以在未做任何改造前,尝试下面你的操作:

依次启动eureka-server、compute-service、eureka-feign工程 访问http://localhost:1111/可以看到注册中心的状态 访问http://localhost:3333/add,调用eureka-feign的服务,该服务会去调用compute-service的服务,计算出10+20的值,页面显示30 关闭compute-service服务,访问http://localhost:3333/add,我们获得了下面的报错信息

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sat Jun 25 22:10:05 CST 2016 There was an unexpected error (type=Internal Server Error, status=500). add timed-out and no fallback available. 如果您够仔细,会发现与在ribbon中的报错是不同的,看到add timed-out and no fallback available这句,或许您已经猜到什么,看看我们的控制台,可以看到报错信息来自hystrix-core-1.5.2.jar,所以在这个工程中,我们要学习的就是如何使用Feign中集成的Hystrix。

  使用@FeignClient注解中的fallback属性指定回调类

@FeignClient(value = "compute-service", fallback = ComputeClientHystrix.class)public interface ComputeClient {     @RequestMapping(method = RequestMethod.GET, value = "/add")    Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b); }复制代码

创建回调类ComputeClientHystrix,实现@FeignClient的接口,此时实现的方法就是对应@FeignClient接口中映射的fallback函数。

@Componentpublic class ComputeClientHystrix implements ComputeClient {     @Override    public Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b) {        return -9999;    } }复制代码

再用之前的方法验证一下,是否在compute-service服务不可用的情况下,页面返回了-9999。

转载地址:http://ngivx.baihongyu.com/

你可能感兴趣的文章
实用的vi/vim 键盘图
查看>>
proguard 不混淆内部类的方法
查看>>
关于两个世界体系的对话
查看>>
netbeans encoding
查看>>
Java反序列化漏洞之weblogic本地利用实现篇
查看>>
Java 8新特性探究(4):类型注解 复杂还是便捷
查看>>
我的友情链接
查看>>
LVS集群系统详解
查看>>
微信开发 OAuth2.0 授权问题
查看>>
【码云周刊第 62 期】五花八门的验证码程序,看看你遇到过几个?
查看>>
Centos更换源
查看>>
DNS服务器的配置
查看>>
Eclipse 插件 FindBugs安装和使用
查看>>
Delphi 与 DirectX 之 DelphiX(65): TDIB.DoBrightness();
查看>>
网管监控系统评估对比2
查看>>
Dll 使用 PChar 参数的小例子 - 回复 "linximf" 的问题
查看>>
使用 IntraWeb (43) - 测试读取 SqLite (二)
查看>>
【Java每日一题】20170109
查看>>
Servlet包简介
查看>>
JDK7 try-with-resource
查看>>