背景

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

服务多、接口多,如何进行第三方服务管理和调用就成了问题。

常用的服务间调用往往采用zkEureka等注册中心进行服务管理(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相关引入是为了解决ContentTypeapplication/x-www-form-urlencodedmultipart/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);
}
  • POST application/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管理多个第三方服务调用的更多相关文章

  1. Hexo+NextT第三方服务调用【4】

    该系列博客列表请访问:http://www.cnblogs.com/penglei-it/category/934299.html 摘要        静态站点与动态站点有很大的不一样,它拥有一定的局 ...

  2. SAP云平台上的ABAP编程环境里如何消费第三方服务

    在ABAP On-Premises环境下,使用ABAP编程消费第三方服务,相信很多ABAP顾问都已经非常熟悉了,无非就是使用CL_HTTP_CLIENT或者CL_REST_HTTP_CLIENT来发送 ...

  3. spring cloud 微服务调用--ribbon和feign调用

    这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...

  4. Spring Cloud Feign声明式服务调用(转载)+遇到的问题

    转载:原文 总结: 1.pom添加依赖 2.application中填写正确的eureka配置 3.启动项中增加注解 @EnableFeignClients 4.填写正确的调用接口 通过原文使用Fei ...

  5. Java 后端开发常用的 10 种第三方服务

    请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 严格意义上 ...

  6. Java 10 种常用第三方服务

    严格意义上说,所有软件的第三方服务都可以自己开发,不过从零到一是需要时间和金钱成本的.就像我们研发芯片,投入了巨大的成本,但仍然没有取得理想的成绩,有些事情并不是一朝一夕,投机取巧就能完成的. Jav ...

  7. [文章存档]Azure上部署的java app在向第三方服务传送中文时出现乱码

    https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-java ...

  8. 学习一下 SpringCloud (三)-- 服务调用、负载均衡 Ribbon、OpenFeign

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  9. SpringCloud Alibaba实战(8:使用OpenFeign服务调用)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一个章节,我们已经成功地将服务注册到了Nacos注册中心,实现了服务注册和服务发 ...

随机推荐

  1. [信号与系统]傅里叶变换、DFT、FFT分析与理解

    目录 一.前言 二.傅里叶变换 1.傅里叶级数 2.傅里叶级数系数求解 2.1.求解方法 2.2.三角函数的正交性 2.3.系数求解过程 2.4.关于傅里叶级数的个人感悟 3.引入复指数 4.总结 三 ...

  2. 微信小程序:上滑触底加载下一页

    给商品列表页面添加一个上滑触底加载下一页的效果,滚动条触底之后就发送一个请求,来加载下一页数据, 先在getGoodsList中获取总条数 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个 ...

  3. 代码小知识之UUID

    1.生成UUID(UUID保证对在同一时空中的所有机器都是唯一的,UUID的唯一缺陷在于生成的结果串会比较长.UUID 来作为数据库数据表主键是非常不错的选择,保证每次生成的UUID 是唯一的) UU ...

  4. HDOJ-1358(字符串压缩+KMP)

    Period HDOJ-1358 这题还是属于KMP算法的应用,属于字符串压缩问题.也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接. #include< ...

  5. CCF(消息传递口:80分):字符串相关+队列

    消息传递口 201903-4 本题主要是利用队列进行模拟,因为一开始我没有注意到要按照顺序,所以一开始的解法错误. #include<iostream> #include<algor ...

  6. Linux下制作Windows启动U盘的工具

    Linux下制作Windows启动U盘的工具 很多人说Linux下制作Windwos启动盘要用GRUB4DOS建立引导,其实不用,有专门的工具的,就像Windows下有Rufus制作Linux启动U盘 ...

  7. js--this指向的相关问题

    前言 关于this的指向问题是前端面试中常考的知识点,也是我们开发学习中较难理解的问题.作为JavaScript的基础,需要我们彻底理解这一关键词.this作为JavaScript中非常复复杂的机制, ...

  8. SQL 性能起飞了!

    直接上干货 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及order by涉及的列上建立索引. 应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值 ...

  9. FreeBSD 13 显卡支持

    On FreeBSD 13, using drm-devel-kmod, support is the same as on Linux 5.4. This includes support for ...

  10. 从零学脚手架(八)---webpack-dev-server源码分析

    上一篇中介绍了webpack-dev-server属性配置 这一篇就简单的梳理下webpack-dev-server内部实现. 由于涉及到源码解析,所以会涉及到一些比较难啃的知识,我会尽量进行简单化描 ...