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微服务架构与实战》
SpringCloud系列十一:自定义Feign的更多相关文章
- SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介、创建消息生产者、创建消息消费者、自定义消息通道、分组与持久化、设置 RoutingKey)
1.概念:SpringCloudStream 2.具体内容 2.1.SpringCloudStream 简介 SpringCloudStream 就是使用了基于消息系统的微服务处理架构.对于消息系统而 ...
- SpringCloud系列六:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)
1.概念:Feign 接口服务 2.具体内容 现在为止所进行的所有的 Rest 服务调用实际上都会出现一个非常尴尬的局面,例如:以如下代码为例: Dept dept = this.restTempla ...
- SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求
1. 回顾 上文讲解了手动创建Feign,比默认的使用更加灵活. 本文将讲解Feign对继承.压缩的支持以及日志和多参数请求的构造等. 2. Feign对继承的支持 Feign支持继承.使用继承,可将 ...
- SpringCloud系列——Feign 服务调用
前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...
- SpringCloud系列十二:手动创建Feign
1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...
- SpringCloud系列十:使用Feign实现声明式REST调用
1. 回顾 前文的示例中是使用RestTemplate实现REST API调用的,代码大致如下: @GetMapping("/user/{id}") public User fin ...
- SpringCloud系列——Config 配置中心
前言 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持.有了配置服务器,您就有了一个中心位置来管理跨所有环境的应用程序的外部属性.本文记录实现一个配置中心.客 ...
- SpringCloud系列——Zuul 动态路由
前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...
- springcloud组件梳理之Feign
最近刚好打算做一个springcloud系列的分享,趁此机会刚好梳理下springcloud常用组件的使用,今天先对feign做个简单介绍! feign是一个声明式的Web服务客户端,它使得发送web ...
随机推荐
- floyed算法的一些感想
for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) if(f[i][k]+f[k][j]<f[i ...
- 34、Django实战第34天:退出登录
编辑users.view.spy ... from django.contrib.auth import authenticate, login, logout from django.http im ...
- PL SQL 基础
Oracle之PL/SQL学习笔记 自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整 ...
- 【单调队列】bzoj2096 [Poi2010]Pilots
用两个单调队列维护序列中的最大值和最小值即可. poi~ #include<cstdio> #include<algorithm> using namespace std; i ...
- Java概述--Java开发实战经典
1)Java有三个发展方向,分别是Java SE,Java EE,Java ME.以下简要介绍. a.Java SE,Java Standard Edition(java标准版),包含了构成java语 ...
- winform 窗体实现增删改查(CRUD)窗体基类模式
参考博客下方:http://www.cnblogs.com/wuhuacong/archive/2010/05/31/1748579.html 对于一般常用到的编辑数据.新增数据窗体,分开了两个不同的 ...
- centos系统的时间时区和MySQL的时间时区问题
原文:http://1567045.blog.51cto.com/1557045/1074971 centos系统的时间时区和MySQL的时间时区问题 年轻人做事要细心,特别我们这些搞IT的千万不莽 ...
- 一些WCF DS 的资料(参考)
0.WCF DS 官方博客:http://blogs.msdn.com/b/astoriateam 1. 官方博客: 如何使用WCF DS5 由于V5 的程序集单独出来了! (How to ...
- 深入理解AMD和RequireJS!
AMD 基于commonJS规范的nodeJS出来以后,服务端的模块概念已经形成,很自然地,大家就想要客户端模块.而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行.但是,由于一个重大 ...
- webservice ssl双向认证配置
1.在tomcat中安装axis2插件 2.生成证书,用jdk自带的keytool 服务端 keytool -genkey -alias Server -dname "CN=192.168. ...