【SpringCloud 技术专题】「原生态 Fegin」打开 Fegin 之 RPC 技术的开端,你会使用原生态的 Fegin 吗?(上)
前提介绍
Feign 是 SpringCloud 中服务消费端的调用框架,通常与 ribbon,hystrix 等组合使用。
由于遗留原因,某些项目中,整个系统并不是 SpringCloud 项目,甚至不是 Spring 项目,而使用者关注的重点仅仅是简化 http 调用代码的编写。
如果采用 httpclient 或者 okhttp 这样相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战,而使用 spring 中 RestTemplate,又没有配置化的解决方案,由此想到是否可以脱离 Spring cloud,独立使用 Feign。
内容简介
Feign 使得 Java HTTP 客户端编写更方便。Feign 灵感来源于 Retrofit、JAXRS-2.0 和 WebSocket。Feign 最初是为了降低统一绑定 Denominator 到 HTTP API 的复杂度,不区分是否支持 Restful。Feign 旨在通过最少的资源和代码来实现和 HTTP API 的连接。通过可定制的解码器和错误处理,可以编写任意的 HTTP API。
maven 依赖
定义配置类
options 方法指定连接超时时长及响应超时时长
retryer 方法指定重试策略
target 方法绑定接口与服务端地址。
返回类型为绑定的接口类型。
自定义接口
随机定义一个远程调用的服务接口,并且声明相关的接口参数和请求地址。
通过 @RequestLine 指定 HTTP 协议及 URL 地址
服务提供者
调用
与调用本地方法相同的方式调用 feign 包装的接口,直接获取远程服务提供的返回值。
原生 Feign 的两个问题
原生 Feign 只能一次解析一个接口,生成对应的请求代理对象,如果一个包里有多个调用接口就要多次解析非常麻烦。
Feign 生成的调用代理只是一个普通对象,该如何注册到 Spring 中,以便于我们可以使用 @Autowired 随时注入。
解决方案:
针对多次解析的问题,可以通过指定扫描包路径,然后对包中的类依次解析。
实现 BeanFactoryPostProcessor 接口,扩展 Spring 容器功能。
定义一个注解类
生成 Feign 代理并注册到 Spring 实现类:
调用接口编写示例:
接口使用示例:
注意事项:
如果接口返回的是一个复杂的嵌套对象,那么一定要明确的指定泛型,因为 Feign 在解析复杂对象的时候,需要通过反射获取接口返回对象内部的泛型类型才能正确使用 Jackson 解析。如果不明确的指明类型,Jackson 会将 json 对象转换成一个 LinkedHashMap 类型。
如果你使用的是的 Spring,又需要通过 http 调用别人的接口,都可以使用这个工具来简化调用与解析的操作。
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/ea43d67af9ecb38f5a850f427】。文章转载请联系作者。
评论