Java使用OpenFeign管理多个第三方服务调用

 更新时间:2021年06月16日 10:53:00   作者:Ygria  
最近开发了一个统一调度类的项目,需要依赖多个第三方服务,这些服务都提供了HTTP接口供我调用。感兴趣的可以了解一下

背景

最近开发了一个统一调度类的项目,需要依赖多个第三方服务,这些服务都提供了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使用文档

下面给出使用示例:

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管理多个第三方服务调用的文章就介绍到这了,更多相关Java 第三方服务调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文彻底搞定Java中常用集合的排序方法

    一文彻底搞定Java中常用集合的排序方法

    在某些特殊的场景下我们需要在Java程序中对List集合进行排序操作,下面这篇文章主要给大家介绍了关于Java中常用集合的排序方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • XML Web 服务 Eclipse实现sun-jaxws.xml文件的方法

    XML Web 服务 Eclipse实现sun-jaxws.xml文件的方法

    在sun-jaxws.xml文件,可以配置endpoint、handler-chain等内容,在这个文件中配置的内容会覆盖在Java代码中使用注解属性配置的的内容,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2023-11-11
  • JavaCV实现照片马赛克效果

    JavaCV实现照片马赛克效果

    这篇文章主要介绍了如何通过JavaCV实现照片马赛克效果,文中的示例代码讲解详细,对我们学习JavaCV有一定的帮助,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-01-01
  • java数学工具类Math详解(round方法)

    java数学工具类Math详解(round方法)

    这篇文章主要为大家详细介绍了java数学工具类Math,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 一篇文章告诉你如何在Java数组中插入一个字符

    一篇文章告诉你如何在Java数组中插入一个字符

    本篇文章主要介绍了Java数组中插入一个字符的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-10-10
  • Mybatis使用@param注解四种情况解析

    Mybatis使用@param注解四种情况解析

    这篇文章主要介绍了Mybatis使用@param注解四种情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 详解Java设计模式之职责链模式

    详解Java设计模式之职责链模式

    责任链模式是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java使用强大的Elastisearch搜索引擎实例代码

    Java使用强大的Elastisearch搜索引擎实例代码

    本篇文章主要介绍了Java使用强大的Elastisearch搜索引擎实例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-05-05
  • 5分钟快速了解String.trim()到底做了什么事

    5分钟快速了解String.trim()到底做了什么事

    trim方法一般用来去除空格,但是根据JDK API的说明,该方法并不仅仅是去除空格,它能够去除从编码'\u0000'至'\u0020'的所有字符,这篇文章主要给大家介绍了如何通过5分钟快速了解String.trim()到底做了什么事,需要的朋友可以参考下
    2021-11-11
  • springboot实现拦截器的3种方式及异步执行的思考

    springboot实现拦截器的3种方式及异步执行的思考

    实际项目中,我们经常需要输出请求参数,响应结果,方法耗时,统一的权限校验等。本文首先为大家介绍 HTTP 请求中三种常见的拦截实现,并且比较一下其中的差异。感兴趣的可以了解一下
    2021-07-07

最新评论