zoukankan      html  css  js  c++  java
  • 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微服务架构与实战》

  • 相关阅读:
    SD卡性能测试
    在程序内动态获取svn版本号
    在SharePoint 2010程序中使用Session
    图片预读
    CSS图片垂直居中方法整理集合 !(常见问题解答)
    cpld的入门交流之二:秒信号发生器
    基于json数据的jQuery无限级下拉菜单插件
    MySQL 按指定字段自定义列表排序
    10张图让你更了解博客
    IE6 CSS bug: position:relative变成了absolute
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/8663763.html
Copyright © 2011-2022 走看看