概述
源码地址:SpringCloud学习源码
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
针对上述问题,Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。它也是基于Netflix的开源框架Hystrix实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点, 从而对延迟和故障提供更强大的容错能力。Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。
在未加入断路器之前,如果将Eureka服务提供者停掉,那么在执行Eureka 消费者的时候,会发生错误:
配置断路器:
在服务消费者中启用断路器机制@EnableHystrix或者@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ConsumerMovieRibbonApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerMovieRibbonApplication.class, args);
}
}
在接口上方配置@HystrixCommand(fallbackMethod = “fallback”)
定义对应的fallbackMethod 。
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/movie/{id}")
public String findById(@PathVariable Long id) {
ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider-user");
System.out.println("===" + ":" + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort());
return this.restTemplate.getForObject("http://provider-user/simple/" + id, User.class).toString();
}
public String fallback(Long id){
return "fallback error:"+id;
}
}
然后,再次启用Eureka 注册中心,Eureka服务消费者,关闭Eureka服务提供者,执行消费者请求,会发现:
需要注意的是:fallbackMethod 和接口方法的返回值,需要保持一致。
最后
以上就是欢呼草莓为你收集整理的SpringCloud框架初探(六) : Hystrix容错保护的全部内容,希望文章能够帮你解决SpringCloud框架初探(六) : Hystrix容错保护所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复