SpringCloud微服務 之Feign(二-Customize)
前言
上一節 我們學習瞭如何在SpringCloud微服務架構需下使用Feign(所有Feign的功能使用的是預設配置)來完成一個典型的服務消費者與服務提供者間的通訊(基於Http Protocol)。同時我們也需要了解一下幾點,SpringCloud對Fegin的封裝後
-
Feign使用的預設配置:
- Decoder feignDecoder:ResponseEntityDecoder(其中包含SpringDecoder。
- Encoder feignEncoder:SpringEncoder。
- Logger feignLogger:Slf4jLogger。
- Contract feignContract:SpringMvcContract:MVC模型的Contract,上一小節我們就是用的是Feign的SpringMvcContract,這是SpringCloud對Feign封裝之後的擴充套件,其實Feign有自己的MVC Contract。
- Feign.Builder feignBuilder:HystrixFeign.Builder。
- Client feignClient:如果Ribbon啟用,則為LoadBalancerFeignClient,否則將使用預設的feign客戶端。
-
Feign的非預設配置(但仍能從Spring application Context中獲取)
- Logger.Level:服務節點的日誌級別。
- Retryer:服務呼叫是的重試機制。
- ErrorDecoder:服務調用出現Error時的編碼解釋與機制。
- Request.Options
- Collection < RequestInterceptor>
- SetterFactory
下面我們將通過一個較為簡單的案例來學習一下如何自定義FeignClient。
案例
-
Eureka Server端編寫:(參考前例)。
-
Eureka Client端服務提供方編寫(參考前例)。
-
專案結構
-
CoreCode
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients //開啟FeignClient註解 public class MicroserviceDealBrokerFeignCustomizedApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceDealBrokerFeignCustomizedApplication.class, args); } }
@Configuration public class FeignConfiguration { /** * Feign預設使用的是SpringMVC的contract並支援所有SpringMVC contract支援的註解 * Feign預設使用的是Feign自己封裝的feignContract * (MVCcontract)若是用Feign的Contract則自定義的Feign interface中需要使用Feign自己的mvc * contract * * @return */ @Bean public Contract feignContract() { return new feign.Contract.Default(); } /** * Feign的Logger輸出級別 *@return */ @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
@FeignClient(name = "microservice-deal-cloud",configuration=FeignConfiguration.class) public interface FeignClientInterface { /** * 使用Feign自己的mvc Contract,它與SpringMVC Contract有一些不一樣,參考下例子 * 1、對Http請求的註解有增強封裝:@RequestLine VS @RequestMap/@Getmapping * 2、@Param VS @Pathvariable * 3、使用Feign自己的 mvc contract我們可以自定義對Http增強的處理,比如使用@Headers宣告Content-Type為 json * 更多參考:https://github.com/OpenFeign/feign * @param id * @return */ @Headers("Content-Type: application/json") @RequestLine("GET /deal/{id}") public Deal findById(@Param(value="id") Long id); }
@RestController public class BrokerController { @Autowired private FeignClientInterface feignClientInterface; @GetMapping("/deal/{id}") public Deal findById(@PathVariable(value="id") Long id) { return this.feignClientInterface.findById(id); } }
server: port: 8082 spring: application: name: microservice-deal-broker-cloud-feign eureka: client: serviceUrl: defaultZone: http://localhost:8080/eureka/ instance: prefer-ip-address: true #使用Feign時必須新增以下兩項配置 ribbon: eureka: enabled: true #設定feign的hystrix響應超時時間(必須) hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 5000 logging: level: com.example.deal.client.feign.FeignClientInterface: DEBUG #pringCloud封裝的Feign目前只支援DEBUG級別的日誌輸出
-
-
Eureka Client端服務提消費編寫(單例項) (參考前例)。
小結
-
Feign有自己的源生的MVC Contract(參考本節服務消費者中的FeignClientInterface.java中的註解),經過SpringCloud的高度封裝之後,在SpringCloud微服務架構下Feign的預設MVC contract是SpringMVC的contract。
-
自定義FeignClient我們可以對Feign的預設配置和擴充套件功能做自定義,如本小節的案例中對Feign的default contract做了自定義,同理我們也可以自定義其他預設配置和非預設配置,參考這裡。 在自定義的同時也要在FeignClientInterface中宣告自定義的宣告類,參考FeignClientInterface.java
-
對於一些業務場景個人建議使用Feign自己源生的配置和擴充套件功能以避免出現各種坑的現象。比如在MVC Contract的定義上建議使用Feign源生的Contract。
-
Feign Logger的自定義需要在Feign的自定義配置配中對輸出日誌做宣告:Logger.Level feignLoggerLevel(),同時在配置檔案中配置logging:level:com.example.deal.client.feign.FeignClientInterface: DEBUG。
-
本小節用到的案例:microservice-deal-eureka、microservice-deal-cloud、microservice-deal-broker-cloud-feign-cusomized。