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微服务架构与实战》

SpringCloud系列十一:自定义Feign的更多相关文章

  1. SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介、创建消息生产者、创建消息消费者、自定义消息通道、分组与持久化、设置 RoutingKey)

    1.概念:SpringCloudStream 2.具体内容 2.1.SpringCloudStream 简介 SpringCloudStream 就是使用了基于消息系统的微服务处理架构.对于消息系统而 ...

  2. SpringCloud系列六:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)

    1.概念:Feign 接口服务 2.具体内容 现在为止所进行的所有的 Rest 服务调用实际上都会出现一个非常尴尬的局面,例如:以如下代码为例: Dept dept = this.restTempla ...

  3. SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求

    1. 回顾 上文讲解了手动创建Feign,比默认的使用更加灵活. 本文将讲解Feign对继承.压缩的支持以及日志和多参数请求的构造等. 2. Feign对继承的支持 Feign支持继承.使用继承,可将 ...

  4. SpringCloud系列——Feign 服务调用

    前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...

  5. SpringCloud系列十二:手动创建Feign

    1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...

  6. SpringCloud系列十:使用Feign实现声明式REST调用

    1. 回顾 前文的示例中是使用RestTemplate实现REST API调用的,代码大致如下: @GetMapping("/user/{id}") public User fin ...

  7. SpringCloud系列——Config 配置中心

    前言 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持.有了配置服务器,您就有了一个中心位置来管理跨所有环境的应用程序的外部属性.本文记录实现一个配置中心.客 ...

  8. SpringCloud系列——Zuul 动态路由

    前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...

  9. springcloud组件梳理之Feign

    最近刚好打算做一个springcloud系列的分享,趁此机会刚好梳理下springcloud常用组件的使用,今天先对feign做个简单介绍! feign是一个声明式的Web服务客户端,它使得发送web ...

随机推荐

  1. ( 转 ) mysql 实战 or、in与union all 的查询效率

    OR.in和union all 查询效率到底哪个快. 网上很多的声音都是说union all 快于 or.in,因为or.in会导致全表扫描,他们给出了很多的实例. 但真的union all真的快于o ...

  2. 【尺取法】【Multiset】bzoj1342 [Baltic2007]Sound静音问题

    O(n)地枚举所有长度为k的段,每次暴力转移. 转移的时候只是从最后插入一个数,从前面删去一个数. 计算的时候要取当前的max和min. 用multiset(∵元素是可重的)以上这些操作都是O(log ...

  3. 8.1(java学习笔记)注解(Annotation)

    一.Annotation Annotation不是程序本身,但它可以对程序进行解释,这一点和注释类似. 但最大的不同点在于,注解可以被其他程序读取,然后可以对其进行一些有针对性操作. 这是注解与注释最 ...

  4. Java杂谈5——关键字final与volatile

    Final关键字 在Java语言中,随着语境的不同final关键字所代表的语义会有一些细微的差异.总的来说,final关键字表达的含义是“禁止修改”,这层有点类似于C++中的const关键字.之所以要 ...

  5. java以流的形式输出文件

    原文:http://blog.csdn.net/liutt55/article/details/78126614 public void downProcessFile(HttpServletRequ ...

  6. powerbuilder webbrowser 内嵌浏览器 select下拉框无法使用

        Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MA ...

  7. ztree jquery 树 控件

    插件地址:http://www.ztree.me 数据:[{"id":1,"pId":-1,"name":"根目录"}, ...

  8. Javascript高级程序设计-问答模式

    1.谈谈javascript数组排序方法sort()的使用,重点介绍sort()参数的使用及其内部机制 sort的实现的功能类似JAVA的比较器,数据排序从多维数组的第一维开始排序可以自己定义排序方法 ...

  9. webservice ssl双向认证配置

    1.在tomcat中安装axis2插件 2.生成证书,用jdk自带的keytool 服务端 keytool -genkey -alias Server -dname "CN=192.168. ...

  10. wordcount代码实现详解

    阅读目录 1.MapReduce整体流程 2.WordCount源码 3.WordCount逐行解析 Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储, ...