我爱编程

微服务架构模式之 API Gateway

2018-04-10  本文已影响3743人  sinlight

大概三年前的这个时候,开始负责一个项目,是一个 P2P 产品的客户端的开发。需求很常见,基本就是需要 手机App(iOS, Android) 和 移动 H5页面。当时的一个项目背景是,已经存在多个由后端团队使用 Java 开发的微服务,承载着产品的核心业务逻辑,以及主数据的管理。这些已经存在的微服务,基本是按照领域模型划分,如会员服务,标的服务,账务服务,充值支付服务等,每个服务基本还提供相应的查询服务,另外还有一些实用工具类的,如短信服务。可以预见,在微服务架构下,一个寻常的 UI 页面,往往需要调用多个服务。而这仅仅是问题的一个方面。

让我们看看在微服务架构下,关于提供给客户端的 API 的设计,都有哪些方面的问题需要考虑

考虑到这些因素,便很自然地考虑,引入一个中间层,服务于客户端,按需定制 API,减少请求次数,同时隐藏不必要的细节。


Use an API gateway

引入这一层抽象之后,前述问题的化解,都找到一个好的抓手

在前述的项目中,微服务之间使用了 Hessian 和 SOAP 协议,经过 API gateway 的协议转换,最终只以 REST 的方式暴露 API 给客户端。

这一层的引入,显然也有一些代价

回到当时的项目中,那时还未了解到 API gateway 作为一种架构模式的存在,代码项目的名称是 web-api,但这个项目完整的承担了 API gateway 扮演的职责,有效地化解了微服务架构下,降低客户端的整体开发维护成本。

在技术选型上,实现 API gateway 常见的是采用事件驱动或者响应式的编程框架,当需要扩容应对高负载时,这是推荐的方式。在 JVM 上,可以考虑基于 NIO 的库,如 Netty,Spring Reactor 等。Node.js 也是个常见选择。


引入一点题外话,我当时对降低客户端的整体开发维护成本,还有另外一些思考,是关于沟通。日常的 UI 需求中,有不少其实是对后端微服务没有变更要求的,简单的比如,多显示一个字段,格式化显示金额,稍复杂的比如,页面呈现需要多组合一个既有的微服务,表单提交需要将部分信息反馈到另一个微服务等。对于这类需求,如果由后端团队来支持,一是会分散他们对领域服务和主数据管理的专注,二是考虑到 API gateway 这层比较薄的路由层/装配层,动态语言相比 Java 是更高效的选择。

再结合当时团队的情况,Java 开发人员普遍缺少基于 NIO 的库的开发经验,而且开发任务/风险已经偏重。而前端开发人员在编写前端组件以及实现前端构建时,都是在使用 Node.js,因此对于他们而言,使用 Node.js 上手 API gateway 的开发,门槛较低并且普遍有学习意愿。前端开发人员又是 UI 需求的直接受命人,对于前述的一大类 UI 变更需求,他们可以以最少的沟通成本,最少的信息传递失误,来高效的完成。

由此我组建了当时公司内第一个大前端部门,将前端团队和移动端团队纳入,将 API gateway 的实现和文档管理的职责纳入,大家共同围绕客户端的需求,保持较高的整体开发维护效率。此后,还在 API gateway 的基础上陆续添加了 API 版本管理,移动设备管理,客户端统计,缓存等一系列服务。


API gateway 还有很多的扩展点,试举一些例子

在 API gateway 这个领域,也有一些开源框架在活跃,如 Netflix Zuul,基于 Nginx 的 Kong 等,目前关注较少,就不展开介绍了。

上一篇 下一篇

猜你喜欢

热点阅读