仿FeignClient轻量级http客户端 - 猫脸

关键词: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时,就比较鸡肋了。因为,一般调用第三方的接口,基本上都是需要的签名。当然可以做一个切面,拦截FeignClient方法,追加签名、请求头信息等,这个就需要改造了。

而且,对一些个性化需求:接口超时 (部分接口链接超时可能需要设置长些)、日志记录 (不记录一些无用的输入和响应) 支持不太友好。


不过,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模块

  1. 轻量级
    整个项目,核心代码不到3000行。只要是springboot项目,都可以使用,仅额外需要引入fastjson。(Springmvc项目,也仅需要改一下自定义扫描地方)

  2. 支持扩展
    http模块、对象序列化与反序列化模块、负载均衡模块,全部是预留接口、使用插件方式引入,可以自由搭配、按需使用;

  3. 精细化控制每个API方法
    精确到具体的某个API方法,设置http链接超时,是否打印输入、输出日志;调用前添加签名、添加token;http失败回调、http失败重连机制等。

  4. 自动去包装器类
    这是cat-server自动添加包装器的逆操作。开发人员应该关注具体的业务代码,重复的事、公共的事,交给程序做。




如果要断点调试,入口在com.bugcat.catclient.spi.DefaultMethodInterceptor#intercept



乾杯 []( ̄▽ ̄)*


•́ω•̀ 据说可以结合cat-server使用可以大幅缩短微服务的接口开发呢



~ THE END ~

有问题漂流瓶邮箱联系





你可能感兴趣的:(java,FeignClient,http客户端,cglib动态代理)