Skip to content

kaydxh/sea

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

243 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŒŠ Sea

A production-ready Go microservice scaffold based on gRPC-Gateway and Clean Architecture

Build Status Go Version gRPC-Gateway License


็ฎ€ไป‹

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.yaml

็”Ÿๆˆ Proto ไปฃ็ 

make 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/Now

๐ŸŽฏ ๅˆ›ๅปบๆ–ฐ้กน็›ฎ

Sea ๆœ€ๅผบๅคง็š„่ƒฝๅŠ›ๆ˜ฏไฝœไธบ่„šๆ‰‹ๆžถๅฟซ้€Ÿๅˆ›ๅปบๆ–ฐ็š„ๅพฎๆœๅŠก้กน็›ฎ๏ผš

# ๅœจ sea ้กน็›ฎๆ น็›ฎๅฝ•ไธ‹ๆ‰ง่กŒ
make new TARGET=your-service NEW_GIT_REPOSITORY_NAME="github.com/yourname/your-repo"

่ฏฅๅ‘ฝไปคไผš๏ผš

  1. ไธ‹่ฝฝ Sea ๆจกๆฟ
  2. ๅฐ† sea-date ้‡ๅ‘ฝๅไธบ sea-your-service
  3. ๆ›ฟๆขๆ‰€ๆœ‰ๅŒ…่ทฏๅพ„ไธบไฝ ็š„ Git ไป“ๅบ“ๅœฐๅ€
  4. ็”ŸๆˆๅฎŒๆ•ด็š„้กน็›ฎ็ป“ๆž„๏ผŒๅผ€็ฎฑๅณ็”จ

โš™๏ธ ้…็ฝฎ่ฏดๆ˜Ž

้…็ฝฎๆ–‡ไปถไฝไบŽ 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๏ผ

  1. Fork ๆœฌไป“ๅบ“
  2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ (git checkout -b feature/amazing-feature)
  3. ๆไบคๆ›ดๆ”น (git commit -m 'feat: add amazing feature')
  4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (git push origin feature/amazing-feature)
  5. ๅˆ›ๅปบ Pull Request

๐Ÿ“„ License

ๆœฌ้กน็›ฎ้‡‡็”จ MIT License ๅผ€ๆบๅ่ฎฎใ€‚

About

Sea is a web and grpc framework written in Go (Golang). It depend on grpc-gateway. If you are trying to get an application server developed quickly, you will love sea.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors