SpringCloud-day09-Feign與Hystrix整合

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

相關文章
相關標籤/搜索