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版本!