后端接口如何做版本控制?

2021-06-14 19:38:46 +08:00
 rockyliang

假设有下面一个场景: 1.0 版本客户端的用户注册功能,手机号是可选填的,即使用户不输入手机号也能注册,对应的后端接口 URL 是 v1/reg

但到了 1.1 版本,手机号改为了必填,这时候有两种做法:

1 )做一个新的 v2/reg 后端接口给客户端使用,缺点是,需要同时维护 v1 、v2 两个版本的接口,而且会造成两个接口的代码大量冗余,除了“手机号是否必填”不一样以外,其它功能的代码都一样

2 )让客户端把版本号传过来,后端接口根据客户端版本号来判断手机号是否必填,缺点是,接口里会充斥着很多对客户端版本号进行判断的代码,例如:

if (appVersion == "1.0") {
    // do something
} else if (appVersion == "1.1") {
    // do something
} else {
    // do something
}

上面哪种做法更好呢?或者各位大神有没有更好的版本控制方案?

7915 次点击
所在节点    程序员
49 条回复
xckai123
2021-06-14 21:53:00 +08:00
新增一个 v2,等到 v1 确定没有流量再进来后,下一次 release 再把 v1 删掉,v2 改为 v1
rockyliang
2021-06-14 21:53:30 +08:00
@polyang 是的,前面回答的同学也是这么说,所以第二种我不会考虑了,哈哈。感谢你的回答
axbx
2021-06-14 21:59:44 +08:00
网关做控制 根据账号来判断改走哪个接口
sutra
2021-06-14 22:57:31 +08:00
yeqizhang
2021-06-14 23:26:29 +08:00
我们之前用的 if 判断的,传的版本号应该用大于来判断而不是==,我寻思前面说用网关也是要写判断逻辑吧,只是换个地方写了
Luckydan
2021-06-15 08:44:56 +08:00
前端完全可以在发送请求的时候
Luckydan
2021-06-15 08:48:46 +08:00
前端在发送请求的时候无论是否手机号是必填项,都把手机号作为请求参数发到后端,后端根据手机号是否为空,再做对应的业务逻辑调用是不是稍微好点呢?
eudore
2021-06-15 09:07:15 +08:00
新增一个接口很难??
Kyle18Tang
2021-06-15 09:29:58 +08:00
95276
2021-06-15 10:07:22 +08:00
趁这个机会提醒用户升级
WollensZhang
2021-06-15 10:26:59 +08:00
header 中添加 api release 信息,同时在 controller 层做版本隔离
ak47007
2021-06-15 10:28:13 +08:00
@encro v3,v4,v5 是不是要新增 reg3 reg4 reg5 ?
yufeng0681
2021-06-15 10:54:38 +08:00
就你这个需求,手机号码在业务上已经要求是必填了。V1.0 版本的报错机制缺省就有, 后台判断不带手机号码,就返回报错,提示语: 手机号码必须填写。 不需要开发第二个接口 [针对你这个独特场景]
Drc
2021-06-15 11:59:12 +08:00
👆🏻正解
encro
2021-06-15 11:59:15 +08:00
@ak47007

本质上,其他办法只是换了个姿势加 reg3,reg4,reg5 。

对于注册这种,如果是内部不对外,影响人群不大,变更较快,没有必要采用 version,直接加一个 regWithMobile 方法可能是最简单的。不要将几分钟的活,变成几天的。将这个 version 加到变更日志和接口文档即可。
encro
2021-06-15 12:03:29 +08:00
以微信公证号接口为例:1.0-1.4 接口 url 其实是不变的,只是新增了其他方法,比如新增了新的分享到朋友圈方法,原来的分享朋友圈方法规定到某个版本废弃。
huifer
2021-06-15 12:32:11 +08:00
请求头
Rocketer
2021-06-15 13:04:46 +08:00
用 api gateway,默认各版本路由到相同的 handler,只把不同的部分路由到不同的 handler,这样就没有冗余了
rockyliang
2021-06-15 13:49:26 +08:00
@yufeng0681 这样会导致使用旧版本客户端的用户不能注册,相当于强迫用户要升级到新版本,用户体验很差。当然问题中的手机号也只是我临时想到的一个例子,而实际中肯定也还有很多场景是有着 [ 新版本功能规则做了变更,但不能影响到旧版本的用户 ] 的要求
ltruntu
2021-06-15 14:40:12 +08:00
传入参数 加一个 判断参数 nginx 直接判断 1 就转发 1 的机器 2 就转发 2 的机器 类似灰度

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX