前言

服务拆分之后,前后端同学之间关于 API 粒度的争吵越来越常见:

「前端同学请求两个接口,聚合一下数据不就行了?」后端同学想只提供业务领域基础 API 服务能力,数据组装处理则希望由前端同学完成。

「后端聚合一下,前端可以少一次请求,只负责页面渲染!」前端同学希望只负责页面渲染,而 H5、APP、小程序同一个聚合逻辑可能会出现在三端,后端聚合则只需要一次。

接口聚合服务就是我们的一个解决思路。

接口聚合服务是什么?

接口聚合服务就是一个搬运工,只是帮助前端同学聚合多个接口的返回数据,聚合之后一次性返回相应请求的结果给客户端。我们希望通过接口聚合服务这个中间层,做到可以让前端直接获取数据,而后端也能继续专心于提供基础业务领域 API 服务能力。

场景分析

  • 场景一:串行获取数据。多个请求,有关联关系。 例如:通过商品 ID 获取评论信息,通过评论中的 uid 获取用户信息
  • 场景二:并行获取数据。多个请求,无关联关系。 例如:通过商品 ID 获取商品信息、获取商品活动信息、获取当前用户已购信息

方案调研


最终我们选择了方案 A,通过自研一套简单的接口聚合中间层来解决这个问题。

于是,就有了接口聚合服务:api-aggregator。该框架有如下几个特点:

  • 核心代码在千行左右,轻量级实现。
  • 对现有代码无侵入性,无需对现有服务和代码做改造适配,现有接口可直接使用。
  • 提供了 ApiAggregatePostProcessor 拓展点来干预接口聚合的各个阶段,可拓展性强。
  • 对前端友好,前端同学可以自定义返回数据结构,支持字段动态选取。
  • 接口聚合逻辑直接通过配置文件和 api-aggregator 交流,新增聚合接口,无需发布。

api-aggregator:接口聚合服务

api-aggregator 认为一个聚合接口应该是由若干个接口的返回结果聚合而成的,因此在设计时,我们将其被划分为两个部分:接口元信息和接口之间的聚合逻辑。

ApiDefinition:接口元信息

ApiDefinition 不仅定义了接口的元信息,同时也描述了接口所需参数的来源。

api-aggregator 认为在一次接口聚合中,元信息接口的参数可能有以下一些来源:

  • 直接由客户端传递过来,即直接从 HttpRequest 中获取参数。
  • 从上个接口的返回值中获取。例如:通过商品 ID 获取评论信息,通过评论中的 uid 获取用户信息。此时 uid
    参数就需要从上个接口的返回值中获取。

ResponseDefinition:接口间聚合逻辑

ResponseDefinition 描述了接口间的聚合逻辑,通过 ResponseDefinition 前端同学可以自定义接口返回的数据结构,也可以动态选取所需字段。


如果没有 ResponseDefinition,则 api-aggregator 只能简单的将两个接口的数据平级的聚合在一起(如上左图所示)。而现在,可以通过 ResponseDefinition 来定义返回结构体,给前端同学更好的开发体验(如上图所示)

简单聊聊设计

配置文件预加载

接口聚合配置信息是由前端开发同学在管理后台配置的。

前端同学在提交配置文件之后,api-aggregator 就会对配置文件做一些静态分析:分析接口的依赖情况,是否存在循环依赖等问题。

为了提高性能,api-aggregator 将相关的配置信息解析好之后,会直接缓存在内存中,以减少对同一份配置文件的反复解析,同时,再通过定时刷新和 MQ 的 pub/sub 来保证数据的一致性。

简化 http 请求模型

api-aggregator 抽象了 HttpMethodInvoker 来发起 HTTP 请求。通过 Supplier 来获取返回结果,屏蔽了不同 Http Client 之间的 API 差异。

还记得前文提到的场景吗?

场景一:串行获取数据。多个请求,有关联关系。
场景二:并行获取数据。多个请求,无关联关系。

在 api-aggregator 中,将这两个场景进行了简化合一。

首先, api-aggregator 在解析配置文件分析接口依赖时,会根据接口的依赖情况给出一个 api-aggregator 认为是最优的 HTTP 请求流程,而不是根据配置文件定义的接口顺序依次请求。

举个例子:

假设在一次接口聚合中,需要请求接口 A、B、C,而接口 B 的数据依赖于接口 A,接口 A 和接口 C 的请求参数均可直接从 HttpRequest 中获取参数。

那么,在实际的接口聚合过程中,api-aggregator 会先请求接口 A 和接口 C,然后阻塞获取接口 A 的返回结果,最后请求接口 B。

提供扩展点

api-aggregator 提供了 ApiAggregatePostProcessor 来方便后续扩展。

通过 ApiAggregatePostProcessor,api-aggregator 可以干预一个接口聚合的整个流程,例如:缓存接口信息、增加监控日志等等。


虽然通过 ApiAggregatePostProcessor 可以来干预接口的聚合流程,但是想要添加新的 Processor 时还是需要重启api-aggregator。而 api-aggregator 作为接口聚合点,和网关相似,也是流量的集中点,在后续的版本中,可能会考虑引入 Groovy 脚本,来支持动态的开启和停用 Processor。

写在最后

欢迎大家在一起留言讨论,感谢您的阅读~~

高效开发,项目中是否有聚合服务接口相关推荐

  1. 浅析软件开发项目中的需求分析

    [摘要]在软件开发项目中,需求分析是关乎软件项目开发成败的重要因素.现在的软件项目中返工开销占了总开销很大比例,而导致返工的主要原因是需求分析不明确.针对这一情况,文章阐述了软件开发中需求分析任务.需 ...

  2. 声光报警器 | 在软件开发项目中加入声光告警、语音通知方案

    在IT软件开发项目中,有的客户有这样的需求,希望在公司的生产环境中安装硬件设备,比如声光报警灯.语音通知设备等.当软件中的某些重要信息或者异常事件发生时,向设备发送消息,通过警示音.灯光.语音三个维度 ...

  3. 详解使用VueJS开发项目中的兼容问题

    详解使用VueJS开发项目中的兼容问题 本篇文章针对在vue项目中 遇到的兼容性问题以及解决方法做了详细的总结. 一,VUE项目一般会使用axios,而axios又是基于promise的,所以,IE任 ...

  4. java编码规范文档 下载_软件项目实训及课程设计指导——制定待开发项目中各种文档的规范...

    软件项目实训及课程设计指导--制定待开发项目中各种形式文档的规范 1.制定对课程设计项目开发过程中的规范性要求 (1)从"形式"到"内容"两个方面控制和要求开发 ...

  5. 项目管理进阶--软件开发项目中的团队组成

    #项目管理进阶–软件开发项目中的团队组成 ##项目经理 项目经理负责分配资源,确定优先级,协调与客户和用户之间的交往.总而言之,就是尽量使项目团队一直集中于正确的目标.项目经理还要建立一套工作方法,以 ...

  6. 在vue项目中:统一封装 Axios 接口与异常处理

    在vue项目中:统一封装 Axios 接口与异常处理 参考文章: (1)在vue项目中:统一封装 Axios 接口与异常处理 (2)https://www.cnblogs.com/itgezhu/p/ ...

  7. Spring Boot项目中使用RestTemplate调用https接口出现 unable to find valid certification path to requested target

    问题描述:Spring Boot项目中使用RestTemplate调用https接口出现以下错误: PKIX path building failed: sun.security.provider.c ...

  8. 大型开发项目中 git 工作流的最佳实践

    Gitflow Workflow 是一个 Git 工作流,有助于持续软件开发和实施 DevOps 实践. 它由文森特·德里森 (Vincent Driessen) 在 nvie 首次出版并广受欢迎. ...

  9. 在一个软件开发项目中进行实际日程安排的十二点提示(转)

    Laura Rose , QE Manager, Rational<?XML:NAMESPACE PREFIX = O /> <?XML:NAMESPACE PREFIX = ST1 ...

最新文章

  1. 主梁弹性模量计算_收藏 | 钢结构计算公式
  2. [20160725]MyComparableTest
  3. Linux 下的格式化输出命令:print
  4. Java之String,StringBuffer,StringBuilder
  5. mvn 使用中的错误
  6. 同步应用(python 版)
  7. 读取properties文件,中文乱码
  8. Transactional ejb 事务陷阱
  9. android AES对称加密算法使用实例
  10. steam第三方授权登录不稳定(openid4java)
  11. 2022年公司企业邮箱大全
  12. MultiDesk远程桌面连接
  13. 用spark中DataFrame对数据进行去重、缺失值处理、异常值处理
  14. ubuntu的初始密码
  15. 手机内存应该看ROM还是RAM
  16. win10 自动同步时间脚本
  17. flink 任务提交问题汇总
  18. 用excel打开一个xls文件进度到36%就不动了
  19. PTA习题 7-4 定义抽象类Person、派生类Student和类Teacher
  20. FS116B FS 0.55A电流输出单通道玩具直流马达驱动器

热门文章

  1. WTD实验(lv9-day15)
  2. 编辑合成图片怎么做?手把手教你合成
  3. 试试在transformers中调用ERNIE
  4. echarts设置主副标题位置 分开设置
  5. Python实现RSA数字签名一
  6. 王小云院士真地破解了MD5吗
  7. java商城开发可以说是日臻完美
  8. 在Webots中导入自己的3D模型
  9. 同步IO(阻塞IO、非阻塞IO), 异步IO的理解
  10. 5G NR CSI-RS介绍(2)-- TRS