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

zhangxu · · 3736 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

## 移动端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)项目

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3736 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传