你是怎么管理后端的接口版本的

2015-01-12 14:33:35 +08:00
 cevincheung

后端接口版本一多,管理好像特别麻烦

比如请求地址如下:/v1/user/login, /v2/user/login

现在的是方案是:

<?php
class user...
class v1_user extends user...


if (!class_exists($vClass)) $cn = 'base';
else $cn =& $vClass;

$result = call_user_func(array($cn, $method));
echo do($result);
7749 次点击
所在节点    程序员
24 条回复
huigeer
2015-01-12 14:46:11 +08:00
你们这版本迭代这这么弄的么? 好蛋疼,
cevincheung
2015-01-12 14:52:19 +08:00
@huigeer
求优化方案- -#
kqz901002
2015-01-12 14:55:16 +08:00
@cevincheung git svn 继承
cevincheung
2015-01-12 15:10:25 +08:00
@kqz901002

访问的URL不变。变的只是版本啊…… 现在是rewrite到index.php 然后获取版本,取class名字,如果没有定义指定版本的class就调用base版。

你意思是每个版本都是独立目录?
learnshare
2015-01-12 15:11:07 +08:00
用 url 区分版本真的好么?不应该是接口自己升级,尽量不影响客户端么
cevincheung
2015-01-12 15:13:44 +08:00
@learnshare
现在是没影响啊。旧的版本没人动的。新版本发布后只是在controller目录里增加一个vn的目录而已。旧的被废弃的接口在入口就直接ban掉请求了。
kqz901002
2015-01-12 15:17:05 +08:00
@cevincheung 旧的可以用git做tag啊
sectic
2015-01-12 15:26:02 +08:00
给app的借口最好带有版本
siteshen
2015-01-12 15:29:29 +08:00
暂时没有加入版本的概念,只是实现API时,尽量做到向后兼容。实在遇到不兼容时,加入下面的代码:

if (version <= 1.5.4) {
return 1.5;
} else {
return 2;
}
tabris17
2015-01-12 15:35:59 +08:00
这些版本都是同时使用的?
cevincheung
2015-01-12 15:53:08 +08:00
@tabris17 嗯,同时在使用的,因为app的第一版后会逐渐增多一些功能而且同一功能不同版本可能输出的结构不同

@siteshen 你懂了- -#
@sectic 就是这样啊
tczzjin
2015-01-12 16:10:24 +08:00
在nginx层url重定向到目录吧,v1目录和v2目录都维护一套完整的api接口,
最好不要再class名字上做文章,管理起来很奇怪,也不利于ide解析生成文档啥的
Actrace
2015-01-12 16:19:36 +08:00
单独两套接口的意义是在以后你会降低维护成本。
一个接口多版本的意义是装哔。。。
ipconfiger
2015-01-12 16:27:06 +08:00
如果V2 的接口不存在就自动去V1去取数据就ok了,自动降级处理
tabris17
2015-01-12 16:31:30 +08:00
如果V1和V2的请求数据和返回数据格式不一样那就应该当作两个接口来处理
huigeer
2015-01-12 16:36:23 +08:00
版本: branch -> trunk -> prepareonline -> online
kukat
2015-01-12 20:14:15 +08:00
namespace
liuweisj
2015-01-13 10:52:06 +08:00
后端跑多个版本的项目, project-v1 , project-v2 用nginx 把http://host:[prot]/v1/query 的upstream配置到 project-v1的地址 ,http://host:[prot]/v2/query 的upstream配置到 project-v2的地址
yueyoum
2015-01-13 10:54:37 +08:00
做过这方面工作,当时是在url上做文章,后来一想,还是在 http request header 上弄比较好,不过原理是一样的:

url 或者 header 带版本信息

nginx 根据 url 或者 header 来分发请求

ver1 -> app1
ver2 -> app2

如果数据库改动太大,确实很难兼容的时候, 就版本客户端不让登录,强制升级
yueyoum
2015-01-13 10:56:50 +08:00
@cevincheung

>> 你意思是每个版本都是独立目录?

我是这个意思, 见上面解释

比如 已经部署了 web/myweb/
然后升级到了 v2, 但以前的还要保留
那么 就 把v2 部署到 web/myweb-v2

也就是此时起了两个 web服务, 然后用nginx转发吧

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

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

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

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

© 2021 V2EX