1 说明
这一篇写了通过ribbon、feign、http方式实现微服务通信,这一篇断路器基于上篇
2 整合Hystrix
pom依赖:
org.springframework.cloud spring-cloud-starter-hystrix
启动类添加 @EnableHystrix 注解
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients@EnableHystrixpublic class SalesApplication { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(SalesApplication.class,args); }}
接口如下,为了演示不同熔断方式,这里有两个 Feign 方式接口
@RequestMapping("/sales")public interface SalesRest { @RequestMapping(value = "/queryGoodsListByRibbon", method = RequestMethod.GET) Object queryGoodsListByRibbon(); @RequestMapping(value = "/queryGoodsListByFeign", method = RequestMethod.GET) Object queryGoodsListByFeign(); @RequestMapping(value = "/queryGoodsListByFeign2", method = RequestMethod.GET) Object queryGoodsListByFeign2(); @RequestMapping(value = "/queryGoodsListByHttp", method = RequestMethod.GET) Object queryGoodsListByHttp();}
通用方式熔断:在方法上添加 @HystrixCommand(fallbackMethod = "CommonFallback") ,指定目标方法调取不到后执行 CommonFallback() 熔断方法
@RestControllerpublic class SalesRestImpl implements SalesRest { @Autowired private SalesService salesService; @Override @HystrixCommand(fallbackMethod = "CommonFallback") public String queryGoodsListByHttp() { return salesService.queryGoodsListByHttp(); } @Override @HystrixCommand(fallbackMethod = "CommonFallback") public String queryGoodsListByRibbon() { return salesService.queryGoodsListByRibbon(); } @Override @HystrixCommand(fallbackMethod = "CommonFallback") public String queryGoodsListByFeign() { return salesService.queryGoodsListByFeign(); } @Override public String queryGoodsListByFeign2() { return salesService.queryGoodsListByFeign(); } public String CommonFallback() { return "CommonFallback"; }}
具体方法调用:
@Servicepublic class SalesService { @Autowired RestTemplate restTemplate; @Autowired UserFeignClient userFeignClient; private static final String RIBBON_URL = "http://user:8082/user/getUserInfo"; private static final String HTTP_URL = "http://127.0.0.1:8082/user/getUserInfo"; private static final String IP = IpUtil.getIp(); public String queryGoodsListByRibbon() { String sales_result = "queryGoodsListByRibbon success : [sales_ip:" + IP + "] "; String result = restTemplate.getForObject(RIBBON_URL, String.class); return sales_result + result; } public String queryGoodsListByFeign() { String sales_result = "queryGoodsListByFeign success : [sales_ip:" + IP + "] "; String result = (String) userFeignClient.getUserInfo(); return sales_result + result; } public String queryGoodsListByHttp() { String sales_result = "queryGoodsListByHttp success : [sales_ip:" + IP + "] "; String result = HttpClientUtil.doGet(HTTP_URL); return sales_result + result; }}
Feign 熔断:给 FeignClient 接口指定一个 fallback 实现类,然后该类实现 FeignClient 的接口,这样接口调不通时便会调用 fallback 实现类中的相应方法:
@FeignClient(name = "USER", fallback = UserFeignClientFallback.class)public interface UserFeignClient { @RequestMapping(value = "/user/getUserInfo", method = RequestMethod.GET) String getUserInfo();}
UserFeignClientFallback.class
@Componentpublic class UserFeignClientFallback implements UserFeignClient { @Override public String getUserInfo() { return "feign client fallback"; }}
3 运行结果
启动 eureka 和 sales,不启动 user ,观察接口输出
http://127.0.0.1:8081/sales/queryGoodsListByRibbon --> CommonFallbackhttp://127.0.0.1:8081/sales/queryGoodsListByHttp--> CommonFallbackhttp://127.0.0.1:8081/sales/queryGoodsListByFeign--> CommonFallbackhttp://127.0.0.1:8081/sales/queryGoodsListByFeign2--> queryGoodsListByFeign success : [sales_ip:192.168.0.102] feign client fallback
4 代码
core-simple:
eureka:
hystrix-sales:
hystrix-user: