V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qviqvi
V2EX  ›  Java

微服务项目如何管理模块,如何用 git 管理版本

  •  1
     
  •   qviqvi · 2023-02-15 12:14:52 +08:00 · 4221 次点击
    这是一个创建于 666 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小厂项目不成熟,想请教一下大家

    项目是 springboot 微服务项目,不同业务功能在不同业务模块中,另外有一个公共模块,各个业务模块会依赖这个公共模块。

    请问下面哪种方案好?或者有什么更好的方案?

    方案一: 见一个父项目,在父项目中建立各个业务模块和公共模块,所有业务模块继承父项目并依赖公共模块。所有代码在一个 git 项目中管理

    方案二: 各个业务模块各自建一个项目,公共模块也建一个项目,各个业务模块依赖公共模块,作为多个 git 项目管理

    43 条回复    2023-02-22 17:18:58 +08:00
    RedBeanIce
        1
    RedBeanIce  
       2023-02-15 12:22:43 +08:00 via iPhone
    我们是方案 2
    tianmalj0613
        2
    tianmalj0613  
       2023-02-15 12:25:08 +08:00
    如果能用方案 1 的项目,会有成为分布式单体的倾向
    debuggerx
        3
    debuggerx  
       2023-02-15 12:33:30 +08:00
    看模块间的关联性和耦合程度。
    关联性大耦合度高的就放在一个 git 里,强行分开是自找麻烦。
    有些“伪微服务”项目,想跑起来就得狗一样哼哧哼次 clone 一堆仓库,动不动出问题就是某个仓库更新了,关联模块的仓库没更新……
    XiLingHost
        4
    XiLingHost  
       2023-02-15 12:40:24 +08:00
    这种可以考虑方案二,然后依靠 gradle 和 maven 来管理依赖关系
    hhjswf
        5
    hhjswf  
       2023-02-15 12:51:04 +08:00 via Android
    我们是方案 1
    Akitora
        6
    Akitora  
       2023-02-15 13:00:13 +08:00
    方案 1 路过
    dayeye2006199
        7
    dayeye2006199  
       2023-02-15 13:03:22 +08:00
    如果不是项目大到不行(几个 G 的源代码),直接推荐 monorepo (也就是方案 1 )
    thinkershare
        8
    thinkershare  
       2023-02-15 13:03:57 +08:00   ❤️ 2
    最好去掉公共模块。不要使用公共模块,共享内核模式是个糟糕的实践。
    thinkershare
        9
    thinkershare  
       2023-02-15 13:05:17 +08:00
    如果需要使用共享模块,就将其当做一个第三方库引入,否则最终一定会演化为一堆耦合的分布式单体。
    chendy
        10
    chendy  
       2023-02-15 13:15:38 +08:00
    方案三:不拆服务直接单体
    除非有动态扩缩,不同模块不同团队维护,模块单独卖之类的需求,否则拆服务弊大于利
    perfectlife
        11
    perfectlife  
       2023-02-15 13:17:15 +08:00
    推荐方案二,管理方便,并且 cicd 做起来也方便
    lzgshsj
        12
    lzgshsj  
       2023-02-15 13:18:49 +08:00
    直接 monorepo
    wolfie
        13
    wolfie  
       2023-02-15 13:35:31 +08:00
    几人团队可以 1 ,但是 1 很蠢。
    8355
        14
    8355  
       2023-02-15 13:40:53 +08:00
    能选择的话肯定是方案 2
    你现状是方案 1 吧...
    raptor
        15
    raptor  
       2023-02-15 13:46:25 +08:00
    @chendy 哈哈哈,人艰不拆。但实际上人家会觉得做单体不够高大上。
    raycool
        16
    raycool  
       2023-02-15 14:05:13 +08:00
    2 应该好点吧
    dengji85
        17
    dengji85  
       2023-02-15 14:07:04 +08:00
    应该方案二吧,方案一不同的团队开发还要拉取整个工程,怎么看都不合适
    youmilk
        18
    youmilk  
       2023-02-15 14:16:44 +08:00
    务必方案 2 ,方案 1 很麻烦。
    dcncy
        19
    dcncy  
       2023-02-15 14:19:21 +08:00 via iPhone
    方案二
    nothingistrue
        20
    nothingistrue  
       2023-02-15 14:20:08 +08:00
    看你的项目周期,项目周期短(客户小而多,每个客户都要做一次定制),需要一客户一分支甚至一客户一仓库,这样的话宜用方案一,因为用方案二的话一个月就要鸡飞狗跳的做一次新项目上不同服务之间的分支对接。项目周期大(最短的项目也要 6 个月实际开发,至少一年的商务对接时间,可能好几年就只做一个客户),那么宜用方案二,这样更能发挥微服务的好处。
    li746224
        21
    li746224  
       2023-02-15 14:25:21 +08:00
    我们是方案 1 ,但是 1 真的很蠢。
    我们内部已经吐槽过很多次了
    ForkNMB
        22
    ForkNMB  
       2023-02-15 14:57:04 +08:00
    别埋坑啦,肯定方案二啊 公共模块有单独的 git 项目,maven 打成包引入到业务里面
    tramm
        23
    tramm  
       2023-02-15 14:57:17 +08:00
    那个, Git 自带子模块的哇.
    建一个总的仓库, 各个服务作为子模块版本各自管理
    xuanbg
        24
    xuanbg  
       2023-02-15 15:33:09 +08:00
    第二种方案才是正确的。
    WindProtect
        25
    WindProtect  
       2023-02-15 15:41:54 +08:00
    我们用的 1 ,改代码什么的是爽,但 ci/cd 确实麻烦。monorepo 如果不是大公司有精力填坑,不然建议还是别搞了。。。
    samin
        26
    samin  
       2023-02-15 15:57:07 +08:00
    方案一叫单仓多项目,腾讯现网很多项目都是这种方式,有啥毛病 ?说会成为分布式单体的,是对 maven 打包不大熟吧。运维角度来看,方案一二打包产物都一样的,只是管理方式不一样

    总结:方案一可以减少版本的烦恼,方案二可以提升研发同学的开发体验
    yazinnnn
        27
    yazinnnn  
       2023-02-15 16:16:34 +08:00
    用方案 2 的情况下, 业务模块如何引入公共模块呢?

    以 maven 依赖的形式还是 git submodule 的形式?
    k9990009
        28
    k9990009  
       2023-02-15 16:17:40 +08:00 via Android
    微服务是和组织构架对应的,团队多,构架组也有,就方案二。人少就一个项目就别折腾了。公共依赖里面建议再拆分成很多小的 starter ,避免过度依赖
    hhjswf
        29
    hhjswf  
       2023-02-15 16:46:14 +08:00 via Android
    方案 2 怎么用 Maven 引入其他模块的依赖包,传到私库上拉吗
    zsdroid
        30
    zsdroid  
       2023-02-15 17:00:39 +08:00   ❤️ 1
    不同模块都是你干,选 1
    不同模块不同的人干,选 2
    lyonbrown4ddd
        31
    lyonbrown4ddd  
       2023-02-15 17:03:38 +08:00
    看开发团队了么 如果你每个模块 都有独立的团队在维护 那多 git 仓库互不干扰 如果就一个团队需要维护多个模块 monorepo 比较合适
    Pettyfer
        32
    Pettyfer  
       2023-02-15 17:07:13 +08:00
    方案 2 ,方案 1 会随时间逐渐变的庞大
    rapperx2
        33
    rapperx2  
       2023-02-15 17:12:30 +08:00
    根据实际场景来吧,小团队,产出未必一下就是几个 G 的代码。

    还有就是开发模块都是独立负责,不用一个开发维护多个模块,那就可以多仓库
    dobelee
        34
    dobelee  
       2023-02-15 17:16:12 +08:00
    1 和 2 都用过。推荐 2 。1 后期变屎山。
    OldCarMan
        35
    OldCarMan  
       2023-02-15 17:21:10 +08:00
    有没有一种可能,存在一种比较中庸的方式:

    1.相关性比较强的模块可以聚合到一个父模块下(比如你搞一个电商项目,订单中心,仓储中心,用户中心等横向服务,每个中心下的各个子模块整合到一个父模块下,也就是你上面说的方案一)

    2.其他公用性 /独立性比较强的,抽出来做单独的模块(比如授权认证服务,日志服务,网关服务,监控服务,统计服务等纵向服务抽离出单独的模块,也就是你说的方案二)

    3.如果你说的公共模块只是指代码层面的依赖,那么抽一个公用模块出来写公用代码没问题,不过它只是一个公用代码模块,而不是一个公用服务,凡是服务都是需要部署的,模块不一定要部署;如果它是其他业务服务依赖的公用服务,个人觉得能解耦的尽量解耦到具体业务中,不能解耦的说明其有独立性的必要,单独做一层服务,也就是我上面第一点说的横向服务,问题应该也不是很大。
    XiLingHost
        36
    XiLingHost  
       2023-02-15 17:22:29 +08:00
    @hhjswf 内网搭一个呗,无论是 gitlab 还是 nexus 还是 artifactory 都支持 maven 仓库,甚至 gitea 现在都支持了
    james2013
        37
    james2013  
       2023-02-15 17:23:12 +08:00
    明显使用方案 1 更好,使用方案 2 很麻烦
    又不是几十人,几百人开发同 1 个项目
    目前项目中使用方案 1,有 1 个通用模块,其它的模块依赖通用模块
    如果拆分为多个项目,开发起来很麻烦,尤其是微服务比较多时,那得打开好多个 ide,有的项目有十几个微服务,是不是要开十几个 idea?
    LeegoYih
        38
    LeegoYih  
       2023-02-15 17:25:33 +08:00
    选择模式 2 还有一个原因是管理,给每位研发分配不同的权限,否则会像 bilibili 一样泄漏整个项目
    oneisall8955
        39
    oneisall8955  
       2023-02-15 18:39:53 +08:00 via Android
    2
    cp19890714
        40
    cp19890714  
       2023-02-15 19:46:55 +08:00
    两个方案都各有优缺点,很多大厂使用的是方案 1 ,我现在使用的是方案 2 。

    方案 2 优点
    无论团队大小, 既然是微服务, 那肯定会为每个服务指定负责人, 而不会交错负责.
    1. 每个人只需要关注自己负责的服务的代码.
    2. 小团队,可以避免团队内有人随意修改他人负责的代码. 大团队,只开负责的代码仓库的权限.
    3. IDEA 中只打开自己负责的代码, 搜索代码什么的都很方便.
    4. CI/CD 方便
    5. 版本管理方便, 减少代码冲突.

    方案 2 缺点
    1. 需要搭建 maven 私仓, 对所有的公共技术模块进行严格的版本管理, 在 base-pom 中对版本进行统一管理.
    2. 降低开发者维护公共技术模块的意愿. 因为修改公共模块,哪怕只修改一行代码,都需要升级版本, 然后对很多 git 仓库进行代码提交. 服务发布前,还要把相关模块的版本从 SNAPSHOT 改为 RELEASE, 有点麻烦.

    方案 2 的优点就是方案 1 的缺点.整体来看,我觉得方案 2 的优点更多更好.
    Nnq
        41
    Nnq  
       2023-02-16 05:10:22 +08:00
    方案一 还是方案二 主要还是看你们有没有足够的人来管理 :

    方案一等于是所有的都放到一个池子里,所有的子模块与父模块保持版本一致,如果每次发布的版本都是整体发布而不是单独发布,这个方案方便管理,即使人很少也很好维护

    方案二 如果子模块可以被其他多个项目复用,例如一个第三方接口的客户端实现等,同时项目足够复杂,有足够的程序员, 每个模块由不同的组来维护管理, 有一个很清晰的 release note 等, 发布的时候每个模块可以有不同版本
    unco020511
        42
    unco020511  
       2023-02-16 10:22:15 +08:00
    当然是方案二
    xiaocaiji111
        43
    xiaocaiji111  
       2023-02-22 17:18:58 +08:00
    很多大厂都是方案 1 ,包括谷歌,因为他们强制上线会把所有得模块都 build 一遍,保证整体可编译。至于 monorepo 多大,看团队了。又不是所有团队得代码都放在一起。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   922 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 20:00 · PVG 04:00 · LAX 12:00 · JFK 15:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.