4.3 KiB
BSM Infra Full
BSM 后端服务的 Go workspace,包含基础能力、电商、财务、社交服务,以及可选择组件运行的单体入口。所有模块统一使用 Go 1.26.5。
目录结构
| 目录 | 服务 |
|---|---|
module/base |
ads、cloud、cms、feedback、fts、initial、logs、mgt、passport、sender |
module/ec |
address、delivery、mall、market、order |
module/finance |
wallet |
module/social |
feed、group、relation |
protobuf |
跨服务共享的 protobuf 定义,目前包含 blocks.proto |
cmd |
聚合上述服务的单体启动器 |
go.work |
21 个 Go 模块的 workspace 定义 |
各服务的接口、配置和部署细节见对应 module/**/README.md。
环境要求
- Go 1.26.5
- Git
- 按所运行服务准备 PostgreSQL、Redis、etcd、MQ 或对象存储等外部依赖
- 重新生成 protobuf 时,需要在系统
PATH中安装protoc、protoc-gen-go、protoc-gen-go-grpc和protoc-gen-grpc-gateway
确认工具链:
go version
go work sync
统一重新生成 protobuf:
bash scripts/generate-protobuf.sh
脚本以根目录 protobuf/blocks.proto 为共享定义,并为各服务生成 protobuf、gRPC 和 grpc-gateway 代码。生成后的兼容别名继续保留旧模块中的公共类型名。
更新所有 workspace 模块的依赖:
bash scripts/update-all.sh
脚本会为每个模块执行 go get -u ./... 和 go mod tidy,最后运行 go work sync;它不会自动提交或推送 Git 变更。
编译全部 19 个独立服务:
bash scripts/build-all-linux.sh
脚本固定交叉编译 Linux x86-64(GOOS=linux、GOARCH=amd64、CGO_ENABLED=0),产物写入 .builds/<领域>-<模块>。全部模块编译成功后,各模块的 etc/*_prod.yaml 会复制到 .builds/etc/。.builds/ 已加入 .gitignore,聚合入口 cmd 不包含在批量构建中。
配置
每个服务的 etc/ 目录包含 *_dev.yaml、*_test.yaml 和 *_prod.yaml 示例。提交到仓库的配置只能包含占位值;请在本地副本或部署系统的密钥管理中注入真实凭据,不要提交数据库密码、访问密钥、令牌或私钥。
本仓库审计时已移除过明文凭据。如果这些凭据曾在真实环境使用,应立即在数据库、SMTP、对象存储及相关服务侧轮换。
运行
运行单个服务时,进入其模块目录。例如:
cd module/base/passport
go run ./cmd/main
运行聚合入口:
cd cmd
go run ./main
默认启动全部可聚合组件。通过 BSM_SERVICES 选择服务,名称以逗号分隔:
# Linux/macOS
BSM_SERVICES=passport,order,wallet go run ./main
# PowerShell
$env:BSM_SERVICES = "passport,order,wallet"
go run ./main
可选组件为:ads、cloud、cms、feedback、fts、initial、logs、mgt、passport、sender、address、delivery、mall、market、order、wallet。社交服务目前作为独立模块运行,尚未接入聚合入口。
测试
根目录不是 Go module,因此不要在根目录执行 go test ./...。应逐 workspace 模块测试。
PowerShell:
go list -m -f '{{.Dir}}' | ForEach-Object {
Push-Location $_
try { go test ./... } finally { Pop-Location }
}
Linux/macOS:
go list -m -f '{{.Dir}}' | while IFS= read -r module; do
(cd "$module" && go test ./...)
done
依赖运行中服务或真实基础设施的测试带有 integration build tag,默认测试不会访问外部系统。准备好测试环境和对应的 BSM_*_TOKEN 等变量后,在目标模块显式运行:
go test -tags=integration ./...
建议提交前执行:
gofmt -w .
go vet ./...
go test ./...
最后两条命令需在每个模块目录执行,可使用上面的 workspace 循环。
开发约定
- Go 版本声明、Docker 构建镜像和 CI 构建镜像统一为
1.26.5。 - 新模块必须加入
go.work,并确保本地replace使用当前module/...目录结构。 - protobuf 描述符必须包含服务命名空间,避免多个服务聚合到同一进程时发生全局文件名冲突。
- 外部依赖测试使用
//go:build integration,不得让默认测试依赖网络或已启动服务。 - 配置和测试数据中不得包含真实凭据或个人信息。