当前位置: 首页 > 知识库问答 >
问题:

java - api 版本控制过程中如何搭建文件结构?

宋洲
2023-04-27

目标:有两个版本的api, v1和v2,希望在使用同一个服务器的情况下,两个版本的api能同时运行。
项目结构: router/controller/service/model文件夹
解决方案:
1.v2可以完全复制粘贴v1的所有文件夹,基于v1进行修改,最终得出如下文件结构

--src
    --v1
        --v1 route
        --v1 controller
        --v1 service
    --v2
        --v2 route
        --v2 controller
        --v2 service
    --db
    --config

这种方法的情况下会有大量的重复代码,感觉不是很好。但是这个是最直观的解决方案。很笨但是有效。
2.v2可以继承v1需要修改的部分文件,并覆盖其中的一部分函数

--src
    --router
    --controller
        --user
        --user_v2 extends user //导出这个新的controller给router v2
    --service
        --user
        --user_v2

这种方式可以最小程度的重复代码,不过比如v2的时候我们改了user controller,v3的时候我们改了movie controller,最后改来改去就改乱了。而且router v2里面的大部分controller还是引用的v1 controller,只有user是新版本的controller.容易搞乱套。

所以,真心求教大佬们,如何设置文件结构,才能极其优雅的管理不同版本的api,可以有清晰的工程结构,同时,可以有最少的代码重复。可以提供与以上两种解决方式不同的任何方案。

网上真的真的搜不到好的解决方案,我想着,这互联网发展了30年了,咋这点东西都搜不到,很受打击。真心求教最佳实践。

共有1个答案

郑博
2023-04-27

之前也想过,其实你上面就已经提到了,直接拷贝代码来实现 v1/v2/v3 这种方式,或者使用继承,覆盖方法的方式。

前者会造成代码冗余,这是毋庸置疑的的。

后者有好也有坏,假设 v2 继承自 v1,v3继承自 v2,那将来 v1 发生大变化时,势必就会影响到 v2/v3。亦或者,v1 引入一个 bug 后,极有可能影响到 v2/v3。

但是对于前者,一般不怎么会出现这种情况,因为做到了代码隔离(要考虑自动加载和命名空间的问题)。


在刚刚,把这个问题丢给 ChatGPT 以后,他给出了一个之前我未曾想到过的方案,就是把代码交给 VCS,即版本控制系统,比如 Git,由其中的分支来实现。分别创建 v1/v2/v3 分支,类似于拷贝代码,但是代码更加规整了。

我觉得这样算是优解,只不过在部署时需要部署多份了,但是这样还可以降低运行的风险,如果其中一个版本出现问题,不至于影响到其他版本。

 类似资料:
  • Eggjs resfulApi 路由版本控制 插件:egg-router-plus 文档:https://github.com/eggjs/egg-router-plus 安装:cnpm i -S egg-router-plus 配置 插件配置 // {app_root}/config/plugin.js exports.routerPlus = { enable: true, pa

  • Easyswoole 提供了高自由度的版本控制插件,版本控制的代码实现主要文件均在CoreComponentVersion目录中; 而版本控制的核心关键点在于对onRequest事件进行全局拦截,再做版本鉴定和请求重新分发。 使用 首先,在App目录下建立Version目录,并在目录内建立如下示例Version类文件,该类主要进行版本设置等。 <?php namespace AppVersion;

  • 我一直在搜索如何使用Spring3.2.x管理REST API版本,但没有找到任何易于维护的内容。我先解释一下我遇到的问题,然后再给出一个解决方案...但我不知道我是不是在重新发明轮子。 以1.0版本的API为例,到1.8版本,在1.0版本中引入了一个处理程序,并在1.7版本中进行了修改,我希望以以下方式处理这个问题。假设代码在一个控制器中,并且有一些代码能够从头中提取版本。(以下为Spring无

  • 问题内容: 每次编译Go应用时,是否可以自动增加次要版本号? 我想在程序中设置一个版本号,并带有一个自动递增部分: 我设置的版本号是0.5,而132则是每次编译二进制文件时都会自动增加的值。 Go中有可能吗? 问题答案: Go链接器(go工具链接)具有一个选项,用于设置未初始化的字符串变量的值: 值。请注意,在Go 1.5之前,此选项采用两个单独的参数。现在,需要在第一个=符号上拆分一个参数。 作

  • 本章提供了网络 API 的版本控制指南。由于一个 API 服务可能提供多个 API 接口),因此 API 版本控制策略适用于API 接口级别,而不适用于 API 服务)级别。 为了方便起见,术语 API 指的是以下各节中的 API 接口。 网络API应该使用语义化的版本。比如给定版本号 MAJOR.MINOR.PATCH: 当做出不兼容修改的时候,修改 MAJOR 版本号 当以向后兼容的方式添加功

  • 你要为项目做版本控制,学会为项目做版本控制,是开发者的必备技能。用的工具叫 git。 git git 是一种版本控制工具,工具的使用只是一个熟练过程。 https://git-scm.com/ 安装 可以在 git 官网下载适合自己操作系统上用的 git 。也可以使用系统包管理去安装 git,Windows 如果下载了完整版的 cmder ,里面已经包含了 git 。 Windows Window