Java | 使用OpenFeign管理多个第三方服务调用
背景
最近开发了一个统一调度类的项目,需要依赖多个第三方服务,这些服务都提供了HTTP接口供我调用。

服务多、接口多,如何进行第三方服务管理和调用就成了问题。
常用的服务间调用往往采用zk、Eureka等注册中心进行服务管理(SpringBoot常使用SpringCloud)。OpenFeign也是SpringCloud的解决方案之一。我们单独使用OpenFeign, 无需对原有第三方服务进行改动,本服务开发时的引入也很轻量。
下面给出我的用法。
应用
maven依赖
引入maven依赖:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>10.2.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>10.2.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.8.0</version>
</dependency>
其中,form相关引入是为了解决ContentType为application/x-www-form-urlencoded和multipart/form-data的编码问题。
配置和服务声明
第三方服务的地址通过配置来注入。
服务地址配置
ThirdpartServiceConfig.java
@Data
@Component
@ConfigurationProperties(prefix = "thirdpart-service")
public class ThirdpartServiceConfig {
private String serviceA;
private String serviceB;
private String serviceC;
}
服务配置(超时时间配置等也可以写在这里)
application.yaml
thirdpart-service:
serviceA: http://****:***/
serviceB: http://****:***/
serviceC: http://****:***/
第三方服务配置
因为声明方法一致,所以省略了多个第三方声明。
ThirdPartClientConfig.java
@Configuration
public class ThirdParttClientConfig {
@Resource
private ThirdpartServiceConfig thirdpartServiceConfig;
@Bean
public ServiceAClient serviceAClient() {
return Feign.builder()
.encoder(new FormEncoder(new GsonEncoder()))
.decoder(new GsonDecoder())
.target(ServiceAClient.class, thirdpartServiceConfig.getServiceA());
}
}
接口声明和使用
完成了服务的声明和服务的配置之后,就可以进行服务接口的声明了。具体声明方法可以参看OpenFeign文档:[# 翻译: Spring Cloud Feign使用文档
](https://segmentfault.com/a/1190000018313243?utm_source=tag-newest)
下面给出使用示例:
GET请求(feign可直接将返回的结果反序列化为本服务中定义的POJO)
@RequestLine("GET testGet?a={a}&b={b}")
ServiceResp testGet(@Param("a") String a,@Param("b")String b);
GET下载
使用feign.Response接收请求结果
@RequestLine("GET export?exportId={exportId}")
Response exportFromServiceA(@Param("exportId")String exportId);
@Resource
private ServiceAClient serviceAClient ;
// 导出方法
public void export(exportId) {
Response serviceResponse = serviceserviceAClient.exportFromServiceA(exportId);
Response.Body body = serviceResponse.body();
try(InputStream inputStream = body.asInputStream();
// 处理获取到的inputStream
} catch (IOException e) {
log.error("导出发生异常",e);
}
POSTapplication/json"
@RequestLine("POST /save")
@Headers("Cofntent-Type: application/json")
ServiceResp saveEntity(EntityPOJO entityPOJO);
- POST form
@RequestLine("POST uqa/repo/qa/batch")
@Headers("Content-Type:multipart/form-data")
ServiceResp uploadFile(@Param("id")String id, @Param("batch_file") File file);
- 注意:除了file类型,其他参数会被序列化为String,所以若第三方接口参数的值为POJO(或Map),可能会出错。
- 对于POJO参数,若第三方参数名含有
Java中不合法的属性字符(如 ”-“,”#“,”.“等),可使用注解进行序列化时的转化。由于声明Feign Client时使用的encoder是Gson,所以使用如下注解:
@SerializedName(value="aaa-bbb")
private String aaaBbb;
如果使用的是其他序列化工具,改为对应的注解即可。
小结
使用声明式的第三方和接口写法,基本覆盖了请求第三方接口的需求,也易于拓展和管理。
我计划在后续添加统一的鉴权、日志打印和异常捕获处理功能,使依赖组件引入的风险更为可控。OpenFeign帮我们实现了服务声明、接口声明、HTTP请求发送和结果处理等逻辑,在项目需要调用多个第三方服务时可以使用。
Java | 使用OpenFeign管理多个第三方服务调用的更多相关文章
- Hexo+NextT第三方服务调用【4】
该系列博客列表请访问:http://www.cnblogs.com/penglei-it/category/934299.html 摘要 静态站点与动态站点有很大的不一样,它拥有一定的局 ...
- SAP云平台上的ABAP编程环境里如何消费第三方服务
在ABAP On-Premises环境下,使用ABAP编程消费第三方服务,相信很多ABAP顾问都已经非常熟悉了,无非就是使用CL_HTTP_CLIENT或者CL_REST_HTTP_CLIENT来发送 ...
- spring cloud 微服务调用--ribbon和feign调用
这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...
- Spring Cloud Feign声明式服务调用(转载)+遇到的问题
转载:原文 总结: 1.pom添加依赖 2.application中填写正确的eureka配置 3.启动项中增加注解 @EnableFeignClients 4.填写正确的调用接口 通过原文使用Fei ...
- Java 后端开发常用的 10 种第三方服务
请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 严格意义上 ...
- Java 10 种常用第三方服务
严格意义上说,所有软件的第三方服务都可以自己开发,不过从零到一是需要时间和金钱成本的.就像我们研发芯片,投入了巨大的成本,但仍然没有取得理想的成绩,有些事情并不是一朝一夕,投机取巧就能完成的. Jav ...
- [文章存档]Azure上部署的java app在向第三方服务传送中文时出现乱码
https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-java ...
- 学习一下 SpringCloud (三)-- 服务调用、负载均衡 Ribbon、OpenFeign
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- SpringCloud Alibaba实战(8:使用OpenFeign服务调用)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一个章节,我们已经成功地将服务注册到了Nacos注册中心,实现了服务注册和服务发 ...
随机推荐
- Python分类模型构建
分离训练集测试集 from sklearn.model_selection import train_test_split eg: X_train, X_test, y_train, y_test = ...
- Redis 内存淘汰机制详解
一般来说,缓存的容量是小于数据总量的,所以,当缓存数据越来越多,Redis 不可避免的会被写满,这时候就涉及到 Redis 的内存淘汰机制了.我们需要选定某种策略将"不重要"的数据 ...
- 基于url-to-pdf-api构建docker镜像,制作一个网页另存服务
基于url-to-pdf-api构建docker镜像,制作一个网页另存服务 业务背景: 需要根据一个url路径打印这个网页的内容 解决方案: 1.使用wkhtml2pdf 2.使用puppeteer ...
- js--闭包与垃圾回收机制
前言 闭包和垃圾回收机制常常作为前端学习开发中的难点,也经常在面试中遇到这样的问题,本文记录一下在学习工作中关于这方面的笔记. 正文 1.闭包 闭包(closure)是Javascript语言的一个难 ...
- vue关于导航守卫的几种应用场景
beforeEach 该钩子函数主要用来做权限的管理认证 router.beforeEach((to, from, next) => { if (to.matched.some(record = ...
- PHP代码审计_用==与===的区别
目录 背景介绍 如何审计 绕过案例1 绕过案例2 背景介绍 比较==与===的差别 == 是等于符号,=== 是恒等于符号,两个符号的功能都是用来比较两个变量是否相等的,只不过两个符号的比较维度不一样 ...
- jQuery实现游戏推荐
1.需求:点击添加游戏按钮实现添加游戏,点击删除按钮,删除游戏. 2.实现思路:分别给添加按钮和删除按钮添加click事件. 3.遇到的问题:自己添加的游戏不能进行删除. 4.原因分析:文档加载完毕后 ...
- $nextTick解决Vue组件卸载在加载合并的问题
情况是这样的,父子组件都是复选框,点击父组件的复选框,子组件的复选框要显示并全选,取消复选框,子组件隐藏.子组件显隐我用的 v-if ,使用created钩子函数来使子组件处于全选状态. 但是出现的问 ...
- SQL SERVER跨数据库服务,联表进行查询
SELECT * FROM 数据库A..表A a, 数据库B..表B b WHERE a.field=b.field
- .NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service
实在是被某软忽悠瘸了,愤而写此一篇.希望能让同样需求的同学们少走弯路.某软在<在 Windows 服务中托管 ASP.NET Core>中,介绍了通过创建Worker Service工程, ...