你不知道的事---SringCloud的feign的继承特性
前言
说起SpringChoud的feign大家用过的都说好。Feign是Netflix开发的声明式、模板化的HTTP客户端。对于我们微服务来说,微服务之间的api调用,使用feign来说是再方便不过的。本文先介绍一下,传统的feign的调用写法方式,再介绍我们的重点feign的继承特性。
feign的继承特性有很多的好处,可以进行参数和方法的统一管理,一次修改,feign和具体的controller都变了。
总之好处还是不少的。

传统的feign的实现方式
传统的feign是怎样的实现的呢,我们先通过springmvc搞了一个controller,在controller里面实现我们代码。此时另一个微服务想直接调用这个请求,那么被调用的微服务就可以声明一个feign的客户端,将自身要提供给外部调用的方法,feign提供的方法的requestMapper路径映射和controller中的保持一致即可访问的到。
传统feign的代码实现
我们先写一个传统的controller。我们的目的很简单,这个controller来返回123。
@RestController
public class DemoController {
@PostMapping("/demo/list")
public String demo(
@RequestBody DemoFeignQueryVO demoFeignQueryVO){
return "123";
}
}
有了controller,我们来写feign。feign的代码是十分简单的,只要保证feignClint的值是我们要调用的微服务的值,然后其中的postMapping的值和上方controller的一样即可调用到。
@FeignClient(value = "user-system")
@Component
public interface IDemoFeign {
@PostMapping("/demo/list")
public String demo(
@RequestBody DemoFeignQueryVO demoFeignQueryVO);
}
传统feign的缺点
由上方的代码来看,有什么缺点呢,比如我要更改controller的参数,那么我需要改两处地方,一处是自己的controller实现,一处是feign的接口。如果忘改了的话,就会产生未知的错误。如果更改了controller的路径映射呢。同样的,也需要改两处位置。这是传统形式的一种缺点。
feign的继承特性
如果我们使用feign的继承特性,就不会有上方的情况产生,继承特性就是说,我们弄一个共用的接口,在接口上布置我们的requestMapping注解,规定我们的方法参数。然后通过controller实现这个接口。controller就可以针对接口中的方法进行一一的实现。然后针对于我们的feign接口,我们直接继承共用的接口。这样feign接口和controller方法是完全保持一致的,当需要修改的时候,完全不需要两个地方一起修改,直接更改共用的接口即可。
feign的继承特性的代码实现
我们将上述的传统方案的代码进行一个改写,通过对比,就可以看出好处。
先声明一个共用的接口。这里面写我们所有要提供给外面的方法。
public interface DemoInterface {
@PostMapping("/demo/list")
public String demo(
@RequestBody DemoFeignQueryVO demoFeignQueryVO);
}
有了接口后,我们的controller直接实现这个接口。
@RestController
public class DemoController implements DemoInterface {
@Override
public String demo(
@RequestBody DemoFeignQueryVO demoFeignQueryVO){
return "123";
}
}
我们此时就可以看到,controller不用关心路径映射了。而且针对于参数来说,如果接口一修改,controller必然会提示报错,编译不会通过,不会使你漏下改动。
接下来,实现一下我们的feign,feign是极其简单的,只要继承共用的接口即可。
@FeignClient(value = "user-system")
public interface DemoFeign extends DemoInterface {
}
看上面是不是觉得非常方便。feign和controller都不用关心路径,通过共用端口保证了路径一定一致,接口的参数检查也保障了参数不会产生问题。
feign继承特性带来的requestMapping加载问题
在我们上述的提供方案中,如果requestMapping只是在注解上,是不会出现这种问题的。但是如果当requestMapping在controller的类上的时候,那么问题就来了。我们先看一下SpringMvc加载requestMapping到容器的逻辑是什么
@Override
protected boolean isHandler(Class<?> beanType) {
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
这个是处理请求映射的判断依据。从实现中我们看到,只要被扫描的类包含了@Controller或@RequestMapping注解,就会被springMVC加载,那么controller实现了接口具备了requestmapping。feignClient也继承了接口,那么也就具备了requestMapping。两个一摸一样的requstMapping,那么是必然会产生冲突的。那么我们的目的是什么呢。controller的正常加载,feignClient不应该进行加载。
我们重新修改下feign的配置类。
@Configuration
@ConditionalOnClass({Feign.class})
public class FeignConfiguration {
@Bean
public WebMvcRegistrations feignWebRegistrations() {
return new WebMvcRegistrationsAdapter() {
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new FeignRequestMappingHandlerMapping();
}
};
}
private static class FeignRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected boolean isHandler(Class<?> beanType) {
return super.isHandler(beanType) &&
!AnnotatedElementUtils.hasAnnotation(beanType, FeignClient.class);
}
}
}
上述代码我们进行了一个排除,带feignClint我们不进行加载。
至此feign继承特性的一个隐藏的坑在这里已经没了,大家可以放心使用了。

总结
feign的继承特性是十分方便的一种方式,实实在在的减少了代码编写量,也保证了路径映射和参数的一致性。十分好用。
文中难免有不足,欢迎大家批评指正。
你不知道的事---SringCloud的feign的继承特性的更多相关文章
- JavaScript 你不知道的事 -- 关于函数
接上篇Javascript 你不知道的事,直接条列了: 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__ ...
- setTimeout,setInterval你不知道的事
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- Java-Maven(七):Eclipse中Maven依赖、聚合、继承特性
之前通过学习了解,maven集成到eclipse中的如何创建项目,以及maven命令插件在eclipse中安装后的用法.那么接下来我们将会学习一些maven在项目中的一些特性,及如何使用. Maven ...
- PHP实现多继承 - 通过接口的多继承特性(二)
原文地址:http://small.aiweimeng.top/index.php/archives/51.html 在上篇文章中写到php可以使用```Trait```实现代码的复用,下面介绍使用接 ...
- SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求
1. 回顾 上文讲解了手动创建Feign,比默认的使用更加灵活. 本文将讲解Feign对继承.压缩的支持以及日志和多参数请求的构造等. 2. Feign对继承的支持 Feign支持继承.使用继承,可将 ...
- 《挑战30天C++入门极限》图例实解:C++中类的继承特性
图例实解:C++中类的继承特性 整个c++程序设计全面围绕面向对象的方式进行,类的继承特性是c++的一个非常非常重要的机制,继承特性可以使一个新类获得其父类的操作和数据结构,程序员只需在新类中 ...
- 对于python 3.x与python2.x中新型类的继承特性总结
(1)一般性继承特性 """ 该文件对于python 3.x 及python 2.x的New-style 类的一般性继承特性进行了说明和测试. (1)实例的继承特性:搜寻 ...
- Asp.net MVC验证那些事(4)-- 自定义验证特性
在项目的实际使用中,MVC默认提供的Validation Attribute往往不够用,难以应付现实中复杂多变的验证需求.比如, 在注册用户的过程中,往往需要用户勾选”免责声明”,这个checkbox ...
- C++学习 —— 灵活的继承特性
0.继承与算法开发 在之前的笔记中,我展示了来自继承的威力.继承这种机制能够大幅度减小编码量,子类可以继承父类所有的变量,方法.利用这种机制,我们可以在其他人工作的基础上,完成有自己特色的部分.比如我 ...
随机推荐
- IIS WebDAV安全配置
本文为转载,原文地址:http://www.2cto.com/article/201307/228165.html IIS WebDAV安全配置 2013-07-16 12:13:00 作者:瞌睡龙收 ...
- 2019-2020-1 20199325《Linux内核原理与分析》第十一周作业
实验简介: Set-UID 是 Unix 系统中的一个重要的安全机制.当一个 Set-UID 程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会 ...
- 以命令行界面启动 Ubuntu
1. /etc/default/grub 将GRUB_CMDLINE_LINUX_DEFAULT一行中改为"quiet splash 3" 2. update-grub 3. 重启
- BootStrap的栅格式布局
1.栅格系统(布局) Bootstrap内置了一套响应式.移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列. 我在这里是把Bootstrap中的栅 ...
- php数组存在重复的相反元素,去重复
$arr1=array('a_b','c_d','b_a','d_c'); $arr2=array('a_b','c_d','b_a','d_c'); 条件: a_b==b_a:c_d==d_c: 需 ...
- Linux环境下,MongoDB 3.6.10 的安装步骤,以及设置用户和密码,配置随处执行mongo命令启动客户端,以及所遇到的问题
https://blog.csdn.net/qinaye/article/details/87920651 二.设置MongoDB用户和密码2.1 利用./mongo命令连接mongoDB客户端../ ...
- Rabbit and Turtle
知乎上有这样一个问题:如果兔子都在拼命奔跑,是什么给了作为乌龟的你前进的动力? 随着视野的不断开阔,我们难免怀疑自身前进的意义,曾经有很长一段时间我也深陷其中,直到看到余亦多先生的回答才有所感悟. 问 ...
- ST函数(ST表)RMQ O(1)查询 离线
ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...
- Python爬虫---爬取抖音短视频
目录 前言 抖音爬虫制作 选定网页 分析网页 提取id构造网址 拼接数据包链接 获取视频地址 下载视频 全部代码 实现结果 待解决的问题 前言 最近一直想要写一个抖音爬虫来批量下载抖音的短视频,但是经 ...
- 工厂模式(factory pattern)
工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素 ...