A production-ready Go microservice scaffold based on gRPC-Gateway and Clean Architecture
Sea ๆฏไธไธชๅบไบ Go ่ฏญ่จ็ๅพฎๆๅก่ๆๆถๆกๆถ๏ผ้ๆไบ gRPC + gRPC-Gateway๏ผๅๆถๆด้ฒ gRPC ๅ RESTful HTTP ๆฅๅฃ๏ผใClean Architecture ๅๅฑ่ฎพ่ฎกใOpenTelemetry ๅฏ่งๆตๆงใไปฅๅๅผ็ฎฑๅณ็จ็ไธญ้ดไปถไฝ็ณปใ
Sea ็่ฎพ่ฎก็ฎๆ ๆฏ๏ผไธ้ฎๅๅปบๆฐ้กน็ฎ๏ผๅผ็ฎฑๅณ็จ๏ผไธๆณจไธๅก้ป่พๅผๅใ
- ๐ gRPC + HTTP ๅๅ่ฎฎ โ ๅบไบ gRPC-Gateway๏ผไธไปฝ Proto ๅฎไนๅๆถ็ๆ gRPC ๅ RESTful API
- ๐๏ธ Clean Architecture โ ไธฅๆ ผๅๅฑ๏ผDomain โ Application โ Infrastructure โ Web๏ผ๏ผไพ่ตๅ่ฝฌ๏ผๆไบๆต่ฏ
- ๐ก OpenTelemetry โ ๅ ็ฝฎ TraceใMetricsใLogging ๅ จ้พ่ทฏๅฏ่งๆตๆง๏ผๆฏๆ Jaeger / Prometheus / OTLP๏ผ
- ๐ ๆไปถๅ้ ็ฝฎ โ MySQLใRedisใๆฅๅฟใๆๅกๅ็ฐ็ญ็ปไปถ้่ฟ Plugin ๆจกๅผๆ้ๅ ่ฝฝ
- ๐ก๏ธ ็ไบง็บงไธญ้ดไปถ โ CORSใ่ฏทๆฑ้ๆต๏ผQPS/ๅนถๅ๏ผใDebug Body ๆๅฐใๅฅๅบทๆฃๆฅ
- ๐ฏ ไธ้ฎ่ๆๆถ โ
make new TARGET=your-serviceๅณๅฏๅๅปบๅฎๆด็ๆฐๅพฎๆๅก้กน็ฎ - ๐ฆ Docker ๆฏๆ โ ๅ ็ฝฎ Dockerfile ๅ้จ็ฝฒ่ๆฌ
- โ๏ธ ็ฏๅขๅ้่ฆ็ โ ๆๆ้ ็ฝฎๆฏๆ็ฏๅขๅ้ๆณจๅ ฅ๏ผ้้ ๅฎนๅจๅ้จ็ฝฒ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ cmd/ (ๅ
ฅๅฃๅฑ) โ
โ main.go โ server.go โ options/ (Plugin ๆไปถๆณจๅ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ web/ (ๆฅๅฃๅฑ) โ
โ Router (ไธญ้ดไปถๆณจๅ) โ Controller (RPC ๆนๆณๅฎ็ฐ) โ Error ๆ ๅฐ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ pkg/application/ (ๅบ็จๅฑ) โ
โ Handler (็ผๆไธๅก็จไพ๏ผๆๆ Repository ๆฅๅฃ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ pkg/domain/ (้ขๅๅฑ) โ
โ Entity + Repository ๆฅๅฃ + Domain Error (็บฏไธๅก้ป่พ๏ผๆ ๅค้จไพ่ต) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ pkg/infrastructure/ (ๅบ็ก่ฎพๆฝๅฑ) โ
โ MySQL DAO / Redis DAO / Local ๅฎ็ฐ (ๅฎ็ฐ Repository ๆฅๅฃ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
sea/
โโโ api/ # Proto ๆฅๅฃๅฎไนๅ็ๆไปฃ็
โ โโโ protoapi-spec/
โ โโโ sea-date/v1/
โ โโโ api.proto # ๆๅกๆฅๅฃๅฎไน๏ผๅซ HTTP ่ทฏ็ฑๆณจ่งฃ๏ผ
โ โโโ configuration.proto # ้
็ฝฎ็ปๆๅฎไน
โ โโโ error.proto # ไธๅก้่ฏฏ็ ๅฎไน
โโโ cmd/ # ๅบ็จๅ
ฅๅฃ
โ โโโ sea-date/
โ โโโ main.go # ็จๅบๅ
ฅๅฃ
โ โโโ app/
โ โโโ server.go # ๆๅกๅฏๅจ้ป่พ
โ โโโ options/ # ๆไปถๅผ้
็ฝฎๅ ่ฝฝ
โ โโโ plugin.config.go
โ โโโ plugin.mysql.go
โ โโโ plugin.redis.go
โ โโโ plugin.web_handler.go
โโโ conf/ # ้
็ฝฎๆไปถ
โ โโโ sea-date.yaml
โโโ pkg/ # ๆ ธๅฟไธๅก้ป่พ
โ โโโ sea-date/
โ โโโ application/ # ๅบ็จๅฑ๏ผ็จไพ็ผๆ๏ผ
โ โโโ domain/ # ้ขๅๅฑ๏ผๅฎไฝ + ๆฅๅฃ๏ผ
โ โโโ infrastructure/ # ๅบ็ก่ฎพๆฝๅฑ๏ผๆฅๅฃๅฎ็ฐ๏ผ
โ โ โโโ database/ # MySQL/Redis DAO
โ โ โโโ local/ # ๆฌๅฐๅฎ็ฐ
โ โโโ provider/ # ไพ่ตๆณจๅ
ฅๅฎนๅจ
โโโ web/ # Web ๆฅๅฃๅฑ
โ โโโ app/ # ่ทฏ็ฑๆณจๅๅ
ฅๅฃ
โ โโโ modules/ # ไธๅกๆจกๅ๏ผController + Router๏ผ
โโโ script/ # ๆๅปบๅๅทฅๅ
ท่ๆฌ
โโโ test/ # ้ๆๆต่ฏ
โโโ docs/ # ้กน็ฎๆๆกฃ
- Go 1.25+
- protoc (Protocol Buffers ็ผ่ฏๅจ)
- protoc-gen-go, protoc-gen-go-grpc, protoc-gen-grpc-gateway
# ๅ
้้กน็ฎ
git clone https://github.com/kaydxh/sea.git
cd sea
# ๆๅปบ
make
# ่ฟ่ก
./cmd/sea-date/sea-date --config=./conf/sea-date.yamlmake generate# HTTP (gRPC-Gateway)
curl -X POST http://localhost:10001/api/now \
-H "Content-Type: application/json" \
-d '{"RequestId": "test-001"}'
# gRPC (ไฝฟ็จ grpcurl)
grpcurl -plaintext -d '{"request_id": "test-001"}' \
localhost:10001 sea.api.seadate.SeaDateService/NowSea ๆๅผบๅคง็่ฝๅๆฏไฝไธบ่ๆๆถๅฟซ้ๅๅปบๆฐ็ๅพฎๆๅก้กน็ฎ๏ผ
# ๅจ sea ้กน็ฎๆ น็ฎๅฝไธๆง่ก
make new TARGET=your-service NEW_GIT_REPOSITORY_NAME="github.com/yourname/your-repo"่ฏฅๅฝไปคไผ๏ผ
- ไธ่ฝฝ Sea ๆจกๆฟ
- ๅฐ
sea-date้ๅฝๅไธบsea-your-service - ๆฟๆขๆๆๅ ่ทฏๅพไธบไฝ ็ Git ไปๅบๅฐๅ
- ็ๆๅฎๆด็้กน็ฎ็ปๆ๏ผๅผ็ฎฑๅณ็จ
้
็ฝฎๆไปถไฝไบ conf/sea-date.yaml๏ผๆฏๆไปฅไธๆจกๅ๏ผ
| ๆจกๅ | ่ฏดๆ |
|---|---|
log |
ๆฅๅฟ้ ็ฝฎ๏ผ็บงๅซใ่ฝฎ่ฝฌใ่พๅบ่ทฏๅพ๏ผ |
web |
HTTP/gRPC ๆๅก้ ็ฝฎ๏ผ็ซฏๅฃใ่ถ ๆถใAPI ๆ ผๅผๅ๏ผ |
web.open_telemetry |
OpenTelemetry ๅฏ่งๆตๆง๏ผTrace/Metrics/Logs๏ผ |
web.qps_limit |
QPS ้ๆต้ ็ฝฎ๏ผgRPC/HTTP ๅๅซ้ ็ฝฎ๏ผ |
resolver |
ๆๅกๅ็ฐ้ ็ฝฎ๏ผDNS/Consul๏ผ |
database.mysql |
MySQL ่ฟๆฅ้ ็ฝฎ |
database.redis |
Redis ่ฟๆฅ้ ็ฝฎ |
debug |
่ฐ่ฏ้ ็ฝฎ๏ผdump ็ญ๏ผ |
ๆๆ้ ็ฝฎๆฏๆ้่ฟ็ฏๅขๅ้่ฆ็๏ผ้้ Kubernetes / Docker ้จ็ฝฒ๏ผ
export DB_ADDRESS="mysql-host:3306"
export DB_USERNAME="admin"
export DB_PASSWORD="secret"
export REDIS_ADDRESS="redis-host:6379"
export REDIS_PASSWORD="secret"# ๆๅปบ้กน็ฎ
make
# ็ๆ Proto ไปฃ็ + ๆๆกฃ
make generate
# ๅๅปบๆฐๆๅก
make new TARGET=<service-name> NEW_GIT_REPOSITORY_NAME="<git-path>"
# ๅ ้คๆๅก
make delete TARGET=<service-name>
# ๆๅ
้จ็ฝฒ
make install
# ๆธ
็ๆๅปบไบง็ฉ
make clean| ไพ่ต | ็จ้ |
|---|---|
| kaydxh/golang | ๅบ็กๅบ๏ผๆฅๅฟใWeb ๆกๆถใไธญ้ดไปถใๆฐๆฎๅบๅฐ่ฃ ๏ผ |
| grpc-gateway/v2 | gRPC-Gateway HTTP ไปฃ็ |
| spf13/cobra | CLI ๅฝไปค่กๆกๆถ |
| OpenTelemetry | ๅๅธๅผ่ฟฝ่ธชๅๆๆ ้้ |
| jmoiron/sqlx | MySQL ๆฐๆฎๅบๆไฝ |
| go-redis/redis | Redis ๅฎขๆท็ซฏ |
ๆฌข่ฟๆไบค Issue ๅ Pull Request๏ผ
- Fork ๆฌไปๅบ
- ๅๅปบ็นๆงๅๆฏ (
git checkout -b feature/amazing-feature) - ๆไบคๆดๆน (
git commit -m 'feat: add amazing feature') - ๆจ้ๅฐๅๆฏ (
git push origin feature/amazing-feature) - ๅๅปบ Pull Request
ๆฌ้กน็ฎ้็จ MIT License ๅผๆบๅ่ฎฎใ