App 多版本服务端兼容

APP 多版本服务端兼容

移动互联网时代,APP软件迭代非常频繁,由于APP充当一个客户端,发布新的APP版本的时候,势必导致出现多版本,这样服务端就会导致多个不同的客户端请求。这区别于我们传统的B/S 浏览器是固定的,用户通过浏览器访问的地址也是一样的。但是APP不同的版本,我们访问的接口地址就不一定一致了。强制用户升级APP,可能会导致用户流失,因此采用多版本共存就是必须的

多版本控制策略

API的版本控制策略通常有3种模式:

  • 第一种:The Knot:无版本,即平台的API永远只有一个版本,所有的用户都必须使用最新的API,任何API的修改都会影响到平台所有的用户。甚至平台的整个生态系统。

img

  • 第二种:Point-to-Point:点对点,即平台的API版本自带版本号,用户根据自己的需求选择使用对应的API,需要使用新的API特性,用户必须自己升级。

    img

  • 第三种:Compatible Versioning:兼容性版本控制,和The Knot一样,平台只有一个版本,但是最新版本需要兼容以前版本的API行为。

    img

多版本共存的方案

  • URL中加入不同版本的路径
/v1/user
/v2/user
  • 使用子域名
v1.xx.com
v2.xx.com
  • URL中请求中加入不同的版本信息
xxx.com/api.php?version=v1
xxx.com/api.php?version=v2
  • 在请求头中加入版本号信息
api_version:1.0

几种方案的优缺点

  • 方案1中的。使用不同的路径进行控制,这种方法比较简单有效,相互隔离,不同的APP版本访问不同的代码,但是缺点就是会导致代码冗余,当版本一多的时候,就会发现维护多个版本的痛苦.

    --v1
    -- controler
    -- model
    --v2
    -- controler
    -- model
  • 方案2,方案2可以利用git 的 分支和标签功能将不同的代码打上版本号,然后把不同的版本发布到不同的子域名下,不至于在代码库里出现大量的版本的代码,还可以利用减轻覆盖,但是缺点就是增加了运维维护的困难,而且域名解析可能涉及到不同的部门,这个沟通也麻烦。发布一次解析一次,导致子域名越来越多。

    v1.xx.com 1.1.1.1
    v2.xx.com 2.2.2.2
  • 方案3和方案4中的好处就是不至于出现大量的版本目录结构,但是缺点就是增加了大量的判断版本信息,和不同的逻辑方法。这样的代码逻辑会越来越长,混乱不堪

    public function index()
    {
      $version = request()->get('version');
      if($version == '1.0') {
          $this->v1();
      }else if($version == '2.0') {
          $this->v2();
      }
    }

总结

web环境和APP接口不一致,即使你提示用户更新了,但是用户还是不更新,这样就遗留多个版本。APP版本不是特别严重的BUG,一般不进行强制更新,可能会导致用户流失。所以维护一个兼容多个版本的APP接口,需要做到兼容不容易,个人比较倾向于方案2,这种通过git 管理不同的tag,同时也可以将流量分到不同的版本服务器上。但是缺点就是部署麻烦。

在写接口的时候,尽量做到拓展性高一点,把一些潜在的功能预留一下。比如获取商品列表。v1你可能就直接把所有的商品查出来了。但是v2可能会有limit,v3可能会有order、group、sort等

数据库方面,尽量加字段。不要更改原来的字段,以免影响之前的业务逻辑。要对老版本用户进行监控,当用户数少于0的时候,可以进行放弃老版本。万不得已的时候,可以强制更新。

维护版本接口是灾难的,尤其是版本多了之后,还有不同版本的文档维护。如果是内嵌HTML5.那么就没有这些问题了。所以为了PWA 应该是主流。

参考资料

本作品采用《CC 协议》,转载必须注明作者和本文链接
闲云野鹤
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 5

最后的链接 https://www.lucissfer.com/2018/03/20/Nginx... 提供的NGINX解决方案也可以

5年前 评论
xianyunyehe

@lovecn nginx的方式是可以,主要也是拦截header 转发请求。每次上次也是运维去更改对应的配置文件。

5年前 评论

这几种方案感觉都不是很好啊. 我们现在就是代码里有很多 版本判断

4年前 评论

还有没有好的办法

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!