高效开发,项目中是否有聚合服务接口
前言
服务拆分之后,前后端同学之间关于 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。
写在最后
欢迎大家在一起留言讨论,感谢您的阅读~~
高效开发,项目中是否有聚合服务接口相关推荐
- 浅析软件开发项目中的需求分析
[摘要]在软件开发项目中,需求分析是关乎软件项目开发成败的重要因素.现在的软件项目中返工开销占了总开销很大比例,而导致返工的主要原因是需求分析不明确.针对这一情况,文章阐述了软件开发中需求分析任务.需 ...
- 声光报警器 | 在软件开发项目中加入声光告警、语音通知方案
在IT软件开发项目中,有的客户有这样的需求,希望在公司的生产环境中安装硬件设备,比如声光报警灯.语音通知设备等.当软件中的某些重要信息或者异常事件发生时,向设备发送消息,通过警示音.灯光.语音三个维度 ...
- 详解使用VueJS开发项目中的兼容问题
详解使用VueJS开发项目中的兼容问题 本篇文章针对在vue项目中 遇到的兼容性问题以及解决方法做了详细的总结. 一,VUE项目一般会使用axios,而axios又是基于promise的,所以,IE任 ...
- java编码规范文档 下载_软件项目实训及课程设计指导——制定待开发项目中各种文档的规范...
软件项目实训及课程设计指导--制定待开发项目中各种形式文档的规范 1.制定对课程设计项目开发过程中的规范性要求 (1)从"形式"到"内容"两个方面控制和要求开发 ...
- 项目管理进阶--软件开发项目中的团队组成
#项目管理进阶–软件开发项目中的团队组成 ##项目经理 项目经理负责分配资源,确定优先级,协调与客户和用户之间的交往.总而言之,就是尽量使项目团队一直集中于正确的目标.项目经理还要建立一套工作方法,以 ...
- 在vue项目中:统一封装 Axios 接口与异常处理
在vue项目中:统一封装 Axios 接口与异常处理 参考文章: (1)在vue项目中:统一封装 Axios 接口与异常处理 (2)https://www.cnblogs.com/itgezhu/p/ ...
- 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 ...
- 大型开发项目中 git 工作流的最佳实践
Gitflow Workflow 是一个 Git 工作流,有助于持续软件开发和实施 DevOps 实践. 它由文森特·德里森 (Vincent Driessen) 在 nvie 首次出版并广受欢迎. ...
- 在一个软件开发项目中进行实际日程安排的十二点提示(转)
Laura Rose , QE Manager, Rational<?XML:NAMESPACE PREFIX = O /> <?XML:NAMESPACE PREFIX = ST1 ...
最新文章
- 主梁弹性模量计算_收藏 | 钢结构计算公式
- [20160725]MyComparableTest
- Linux 下的格式化输出命令:print
- Java之String,StringBuffer,StringBuilder
- mvn 使用中的错误
- 同步应用(python 版)
- 读取properties文件,中文乱码
- Transactional ejb 事务陷阱
- android AES对称加密算法使用实例
- steam第三方授权登录不稳定(openid4java)
- 2022年公司企业邮箱大全
- MultiDesk远程桌面连接
- 用spark中DataFrame对数据进行去重、缺失值处理、异常值处理
- ubuntu的初始密码
- 手机内存应该看ROM还是RAM
- win10 自动同步时间脚本
- flink 任务提交问题汇总
- 用excel打开一个xls文件进度到36%就不动了
- PTA习题 7-4 定义抽象类Person、派生类Student和类Teacher
- FS116B FS 0.55A电流输出单通道玩具直流马达驱动器