Files
full/README.md
2026-08-09 16:20:13 +08:00

136 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 时可使用仓库内 `.tools/` 的工具,或在 `PATH` 中安装 `protoc``protoc-gen-go``protoc-gen-go-grpc``protoc-gen-grpc-gateway`
确认工具链:
```bash
go version
go work sync
```
统一重新生成 protobuf
```bash
bash scripts/generate-protobuf.sh
```
脚本以根目录 `protobuf/blocks.proto` 为共享定义,并为各服务生成 protobuf、gRPC 和 grpc-gateway 代码。生成后的兼容别名继续保留旧模块中的公共类型名。
更新所有 workspace 模块的依赖:
```bash
bash scripts/update-all.sh
```
脚本会为每个模块执行 `go get -u ./...``go mod tidy`,最后运行 `go work sync`;它不会自动提交或推送 Git 变更。
编译全部 19 个独立服务:
```bash
bash scripts/build-all-linux.sh
```
脚本固定交叉编译 Linux x86-64`GOOS=linux``GOARCH=amd64``CGO_ENABLED=0`),产物写入 `builds/<领域>-<模块>``builds/` 已加入 `.gitignore`,聚合入口 `cmd` 不包含在批量构建中。
## 配置
每个服务的 `etc/` 目录包含 `*_dev.yaml``*_test.yaml``*_prod.yaml` 示例。提交到仓库的配置只能包含占位值;请在本地副本或部署系统的密钥管理中注入真实凭据,不要提交数据库密码、访问密钥、令牌或私钥。
本仓库审计时已移除过明文凭据。如果这些凭据曾在真实环境使用应立即在数据库、SMTP、对象存储及相关服务侧轮换。
## 运行
运行单个服务时,进入其模块目录。例如:
```bash
cd module/base/passport
go run ./cmd/main
```
运行聚合入口:
```bash
cd cmd
go run ./main
```
默认启动全部可聚合组件。通过 `BSM_SERVICES` 选择服务,名称以逗号分隔:
```bash
# 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
```powershell
go list -m -f '{{.Dir}}' | ForEach-Object {
Push-Location $_
try { go test ./... } finally { Pop-Location }
}
```
Linux/macOS
```bash
go list -m -f '{{.Dir}}' | while IFS= read -r module; do
(cd "$module" && go test ./...)
done
```
依赖运行中服务或真实基础设施的测试带有 `integration` build tag默认测试不会访问外部系统。准备好测试环境和对应的 `BSM_*_TOKEN` 等变量后,在目标模块显式运行:
```bash
go test -tags=integration ./...
```
建议提交前执行:
```bash
gofmt -w .
go vet ./...
go test ./...
```
最后两条命令需在每个模块目录执行,可使用上面的 workspace 循环。
## 开发约定
- Go 版本声明、Docker 构建镜像和 CI 构建镜像统一为 `1.26.5`
- 新模块必须加入 `go.work`,并确保本地 `replace` 使用当前 `module/...` 目录结构。
- protobuf 描述符必须包含服务命名空间,避免多个服务聚合到同一进程时发生全局文件名冲突。
- 外部依赖测试使用 `//go:build integration`,不得让默认测试依赖网络或已启动服务。
- 配置和测试数据中不得包含真实凭据或个人信息。