基于 go-kratos/kratos v2 的企业级微服务脚手架。
- 统一架构: HTTP/gRPC 一次配置,多处复用
- Protobuf 驱动: API 定义即文档,自动生成代码
- 依赖注入: Wire 编译期依赖注入,零运行时反射
- 分层架构:
api→service→biz→data清晰分层 - 中间件集成: MySQL(GORM) + Redis(go-redis) + Kafka(sarama) + RabbitMQ(amqp091)
kratos-develop-template/
├── api/ # Protobuf API 定义
│ ├── hello/v1/ # Hello 服务
│ ├── kafka/v1/ # Kafka 服务
│ └── rabbitmq/v1/ # RabbitMQ 服务
├── cmd/
│ └── server/ # 服务入口
│ ├── main.go # 启动入口
│ └── wire.go # Wire 依赖注入
├── internal/
│ ├── biz/ # 业务逻辑层 (UseCase + Repo 接口)
│ │ ├── site.go # Site 业务用例
│ │ ├── kafka.go # Kafka 业务用例
│ │ ├── rabbitmq.go # RabbitMQ 业务用例
│ │ └── biz.go # Wire ProviderSet
│ ├── data/ # 数据访问层 (Repo 实现)
│ │ ├── mysql.go # GORM 连接池
│ │ ├── redis.go # Redis 连接池
│ │ ├── kafka.go # Kafka Producer
│ │ ├── kafka_scram.go # Kafka SCRAM 认证
│ │ ├── rabbitmq.go # RabbitMQ Producer
│ │ ├── site_repo.go # Site Repo 实现(GORM+Redis缓存)
│ │ ├── kafka_repo.go # Kafka Repo 实现
│ │ ├── rabbitmq_repo.go # RabbitMQ Repo 实现
│ │ └── data.go # Wire ProviderSet
│ ├── service/ # 服务实现 (实现 proto 接口)
│ │ ├── hello.go # Hello 服务
│ │ ├── kafka.go # Kafka 服务
│ │ ├── rabbitmq.go # RabbitMQ 服务
│ │ └── service.go # Wire ProviderSet
│ ├── server/ # 服务器配置
│ │ ├── http.go # HTTP 服务器
│ │ ├── grpc.go # gRPC 服务器
│ │ └── server.go # Wire ProviderSet
│ ├── middleware/ # 中间件
│ └── conf/ # 配置定义 (protobuf 生成)
│ └── conf.proto # 配置结构体定义
├── configs/ # 多环境配置
│ ├── config.yaml # 运行时配置(不提交,可能含密钥)
│ ├── config.example.yaml # 示例配置
│ ├── local/ # 本地开发
│ ├── prod/ # 生产环境
│ └── integration/ # 集成测试
├── third_party/ # 第三方 proto 依赖
├── go.mod
├── go.sum
├── Dockerfile
└── Makefile
# 安装 protoc 插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest
go install github.com/google/wire/cmd/wire@latest
# 下载依赖
go mod tidy# 生成 proto 代码
make generate
# 生成 wire 依赖注入
make wire# Windows(无 make)
powershell -ExecutionPolicy Bypass -File scripts/generate.ps1
go build -o bin/server ./cmd/server/
# Linux / macOS
make generate && make wire && make build
# 使用 kratos 工具运行(推荐,自动处理工作目录和热重载)
kratos run -- -conf ./configs -e local
kratos run -- -conf ./configs -e prod
# 直接运行二进制
./bin/server -conf=./configs
# 指定环境配置(-e 或 --env,加载 configs/{env}/config.yaml)
./bin/server -e local
./bin/server -e prod
# CLI 定时任务
go build -o bin/task ./cmd/task/
# 交互命令(cobra CLI,支持 -conf/-c 指定配置目录,-e 指定环境)
./bin/task help # 查看帮助
./bin/task # 默认执行 savePageData
./bin/task savePageData # 爬数据入库(单次)
./bin/task savePageData -e local # 使用 local 环境配置
./bin/task savePageDataCron # 爬数据入库(单次运行)
./bin/task savePageDataCron --daemon # 按 cron 循环运行
./bin/task savePageDataCron -e prod --daemon # 生产环境循环爬取
# 使用 kratos run 运行 task
kratos run -- -conf ./configs -e local savePageData
kratos run -- -conf ./configs -e prod savePageDataCron --daemon默认 HTTP 端口 8989(与原 Gin 项目一致),Hello 接口:GET http://127.0.0.1:8989/test
docker compose up -d
cp configs/config.example.yaml configs/config.yaml # 按需修改 enabled: truego install github.com/google/gnostic/cmd/protoc-gen-openapi@latest
make openapi # 或 scripts/generate.ps1
# 输出: openapi/openapi.yaml# 单元测试(不依赖 Docker)
go test ./...
# Kafka + RabbitMQ 集成测试(需 Docker Desktop 已启动)
powershell -ExecutionPolicy Bypass -File scripts/integration-test.ps1
# 含 HTTP 接口测试(会临时启动 server)
powershell -ExecutionPolicy Bypass -File scripts/integration-test.ps1 -Http
# Linux / Make
bash scripts/integration-test.sh
make test-integration
# 使用轻量 compose(Redpanda + RabbitMQ,推荐)
docker compose -f docker-compose.integration.yml up -d
# 保持容器运行便于调试
$env:INTEGRATION_LEAVE_UP = "1"
powershell -File scripts/integration-test.ps1集成测试使用独立配置目录 configs/integration/(kafka / rabbitmq 均为 enabled: true),构建标签为 integration,日常 go test ./... 不会执行。
bash scripts/deploy.sh develop kratos-template 8989 # Linux
powershell -File scripts/run-server.ps1 # Windowsmake docker
docker run -p 8000:8000 -p 9000:9000 kratos-develop-template:latest项目支持多环境配置,通过 -e 或 --env 指定:
| 环境 | 配置目录 | 说明 |
|---|---|---|
local |
configs/local/ |
本地开发(默认) |
bvt |
configs/bvt/ |
构建验证测试 |
test |
configs/test/ |
测试环境 |
prod |
configs/prod/ |
生产环境 |
integration |
configs/integration/ |
集成测试(kafka/rabbitmq enabled) |
# 加载指定环境配置
./bin/server -e local
./bin/server -e prod
./bin/task -e local savePageData
./bin/task -c ./configs -e test savePageDataCron --daemon编辑 configs/config.yaml 或对应环境的配置:
server:
http:
addr: 0.0.0.0:8000
timeout: 1s
grpc:
addr: 0.0.0.0:9000
timeout: 1s
data:
database:
driver: mysql
source: user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True
max_idle_conns: 10
max_open_conns: 100
redis:
addr: 127.0.0.1:6379
password: ""
db: 0
kafka:
brokers:
- 127.0.0.1:9092
rabbitmq:
url: amqp://guest:guest@127.0.0.1:5672/
exchange: my_exchange
exchange_type: direct
routing_key: my_routing_key| 维度 | 原 Gin 项目 | Kratos 项目 |
|---|---|---|
| HTTP/gRPC | 两个独立进程 | 统一进程,多端口 |
| 配置 | YAML → Viper → Struct | Protobuf → protoc 生成 → Struct |
| 依赖注入 | 手动 NewService() |
Wire 编译期生成 |
| 分层 | Controller → Service → Model | API → Service → Biz → Data |
| 中间件 | 全局变量 | 依赖注入,生命周期管理 |
方案: 自行封装 internal/data/ (而非使用社区 TX7DO/kratos-transport)
原因:
- 当前项目主要作为 Producer(发送端),不需要复杂的消费者生命周期
- 自行封装更轻量,与 Wire 配合更自然
- 如果未来需要 Consumer 能力,可再引入
kratos-transport
社区方案调研:
TX7DO/kratos-transport(432 stars): 支持 Kafka/RabbitMQ/RocketMQ 等 10+ MQ,主要面向 Consumer 场景go-kratos/kratos/contrib: 官方未提供 MQ 集成
MIT