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