来自鼎*的面试问题,简单地说,我搞砸了...我还真的没有考虑过这个问题,稀里糊涂一顿胡说,我都感觉自己丢人。

现在大部分公司都做APP,所以面临一个版本兼容的问题。

APP功能的增加导致server接口不停的进行修改,增加.老接口可能在新的版本中不在使用,但并不能保证没有跨度大的历史版本APP用户,又不能直接修改或删除老server接口。

这里,必须保证更新后,历史版本也能同时使用。

(转自http://www.elecfans.com/emb/jiekou/20180223638453.html)


一、客户端兼容,端口不兼容

1、APP强制更新 [UX:造成用户体验下降]

接口URL:api.xxx.com/v1.0/xxxx.java

接口的URL中加入版本号,如上:v1.0。

每次发布新APP版本就强制更新。

灰度服务器 部署正在审核中的 接口版本(如:v1.1)。等审核通过后,将老版本的APP设置强制更新,这样老的接口就不用了。

然后把线上服务器重新部署上最新的代码,再去掉灰度服务器。

这样APP接口全部访问正式的线上服务器。

2、热更新

紧急的小需求可以用热更新,大的需求建议还是用原生的代码,因为你用热更新修改完(用JS或Lua),最后还要在原生代码里修改。

网游用热更新的比较多,因为网游的APP太大,不可能加个小关卡 就要求用户重新下载,并且游戏更新比企业级APP更频繁,用热更新可以不断新加关卡、场景、活动推广。

3、React Native 和Weex

据说Weex比React Native(React衍生物)好用(weex项目的编译时间会呈指数型上升)。然而,没用过。

二、服务端版本兼容

全部接口版本是否统一:

所有的接口都用 相同的版本号:这样要发一个APP新版本就统一修改版本号,好修改,但是如果想修改其中一个接口的版本号就不行了。

每个接口的版本号可以不一样:这样比较灵活,建议这样做。

因为已经好多年没有做过服务端了。下面的见解如果有错误,希望指正。

1、每个接口逻辑里 加if 判断(不建议)

接口URL:api.xxx.com/api?version=v1&.。

if (version == ‘1.5.0’) {

do_something

} else if (version ==‘1.4.0‘) {

do_something

}

优点:实现简单

缺点:不同版本的逻辑都在一个方法里,在于容易造成代码混乱,不利于维护。

2、不同的文件夹

相当于每个接口版本都是一个独立的项目。放到服务器的独立文件夹里。

例如:

接口URL:api.xxx.com/v1.0/xxxx.php

文件夹位置:Controller/V1.0/

-----------------/xxxx.php

文件夹位置:Controller/V2.1/

-----------------/xxxx.php

优点:版本逻辑分开维护。看url就能知道哪个版本。删除多余版本 不用修改代码。

缺点:同个接口不同版本 文件是重复的。并且 如果有个接口前几版就有问题,一直遗留到现在,就需要改好几套一样的代码。

3、不同版本 用不同的方法 :

类似:

接口URL:api.xxx.com/v1.0/xxxx.php

class XXXX{

public functionV1_0() { }

public functionV2_0() { }

}

java或者C# 都有路由配置,可以用路由配置不同版本的URL跳转到不同的方法里。

4、用继承的方式

采用继承的方式,既可以利用之前的接口代码,又可以采用override的方式修改部分接口的实现。

这样是可以的。但是如果你上个版本(也就是父类)修改了代码,就会影响后面的所有版本。

在线上有bug或者需求变更的时候 很可能会修改基类。

大家可以讨论下。

5、部署到不同的服务器

不同版本不同分支,部署在不同的服务器上。如果某个版本用不到了,直接干掉服务就好了。

例如我现在的API要从1.x升到不兼容的2.0版本了,那就给当前的发布分支打个Tag。等哪天1.x版的API需要fix bug,就能很简单地从这个Tag切一个1.x的分支出来fix bug后进行测试发布,而且这个分支不会合并到任何分支,所以不会影响其他版本。

这个方案 不好的地方在于,如果2.0也有同样bug的话,也要在2.0分支上改一遍。如果版本很多的话,这活就不好干了。所以呢,一般不会同时发布两个以上的版本,在升级不兼容的第三个版本前,一定会把第一个版本干掉。

但是比如 淘宝、微信 ,有的时候忘记更新了,你会发现淘宝已经升级过4、5个版本了,然后老版本还能用。也就是有的APP确实需要兼容4、5个版本。

另外,如果要兼容过多的版本,服务器也需要够多才行。同时,因为老版本的人用的少,也就是有的服务器访问量很少,有的服务器访问量很多。不能真正的负载均衡,浪费了服务器资源。

6、混合使用

两种方式的混合使用。服务端的几种方法混用:

6.1、第3种和第4种方法一起用。先用继承,如果新版本和以前的版本无法复用,就用路由设置新的方法。

6.2、第1种方法和第3中方法一起用,简单的小改动用 第1种,加个if判断。改动较大的用 第3种,新开个方法。

转载于:https://www.cnblogs.com/legiorange/p/9130758.html

移动端接口:版本的兼容相关推荐

  1. App应用接口版本兼容设计和使用原则

    背景 由于不同版本的升级与APP的客户端的升级是一致的,所以接口就不能像web一样能实时更新,代码可以每次拉取都不同,因为接口更新就应该遵守连续性原则 几个版本解释 在项目开发过程中,为了不同的目的, ...

  2. 客户端需求多变,怎么合理设计服务端API版本?

    ▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 笔者曾负责vivo应用商店服务器开发,有幸见证应用商店从百万日活到几千万日活的发展历程.应用商 ...

  3. 移动端总结和手机兼容问题

    移动端总结和手机兼容问题   H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=devi ...

  4. Jboss与jdk版本不兼容问题

    环境背景: JDK环境:1.7 Jboss:4.2.0.1 问题背景: EJB发布webserivce已经成功,能够成功访问wsdl. 使用axis1自带的sample/client下的类测试,则测试 ...

  5. JDK版本不兼容问题

    项目背景 近期公司对管理端交易代码进行维护升级,代码是ssh的老项目.公司源码部分丢失,还要对资源进行反编译比对.由于通知我时使用的是jdk1.8+tomcat7,交工时出现了jdk版本不兼容得问题. ...

  6. ubuntu内核和驱动版本不兼容_彻底解决ubuntu循环登录和显卡驱动问题

    目录 什么是循环登录 开机/重启后的登录界面,分辨率变得很低,并且输入密码后黑屏一闪而过又重新回到输入密码的界面,如此循环无法跳出,俗称"循环登录". 为什么会循环登录 造成循环登 ...

  7. 高版本Chrome兼容window.showModalDialog办法

    高版本Chrome兼容window.showModalDialog办法 方式一:回调 兼容方式: 由于showmodaldialog 不属于W3C标准,在新版本浏览器中不再受支持,我们需要使用wind ...

  8. 安卓和旧版本不兼容_旧方法和旧设备阻碍了数字革命

    安卓和旧版本不兼容 Legacy technology - the established platforms, databases, and devices used in organization ...

  9. 戴尔G3 3579笔记本无法使用耳机上的麦克风/声卡驱动异常/无声音/声卡版本不兼容 的一个解决办法

    戴尔G3 3579笔记本麦克风用不了/声卡驱动异常/无声音/声卡版本不兼容 的一个解决办法 遇到的问题(症状) 戴尔G3 3579笔记本重装系统后插入耳机不再弹出询问框询问插入的是何种设备 识别不到普 ...

最新文章

  1. Linux学习系列之Mount
  2. 使用try-with-resources替代try finally释放资源
  3. 为什么linux远程一进入sudo su就卡住_Linux 实战(上)
  4. php 整行插入mysql_MySQL的多行插入
  5. D3 Handling Events
  6. Knowledge Integration Networks for Action Recognition AAAI 2020
  7. UVA1585 LA3354 Score【水题】
  8. c语言编程投影仪,当贝投影F1C评测 投影仪的2019年圆满收官之作
  9. Structs2-Action
  10. 新版PassXYZ已上线,新增一次性密码(OTP)管理功能
  11. 编译安装libmodbus库
  12. 如何从PayPal提现
  13. ubuntu18.04+opencv3.4.10+opencv3.4.10contrib+LSD使用
  14. PayPal集成标准版案例(asp.net)关键源码
  15. 【收藏】Mimics Lnnovation Suite之导出功能
  16. PA=LU(带行交换的矩阵分解)
  17. Visual Studio滚动条设置
  18. No2-Java入门
  19. 基于python的全部开源的快速开发平台
  20. 一是最简单的例子让你学会如何使用XML来做一个页面

热门文章

  1. linux 编辑脚本 vi,linux中vi编辑器的练习心得
  2. 计算机的好处和坏处的英语作文,《电脑的好处和坏处》英语作文 80词以上 谢谢...
  3. c语言的适当大小的子集,编译原理上机实验报告
  4. (5.1) Tomcat 8 源码, 实例化组件
  5. 刷新页面时间不重置 前端倒计时_brackets:前端开发工程师必备编辑器之一
  6. redistemplate 设置失效时间_袋式除尘器滤袋失效分析
  7. 服务器传感器不显示,服务器传感器不显示
  8. spacevim 添加自动折行
  9. 开发日记-20190817 关键词 Hello Unix
  10. 开发日记-20190503 关键词 汇编语言(二)