Hystrix
通过上一篇 <SpringCloud 初识三:Feign>
我们了解了feign消费服务的方式.本章将介绍服务容错保护工具:SpringCloud Hystrix
通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力;
Spring Cloud Hystrix
具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。
Hystrix服务降级
断开与有问题的服务访问,并快速返回定义的失败内容
基于ribbon的Hystrix服务降级
根据前面的章节<SpringCloud 初识二:服务消费与Ribbon负载>创建一个
ribbon
项目
Application
@SpringBootApplication
//@EnableCircuitBreaker 或 @EnableHystrix 开启Hystrix的使用
@EnableCircuitBreaker
//@EnableHystrix
public class ServerConsumerHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(ServerConsumerHystrixApplication.class, args);
}
}
Controller
@RestController
public class HystrixController {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback",
commandProperties = {@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")}
)
@GetMapping("/hystrixDemo")
public String getHystrixDemo() {
return restTemplate.getForObject("http://server-client/demo",String.class);
}
public String fallback() {
return "接口访问失败";
}
}
使用
@EnableCircuitBreaker
注解时@HystrixCommand
需要带上属性commandProperties = {@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")}
使用@EnableHystrix
注解只需要表明fallbackMethod
失败方法就可以了
pom
spring.application.name=server-consumer-hystrix
# 应用服务web访问端口
server.port=5001
eureka.client.service-url.defaultZone=http://localhost:1001/eureka/
http://localhost:5001/hystrixDemo
- 启动
server-client
服务时:HELLO WORD post:2001,applicationName:server-client - 关闭
server-client
服务时:接口访问失败 - 再启用
server-client
服务时:HELLO WORD post:2001,applicationName:server-client
基于Feign的Hystrix服务降级
Spring Cloud
中,Feign
默认已经整合了Hystrix
,所以只需要在配置中启用Hystrix
就会包裹全部Feign Client
中的方法,根据上一篇 <SpringCloud 初识三:Feign>内容做一些小改动
application.properties
开启断路由
server.port=4001
spring.application.name=server-consumer-feign
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
#开启Hystrix断路由
feign.hystrix.enabled=true
写一个FallbackFeign
类实现FeignDemoService
接口
@Component
public class FallbackFeign implements FeignDemoService {
@Override
public String getDemo() {
return "feign:接口访问失败";
}
}
@component
(把普通pojo实例化到spring容器中,相当于配置文件中的
<bean id="" class=""/>
)
修改FeignDemoService
接口注解@FeignClient
添加fallback
属性对应实现的FallbackFeign
类
//指定服务
@FeignClient(value = "server-client",fallback = FallbackFeign.class)
public interface FeignDemoService {
@GetMapping("/demo")
public String getDemo();
}
http://localhost:4001/feignDemo
- 启动
server-client
服务时:HELLO WORD post:2001,applicationName:server-client - 关闭
server-client
服务时:feign:接口访问失败 - 再启用
server-client
服务时:HELLO WORD post:2001,applicationName:server-client