## 移动端API服务的特点
大多数的移动端app,和后端都采用基于HTTP的JSON数据通信。相对于PC端,移动端的API服务最大的差异是网络环境。为了保证移动端的体验,通常后端API服务会为移动端的每个场景,定制API合并数据返回,减少移动端的请求,提高移动端的体验。
## 带来的问题
对于后端开发人员而言,提供高度可复用的原子的API接口是最理想的状态,但是对于移动端,就存在矛盾。
为了适应移动端的场景,后端API服务针对移动端的场景,定制API,在定制的API中合并数据结果。这样做虽然解决了移动端的问题,但是对于后端而言,会做很多枯燥,无聊的工作,毫无成就感,并且随着版本的迭代,会不停地去修改这些定制的门面API。
## 解决方案
对于这类情况,API 网关成为一个很好的解决方案。把服务聚合和定制的工作交给网关,后端提供原子类的API接口。笔者实现的[Gateway](https://github.com/fagongzi/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](https://github.com/fagongzi/gateway)项目
有疑问加站长微信联系(非本文作者)