Go微服务单仓架构下共享代码的仓库布局及引用方法咨询
在Go单仓(Monorepo)中管理跨微服务的公共代码
针对你的场景,直接在仓库根目录创建独立的Go模块作为公共代码库是完全可行的,具体操作步骤如下:
1. 初始化公共代码模块
在仓库根目录创建common文件夹,并将其初始化为独立的Go模块:
mkdir common cd common go mod init <你的仓库模块前缀>/common # 示例:如果仓库地址是github.com/your-team/monorepo,执行 # go mod init github.com/your-team/monorepo/common
更新后的目录结构如下:
/ common/ go.mod # 后续可按功能划分子目录,如models/、s3/等 services/ s1/ go.mod main.go s2/ go.mod main.go
2. 编写公共代码
在common目录下按功能拆分代码结构,示例如下:
common/models:存放跨服务共用的结构体common/s3:存放S3上传等通用工具函数
示例common/s3/upload.go代码:
package s3 import "fmt" // 跨服务共用的上传参数结构体 type UploadParams struct { Bucket string Key string Data []byte } // 跨服务共用的S3上传函数 func Upload(params UploadParams) error { // 实际S3上传逻辑实现 fmt.Printf("Uploading %s to bucket %s\n", params.Key, params.Bucket) return nil }
3. 在微服务中引用公共代码
以s1为例,修改其go.mod文件,添加对common模块的依赖和本地路径映射(方便本地开发调试):
// 在s1/go.mod中添加以下内容 require github.com/your-team/monorepo/common v0.0.0-00010101000000-000000000000 replace github.com/your-team/monorepo/common => ../../common
require行的版本号是本地开发占位符;后续代码推送到远程后,可替换为实际的commit哈希或标签版本replace指令告诉Go在本地开发时直接使用相对路径指向的common目录,无需拉取远程依赖
在s1/main.go中导入并使用公共代码:
package main import ( "github.com/your-team/monorepo/common/s3" ) func main() { params := s3.UploadParams{ Bucket: "my-bucket", Key: "test.txt", Data: []byte("hello common"), } err := s3.Upload(params) if err != nil { panic(err) } }
s2的引用方式与s1完全一致。
4. 编译与运行
- 本地开发时,直接进入
s1或s2目录执行go build或go run main.go即可,Go会通过replace指令自动加载本地common代码 - 代码推送到远程仓库后,可更新微服务的依赖版本:
此时可选择移除# 进入s1目录 go get github.com/your-team/monorepo/common@<common模块的commit哈希或标签> # 例如打了v1.0.0标签,执行go get github.com/your-team/monorepo/common@v1.0.0replace指令(也可保留以方便本地继续开发)
最佳实践
- 给
common模块打版本标签(如v1.0.0、v1.1.0),便于微服务依赖管理,避免版本混乱 - 保持
common模块职责单一,仅存放跨服务共用的通用代码,不包含特定业务逻辑 - 严格禁止循环依赖:
common绝对不能依赖s1或s2的任何代码
内容的提问来源于stack exchange,提问作者noamtm
相关产品推荐
相关产品推荐

