使用API网关构建移动端友好的API服务

移动端API服务的特点

大多数的移动端app,和后端都采用基于HTTP的JSON数据通信。相对于PC端,移动端的API服务最大的差异是网络环境。为了保证移动端的体验,通常后端API服务会为移动端的每个场景,定制API合并数据返回,减少移动端的请求,提高移动端的体验。

带来的问题

对于后端开发人员而言,提供高度可复用的原子的API接口是最理想的状态,但是对于移动端,就存在矛盾。

为了适应移动端的场景,后端API服务针对移动端的场景,定制API,在定制的API中合并数据结果。这样做虽然解决了移动端的问题,但是对于后端而言,会做很多枯燥,无聊的工作,毫无成就感,并且随着版本的迭代,会不停地去修改这些定制的门面API。

解决方案

对于这类情况,API 网关成为一个很好的解决方案。把服务聚合和定制的工作交给网关,后端提供原子类的API接口。笔者实现的Gateway的API网关正是这样的解决方案。

使用Gateway

Gateway是使用Go实现的API网关,支持API服务聚合的功能。我们使用一个例子来看看Gateway如何帮助我们更好地构建移动端友好的API服务。

背景

首先我们有一个会员的后端API服务提供了2个API服务:

  • /api/user/base?userId=xxx

    会员基本信息接口

  • /api/users/{userId}/account

    会员账户信息接口

在APP的个人信息页面上要同时显示这2类信息

备注:这里我为了演示Gateway的rewrite功能,上面的API接口URL设计并不好,有点乱。然而在现实情况下,这个2个接口有可能是两个系统提供,完全可能出现这种情况。

方案

首先,我们需要定义一个符合Restful规范的API,然后这个URL在网关上需要给转换成后端服务的2个API调用,并且合并结果返回。

创建2个Cluste

在gateway的admin管理系统上,创建2个Cluster,分别对应基本信息查询接口和账户信息查询接口后端server的集群。

创建真实后端Server

在gateway的admin管理系统上分别创建对应2个接口实现的真实后端Server的信息,其中最主要的信息就是ip和port

绑定操作

把真实server绑定到对应的Cluster上。

创建聚合URL

在Admin系统上创建一个聚合URL为:^/api/users/(\d+)/info$,这个是一个正则表达式。然后在这个聚合URL上创建2个聚合调用:分别对应2个真实API的提供Cluster

  • /api/user/base?userId=$1

    对应用户基本信息接口的后端集群:cluster1,同时设置返回的数据在聚合json的attr属性为:base

  • /api/users/$1/account

    对应用户账户信息接口的后端集群:cluster2,同时设置返回的数据在聚合json的attr属性为:account

效果

这个时候,APP 向gateway 请求 /api/users/10000/info,gateway的会拆分应用请求,同时调用设置好的2个调用,并且聚合数据返回:{"base": {基本信息返回的json}, "account": {账户信息返回的json}},然后返回给APP

以上简单介绍了API Gateway的作用,详细的介绍可以在github上查看Gateway项目

猜你喜欢

转载自my.oschina.net/u/2244142/blog/768466