SpringCloud系列十一:自定義Feign


1. 回顧

  上文我們講解了如何為服務消費者配置Feign。

  在Spring Cloud中,Feign的默認配置類是FeignClientsConfiguration,該類定義了Feign默認使用的編碼器、解碼器、所使用的契約等。

  Spring Cloud允許通過注解@FeignClient的configuration屬性自定義Feign的配置,自定義配置的優先級比FeignClientsConfiguration要高。

  在Spring Cloud的文檔中可以看到以下段落,描述了Spring Cloud提供的默認配置。

  

  由上可知,在Spring Cloud中,Feign默認使用的契約是SpringMvcContract,因此它可以使用Spring MVC的注解。

  下面自定義Feign的配置,讓它使用Feign自帶的注解進行工作。

2. 自定義Feign

  > 復制項目 microservice-consumer-movie-feign,將ArtifactId修改為 microservice-consumer-movie-feign-customizing

  > 創建@ExcludeComponent注解,被此注解注解的類不會被@ComponentScan掃描到

package com.itmuch.cloud.microserviceconsumermoviefeigncustomizing.annotation; public @interface ExcludeComponent { }

  > 創建Feign的配置類

package com.itmuch.cloud.microserviceconsumermoviefeigncustomizing.config; import com.itmuch.cloud.microserviceconsumermoviefeigncustomizing.annotation.ExcludeComponent; import feign.Contract; import feign.auth.BasicAuthRequestInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 該類為Feign的配置類 * 注意:該類不應該在主應用程序上下文的@CompantScan中 */ @ExcludeComponent @Configuration public class FeignConfiguration { /** * 用feign.Contract.Default替換SpringMvcContract契約 * * @return
     */ @Bean public Contract feignContract() { return new feign.Contract.Default(); } }

  > 修改Feign接口,使用@FeignClient的configuration屬性指定配置類,同時,將findById上的Spring MVC注解修改為Feign自帶的注解。

package com.itmuch.cloud.microserviceconsumermoviefeigncustomizing.feign; import com.itmuch.cloud.microserviceconsumermoviefeigncustomizing.config.FeignConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeigncustomizing.pojo.User; import feign.Param; import feign.RequestLine; import org.springframework.cloud.openfeign.FeignClient; /** * 使用@FeignClient的configuration屬性,指定feign的配置類 */ @FeignClient(name = "microservice-provider-user", configuration = FeignConfiguration.class) public interface UserFeignClient { /** * 使用feign自帶的注解@RequestLine * * @param id * 用戶ID * @return * 用戶信息 */ @RequestLine("GET /{id}") User findById(@Param("id") Long id); }

  > 修改啟動類,將使用@ExcludeComponent注解的類不被@ComponentScan掃描到

package com.itmuch.cloud.microserviceconsumermoviefeigncustomizing; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {com.itmuch.cloud.microserviceconsumermoviefeigncustomizing.annotation.ExcludeComponent.class})) public class MicroserviceConsumerMovieFeignCustomizingApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceConsumerMovieFeignCustomizingApplication.class, args); } }

  > 啟動 microservice-discovery-eureka

  > 啟動 microservice-provider-user

  > 啟動 microservice-consumer-movie-feign-customizing

  > 訪問 http://localhost:8010/user/1,頁面可獲取如下結果,則表示自定義的Feign配置生效

3. 總結

  和Ribbon配置自定義一樣,Feign的自定義中的配置類(FeignConfiguration)也不能包含在主應用程序上下文的@ComponentScan中,

  否則該類中的配置信息就會被所有的@FeignClient共享。

  因此,如果只想自定義某個Feign客戶端的配置,必須防止@Configuration注解的類所在的包與@ComponentScan掃描的包重疊,

  或者指定@ComponentScan不掃描@Configuration類所在包(即本例中的方式)

  如果想自定義所有的Feign客戶端的配置,則只需將@Configuration注解的類所在的包與@ComponentScan掃描的包重疊即可。

  下文將講解手動創建Feign。敬請期待~~~

4. 參考

  周立 --- 《Spring Cloud與Docker微服務架構與實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM