V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
cevincheung
V2EX  ›  程序员

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

  •  
  •   cevincheung ·
    cevin · 2015-01-12 14:33:35 +08:00 · 7782 次点击
    这是一个创建于 3634 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    比如请求地址如下:/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);
    
    24 条回复    2017-11-01 16:49:36 +08:00
    huigeer
        1
    huigeer  
       2015-01-12 14:46:11 +08:00
    你们这版本迭代这这么弄的么? 好蛋疼,
    cevincheung
        2
    cevincheung  
    OP
       2015-01-12 14:52:19 +08:00
    @huigeer
    求优化方案- -#
    kqz901002
        3
    kqz901002  
       2015-01-12 14:55:16 +08:00
    @cevincheung git svn 继承
    cevincheung
        4
    cevincheung  
    OP
       2015-01-12 15:10:25 +08:00
    @kqz901002

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

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

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

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

    url 或者 header 带版本信息

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

    ver1 -> app1
    ver2 -> app2

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

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

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

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

    也就是此时起了两个 web服务, 然后用nginx转发吧
    yueyoum
        21
    yueyoum  
       2015-01-13 10:58:41 +08:00
    @liuweisj

    同样的处理方式, 不过我觉得将版本信息放入 header 更好, url还是一致的
    curiousjude
        22
    curiousjude  
       2015-01-13 15:29:08 +08:00
    不同版本的代码我们是分目录的,这样应该会比较好维护吧。比如升级到v2就创建一个v2的目录,这样v2版本的api就不会影响到v1的了。
    limbo0
        23
    limbo0  
       2015-01-13 20:16:18 +08:00
    看许多网站的 API 都是这么做的
    xiubao
        24
    xiubao  
       2017-11-01 16:49:36 +08:00
    用 DOClever 接口管理工具,自带接口管理、接口版本快照以及接口回滚;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 13:55 · PVG 21:55 · LAX 05:55 · JFK 08:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.