背景

最近开发了一个统一调度类的项目,需要依赖多个第三方服务,这些服务都提供了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请求发送和结果处理等逻辑,在项目需要调用多个第三方服务时可以使用。

最新文章

  1. 算法系列:FFT 002
  2. Object C中Block用法
  3. win8下出现安装sql2012 正在启动操作系统功能"NetFx3"
  4. 北京联想招聘-IOS高级 加入qq 群:220486180 或者直接在此 留言咨询
  5. js String Trim函数
  6. [转] Android LocalService与RemoteService理解
  7. jquery $(this).attr $(this).val方法使用介绍--useful
  8. In-Cell、On-Cell和OGS全贴合屏幕技术区别
  9. gpu显存(全局内存)在使用时数据对齐的问题
  10. Android 开发笔记___DateUtil——Time
  11. Newbit 启用淘宝店域名
  12. Java基础:HashMap中putAll方法的疑惑
  13. JAVA常用API的总结(2)
  14. saltstack主机管理项目:编写插件基类-获取主机列表-提取yaml配置文件(四)
  15. 自定义Write节点的afterrender属性
  16. J2EE--Servlet生命周期与原理
  17. php mongodb manager 查数据的各种姿势
  18. Centos7.0 配置docker 镜像加速
  19. 创意时钟 人形时钟 可惜不是 https
  20. hammer使用: 代码:捏合、捏开、图片放大 的一个手机图片“放大缩小可拖动”的小效果

热门文章

  1. 【Notes_9】现代图形学入门——光线追踪(基本原理)
  2. Flask:处理Web表单
  3. Python3+pygame实现Windows经典扫雷
  4. OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)
  5. PTA甲级—数学
  6. 一个把数据转化成Excel导出的程序 python Django
  7. go-优雅地关机或重启
  8. Springboot 轻量替代框架 Solon 1.3.10 发布
  9. 【odoo14】odoo 14 Development Cookbook【目录篇】
  10. python ORM之sqlalchemy