在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以互相调用,在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络 原因或者自身原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务造成灾难性的严重后果,这就是服务故障的雪崩效应。
在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它是基于Netflix的开源框架Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方的节点。从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大的功能。
在之前的david-ribbon中pom.xml增加hystrix依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
在启动类中使用@EnableCircuitBreaker或@EnableHystrix注解开启Hystrix
@EnableHystrix @EnableDiscoveryClient @SpringBootApplication public class RibbonApplication { @Bean @LoadBalanced //开启负载均衡 RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); } }
也可以使用@SpringCloudApplication注解 一个相当于上面三个
//@EnableCircuitBreaker //@EnableDiscoveryClient //@SpringBootApplication @SpringCloudApplication public class RibbonApplication { @Bean @LoadBalanced //开启负载均衡 RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); } }
新增TestService
@Service public class TestService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "fallback") public String consumer(){ return restTemplate.getForObject("http://david-eureka-client/test",String.class); } public String fallback(){ return "fallback"; } }
修改TestController
@RestController public class TestController { @Autowired TestService testService; @GetMapping("/consumer") public String test(){ return testService.consumer(); } }
然后启动eureka、eureka-client、david-ribbon项目。 http://localhost:8764/consumer
test;port:8762
此时关闭client项目,再次访问则返回
fallback