引言
在开发我的笔记系统时,我遇到了一个问题。问题是,在api-gate服务中,我需要验证用户的access_code,但是access_code的生成逻辑是在auth2服务中实现的。这个问题从架构设计的层面上看,就是一个高耦合度问题。高耦合度会给代码的扩展代码麻烦,并给未来的系统维护带来隐患。
问题分析和解决
对于这个问题,我想第一个想到的是,将相关的代码抽出为一个模块,然后两边同时引用这个模块。但是评估了一下,这样做稍微麻烦了一些,因为我只想共享代码段,因此,最后我想到了git submodule命令。
即创建一个新的git仓库,将共享的代码块放在新的git仓库中,例如,上图的notes_redis_helper。然后再回到api-gate和auth2这两个git的本地仓库,通过git submodule add命令,将notes_redis_helper添加到本地仓库中。从而实现了代码段的共享。
git submodule 命令的优势
-
代码复用:Git Submodule允许将一个Git仓库作为子模块引入到另一个Git仓库中,使得可以在多个项目中共享和复用代码。这样可以避免重复编写相同的代码,提高开发效率。
-
独立维护:每个子模块都是独立的Git仓库,有独立的版本控制。这意味着可以在子模块中独立进行开发、提交和发布,而不影响主项目的开发和维护。这样可以更好地组织和管理代码,减少耦合性。
-
版本控制:Git Submodule可以确保子模块和主项目之间的版本控制保持一致。当子模块的代码发生变化时,可以通过更新子模块来更新主项目中引用的代码。这样可以更好地管理和跟踪代码的变化。
-
逻辑清晰:通过使用Git Submodule,可以将功能相关的代码组织在一起,使得项目的逻辑更加清晰和易于理解。每个子模块都可以专注于特定的功能或模块,有助于减少代码的复杂性和维护成本。
-
并行开发:使用Git Submodule可以实现并行开发,不同的团队可以独立地开发和维护各自的子模块。这样可以提高团队的协作效率,加快项目的开发速度。
(这一节内容为AI创作)
操作步骤
- 创建一个独立仓库,并将代码重构到这个仓库中,例如:git@gitee.com:hanshu_alan/notes_redis_helper.git。需要注意的是,我们这里实际上是代码段级别的共享,因此这个仓库不需要通过cargo new --lib 来初始化。
- 进入api-gate项目的src目录,运行
git submodule add
等命令。
git submodule add git@gitee.com:hanshu_alan/notes_redis_helper.git
git submodule init
git submodule update
- 进入auth2项目的src 目录,重复步骤2的操作。
使用体验
比正常情况要稍微麻烦一点,比如,我在api-gate本地仓库的目录下修改notes_redis_helper,那么操作步骤如下:
cd notes_redis_helper # 进入notes_redis_helper
git commit . -m changes
cd .. # 返回api-gate本地仓库
git commit . -m changes # 提交api-gate仓库的修改,实际上就是提交notes_redis_helper的当前commit id
git push
cd ../../auth2 # 进入auth2 本地仓库
cd src/notes_redis_helper # 进入notes_redis_helper仓库
git pull
cd ..
git commit . -m # 提交auth2的修改,因为这时notes_redis_helper的最新commit id已经改变
git push
上面的代码来至于我的开源项目https://gitee.com/hanshu_alan
这篇文章收录我的Rust-实战专栏。请关注我,不要错过更新哟。