大多数的移动端app,和后端都采用基于HTTP的JSON数据通讯。相对于PC端,移动端的API服务最大的差别是网络环境。为了保证移动端的体验,一般后端API服务会为移动端的每一个场景,定制API合并数据返回,减小移动端的请求,提升移动端的体验。git
对于后端开发人员而言,提供高度可复用的原子的API接口是最理想的状态,可是对于移动端,就存在矛盾。github
为了适应移动端的场景,后端API服务针对移动端的场景,定制API,在定制的API中合并数据结果。这样作虽然解决了移动端的问题,可是对于后端而言,会作不少枯燥,无聊的工做,毫无成就感,而且随着版本的迭代,会不停地去修改这些定制的门面API。正则表达式
对于这类状况,API 网关成为一个很好的解决方案。把服务聚合和定制的工做交给网关,后端提供原子类的API接口。笔者实现的Gateway的API网关正是这样的解决方案。json
Gateway是使用Go实现的API网关,支持API服务聚合的功能。咱们使用一个例子来看看Gateway如何帮助咱们更好地构建移动端友好的API服务。后端
首先咱们有一个会员的后端API服务提供了2个API服务:api
/api/user/base?userId=xxx网络
会员基本信息接口app
/api/users/{userId}/account设计
会员帐户信息接口server
在APP的我的信息页面上要同时显示这2类信息
备注:这里我为了演示Gateway的rewrite功能,上面的API接口URL设计并很差,有点乱。然而在现实状况下,这个2个接口有多是两个系统提供,彻底可能出现这种状况。
首先,咱们须要定义一个符合Restful规范的API,而后这个URL在网关上须要给转换成后端服务的2个API调用,而且合并结果返回。
在gateway的admin管理系统上,建立2个Cluster,分别对应基本信息查询接口和帐户信息查询接口后端server的集群。
在gateway的admin管理系统上分别建立对应2个接口实现的真实后端Server的信息,其中最主要的信息就是ip和port
把真实server绑定到对应的Cluster上。
在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项目