8.5.Feign 与 Hystrix整合
服务熔断服务降级完全解耦java
前面的代码,用@HystrixCommand fallbackMethod是很很差的,由于和业务代码耦合度过高,不利于维护,因此须要解耦。web
首先咱们将Feign与 Hystrix整合。spring
第一,microservice-ticket-provider-hystrix-1004项目修改app
按照正常的逻辑来写;ide
TicketService加新的接口方法lockTicket():函数
1 /** 2 * 锁票业务 3 * @return 4 */ 5 public Map<String,Object> lockTicket();
TicketServiceImpl写具体实现:学习
1 @Override 2 public Map<String, Object> lockTicket() { 3 try { 4 //模拟超时用 5 Thread.sleep(2000); 6 } catch (InterruptedException e) { 7 e.printStackTrace(); 8 } 9 Map<String,Object> map=new HashMap<String,Object>(); 10 map.put("code", 200); 11 map.put("msg", "锁定的车票数据xxxxx3000"); 12 return map; 13 }
TicketProviderController正常调用service方法:测试
注意:注释部分是以前的那种方法写的,为了便于学习对比,注释保留spa
1 /** 2 * 锁票业务 3 * 4 * @return 5 * @throws InterruptedException 6 */ 7 @ResponseBody 8 @GetMapping(value = "/lockTicket") 9 // @HystrixCommand(fallbackMethod = "lockTicketFallback") 10 public Map<String, Object> lockTicket() throws InterruptedException { 11 // Thread.sleep(2000); 12 // Map<String,Object> map=new HashMap<String,Object>(); 13 // map.put("code", 200); 14 // map.put("msg", "锁定的车票数据xxxxx3000"); 15 // return map; 16 return ticketService.lockTicket(); 17 } 18 19 /** 20 * 模拟锁票超时 或者 系统故障的回调函数 21 * @return 22 * @throws InterruptedException 23 */ 24 // public Map<String,Object> lockTicketFallback() throws InterruptedException{ 25 // Map<String,Object> map=new HashMap<String,Object>(); 26 // map.put("code", 500); 27 // map.put("msg", "系统出错,稍后重试"); 28 // return map; 29 // }
第二步:microservice-common项目新建FallbackFactory类,解耦服务熔断服务降级code
TicketClientService接口,新增lockTicket()方法;
1 /** 2 * 索票业务 3 * @return 4 */ 5 @GetMapping(value="/ticket/lockTicket") 6 public Map<String,Object> lockTicket();
新建 TicketClientFallbackFactory 类,实现FallbackFactory<TicketClientService>接口;
1 package com.wfd360.service; 2 3 import com.wfd360.model.Ticket; 4 import feign.hystrix.FallbackFactory; 5 import org.springframework.web.bind.annotation.PathVariable; 6 7 import java.util.HashMap; 8 import java.util.List; 9 import java.util.Map; 10 11 /** 12 * Created by 姿式帝-博客园 on 2019/4/1. 13 * 欢迎添加笔者wx(851298348)共同探讨、学习! 14 */ 15 16 public class TicketClientFallbackFactory implements FallbackFactory<TicketClientService> { 17 @Override 18 public TicketClientService create(Throwable throwable) { 19 return new TicketClientService() { 20 @Override 21 public Ticket get(@PathVariable("id") Integer id) { 22 // 服务超时或者出错时 返回的业务逻辑 23 return null; 24 } 25 26 @Override 27 public List<Ticket> list() { 28 // 服务超时或者出错时 返回的业务逻辑 29 return null; 30 } 31 32 @Override 33 public boolean save(Ticket ticket) { 34 // 服务超时或者出错时 返回的业务逻辑 35 return false; 36 } 37 38 @Override 39 public boolean delete(@PathVariable("id") Integer id) { 40 // 服务超时或者出错时 返回的业务逻辑 41 return false; 42 } 43 44 @Override 45 public Map<String, Object> lockTicket() { 46 Map<String, Object> map = new HashMap<String, Object>(); 47 map.put("code", 500); 48 map.put("msg", "系统出错,稍后重试"); 49 return map; 50 } 51 }; 52 } 53 }
TicketClientService接口的@FeignClient注解加下 fallbackFactory属性
@FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=TicketClientFallbackFactory.class)
这类咱们实现了 降级处理方法实现;
第三步:microservice-ticket-consumer-feign-80修改 支持Hystrix
TicketConsumerFeignController新增方法调用
1 /** 2 * 索票 3 * @return 4 */ 5 @GetMapping(value="/lockTicket") 6 @ResponseBody 7 public Map<String,Object> lockTicket(){ 8 System.out.println("------调用锁票业务------------"); 9 return ticketClientService.lockTicket(); 10 }
application.yml加上hystrix支持
feign:
hystrix:
enabled: true
=======================
feign与hystrix 服务熔断服务降级完全解耦完成,测试与以前同样!
8.6.Feign Hystrix整合之超时时间配置
Feign Hystrix整合后,hystrix超时时间配置的话 这里要配置到消费端。
也就是 microservice-ticket-provider-hystrix-1004 的 yml里的
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
这个配置放到 microservice-ticket-consumer-feign-80 的yml里
可是 放进去后 大伙测试 依然无效。
这里由于还有一个 feign 也有一个超时时间的设置,固然feign底层是 ribbon的封装,因此 直接配置ribbon,ribbon默认超时也是1秒。
因此这里都是强制要求,ribbon的超时时间要大于hystrix的超时时间,不然 hystrix自定义的超时时间毫无心义。
因此还得加个 ribbon超时时间设置
ribbon:
ReadTimeout: 50000
ConnectTimeout: 6000
测试与以前同样,你们能够设定设置超时间后,在调整睡眠时间进行测试!
hystrix 的应用暂时讲到这里,本案例代码能够下载 V8版本!