1. 程式人生 > >SpringCloud微服務 之Feign(二-Customize)

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端服務提消費編寫(單例項) (參考前例)。

  • 訪問:http://localhost:8082/deal/2:
    在這裡插入圖片描述

小結

  • 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。