关键词:FeignClient、cglib动态代理、http客户端
大家好,我是入错行的bug猫。(http://blog.csdn.net/qq_41399429,谢绝转载)
最近在深入学习Spring cloud。在服务调用部分,feign
成功引起bug猫的注意,被@FeignClient
设计理念震惊到了!
http请求,竟然还可以这样玩!
ヾ(@゜∇゜@)ノ
FeignClient示例: http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html
远程服务端,提供的API
@RestController
public class RemoteHelloController {
@RequestMapping("/hello")
public String hello(String name) {
return "hello " + name;
}
}
在客户端,声明远程服务的API接口
@FeignClient(name= "spring-cloud-producer")
public interface HelloRemote {
@RequestMapping(value = "/hello")
public String hello(@RequestParam(value = "name") String name);
}
name:远程服务名,及spring.application.name配置的名称
此类中的方法,和远程服务中contoller中的方法名和参数需保持一致
web层调用远程服务
将HelloRemote注入到controller层,像普通方法一样去调用即可
@RestController
public class ConsumerController {
@Autowired
HelloRemote helloRemote;
@RequestMapping("/hello/{name}")
public String index(@PathVariable("name") String name) {
return helloRemote.hello(name);
}
}
bug猫马上试了两把,发现手感的确不错
FeignClient
加注册中心,简直是绝配!
但是,这么好用的东西,为啥米只能在Springcloud中使用?!
单独使用FeignClient时
,就比较鸡肋了。因为,一般调用第三方的接口,基本上都是需要的签名。当然可以做一个切面,拦截FeignClien
t方法,追加签名、请求头信息等,这个就需要改造了。
而且,对一些个性化需求:接口超时 (部分接口链接超时可能需要设置长些)、日志记录 (不记录一些无用的输入和响应) 支持不太友好。
不过,FeignClient
设计理念真心不错!在使用mybatis
的时候,bug猫曾经就好奇过,为什么Mapper
文件,仅仅只是一个interface
就可以了?当时没有深入研究。再看FeignClient
,又是这种模式!
为什么bug猫震惊了呢,是因为bug猫曾经也封装过通用http请求,最简版也需要两行代码。在设计的时候,根本没有考虑到这方面技术!这就涉及到bug猫的知识盲区了…
于是bug猫趁机学习了一把,仿写了一个轻量级的 catClient - 猫脸
http客户端
在以后写代码的时候,又多了一种解决方案!interface
配合动态代理
(*・´ω`・)づ 恭喜玩家 bugcat level up !
虽说是仿写,但是实际上和Feign没毛线关系。
第一版,是用程序动态生成java代码,再编译加载到虚拟机。已经在SpringMVC项目中测试通过,但是如果项目打成jar包(SpringBoot项目),动态编译时获取不到第三方jar包了,编译失败。因此舍弃这种方案,采用cglib动态代理。
项目地址:https://github.com/bugCats/cat-client-all,更多示例在examples模块
轻量级
整个项目,核心代码不到3000行。只要是springboot项目,都可以使用,仅额外需要引入fastjson。(Springmvc项目,也仅需要改一下自定义扫描地方)
支持扩展
http模块、对象序列化与反序列化模块、负载均衡模块,全部是预留接口、使用插件方式引入,可以自由搭配、按需使用;
精细化控制每个API方法
精确到具体的某个API方法,设置http链接超时,是否打印输入、输出日志;调用前添加签名、添加token;http失败回调、http失败重连机制等。
自动去包装器类
这是cat-server自动添加包装器的逆操作。开发人员应该关注具体的业务代码,重复的事、公共的事,交给程序做。
如果要断点调试,入口在com.bugcat.catclient.spi.DefaultMethodInterceptor#intercept
乾杯 []( ̄▽ ̄)*
•́ω•̀ 据说可以结合cat-server使用可以大幅缩短微服务的接口开发呢
~ THE END ~
有问题漂流瓶邮箱联系