feat: 初始化后端微服务架构骨架

This commit is contained in:
fish
2026-03-28 19:52:35 +08:00
parent 4b3e40afab
commit 03728d743e
10 changed files with 455 additions and 0 deletions

45
backend/Makefile Normal file
View File

@@ -0,0 +1,45 @@
# Makefile for backend services
# 默认目标
.DEFAULT_GOAL := help
# 帮助信息
help:
@echo "Available commands:"
@echo " make build - 构建所有服务"
@echo " make up - 启动所有服务"
@echo " make up-dev - 启动开发模式服务(热更新)"
@echo " make down - 停止所有服务"
@echo " make logs - 查看所有服务日志"
@echo " make gen-proto - 生成 proto 文件"
@echo " make clean - 清理构建文件"
# 构建所有服务
build:
docker compose build
# 启动所有服务
up:
docker compose up -d
# 启动开发模式服务(热更新)
up-dev:
docker compose -f docker-compose.dev.yml up -d
# 停止所有服务
down:
docker compose down
# 查看所有服务日志
logs:
docker compose logs -f
# 生成 proto 文件
gen-proto:
@echo "Generating proto files..."
docker compose run --rm proto-builder
# 清理构建文件
clean:
docker compose down -v
docker rmi -f $$(docker images -q "backend_*" 2>/dev/null) 2>/dev/null || true

85
backend/README.md Normal file
View File

@@ -0,0 +1,85 @@
# 后端微服务架构
这是一个基于纯 Docker 环境构建的最小化后端骨架,不需要主机依赖。
## 技术栈
- golang:1.26.1-alpine3.23
- postgres:18.3-alpine3.23
- redis:8.6.2-alpine
- Docker/Docker Compose
- nginx:1.25-alpine
## 目录结构
```
./backend/
├── gateway/ # API 网关服务
├── services/ # 微服务
│ └── user-svc/ # 用户服务
├── shared/ # 共享代码和 proto 文件
├── scripts/ # 工具脚本
├── docker-compose.yml # 生产环境 docker compose 文件
├── docker-compose.dev.yml # 开发模式 docker compose 文件
├── Makefile # Docker 命令封装
└── README.md # 本文档
```
## 快速开始
### 前置条件
- Docker
- Docker Compose
### 启动服务
1. **构建并启动服务**
```bash
# 使用 Makefile
make up
# 或使用脚本
./scripts/dev-start.sh
```
2. **以开发模式启动(热更新)**
```bash
make up-dev
```
3. **生成 proto 文件**
```bash
make gen-proto
```
4. **停止服务**
```bash
make down
```
### 访问服务
- Nginx: http://localhost:8080
- 网关: http://localhost:8000
- 用户服务: http://localhost:9000
- PostgreSQL: localhost:5432
- Redis: localhost:6379
## 开发
### 添加新服务
1. 在 `services/` 目录下创建新目录
2. 添加 `Dockerfile`、`go.mod` 和必要的目录结构
3. 更新 `docker-compose.yml` 和 `docker-compose.dev.yml` 以包含新服务
### Proto 文件
- 在 `shared/proto/common/` 目录下添加 proto 文件
- 运行 `make gen-proto` 生成 Go 代码
## 生产环境
对于生产部署,使用 `docker-compose.yml`,它会构建优化的镜像,不包含卷挂载。
## 清理
```bash
make clean
```
这将停止所有服务,移除卷,并清理镜像。

View File

@@ -0,0 +1,64 @@
version: '3.8'
services:
# Nginx 网关
nginx:
image: nginx:1.25-alpine
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- gateway
# 网关服务
gateway:
build:
context: ./gateway
dockerfile: Dockerfile
ports:
- "8000:8000"
volumes:
- ./gateway:/app
command: air -c .air.toml
depends_on:
- user-svc
- redis
# 用户服务
user-svc:
build:
context: ./services/user-svc
dockerfile: Dockerfile
ports:
- "9000:9000"
volumes:
- ./services/user-svc:/app
command: air -c .air.toml
depends_on:
- postgres
# 数据库
postgres:
image: postgres:18.3-alpine3.23
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
POSTGRES_DB: backend
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
- ./services/user-svc/migrations:/docker-entrypoint-initdb.d
# Redis
redis:
image: redis:8.6.2-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/var/lib/redis/data
volumes:
postgres-data:
redis-data:

View File

@@ -0,0 +1,66 @@
version: '3.8'
services:
# Nginx 网关
nginx:
image: nginx:1.25-alpine
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- gateway
# 网关服务
gateway:
build:
context: ./gateway
dockerfile: Dockerfile
ports:
- "8000:8000"
depends_on:
- user-svc
- redis
# 用户服务
user-svc:
build:
context: ./services/user-svc
dockerfile: Dockerfile
ports:
- "9000:9000"
depends_on:
- postgres
# 数据库
postgres:
image: postgres:18.3-alpine3.23
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
POSTGRES_DB: backend
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
- ./services/user-svc/migrations:/docker-entrypoint-initdb.d
# Redis
redis:
image: redis:8.6.2-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/var/lib/redis/data
# Proto 编译服务
proto-builder:
build:
context: ./scripts/docker-proto-builder
dockerfile: Dockerfile
volumes:
- ./shared/proto:/proto
volumes:
postgres-data:
redis-data:

View File

@@ -0,0 +1,34 @@
FROM golang:1.26.1-alpine3.23 as builder
# 设置工作目录
WORKDIR /app
# 复制 go.mod 和 go.sum
COPY go.mod go.sum ./
# 下载依赖
RUN go mod download
# 复制源代码
COPY . .
# 构建应用
RUN go build -o gateway ./cmd/main.go
# 运行阶段
FROM alpine:3.23
# 安装必要的依赖
RUN apk add --no-cache ca-certificates
# 设置工作目录
WORKDIR /app
# 从构建阶段复制二进制文件
COPY --from=builder /app/gateway .
# 暴露端口
EXPOSE 8000
# 启动应用
CMD ["./gateway"]

View File

@@ -0,0 +1,24 @@
#!/bin/bash
# 纯 Docker 启动脚本
echo "Starting backend services with Docker..."
# 进入脚本所在目录的父目录backend 目录)
cd "$(dirname "$0")/.." || exit 1
# 构建服务
echo "Building services..."
docker compose build
# 启动服务
echo "Starting services..."
docker compose up -d
# 查看服务状态
echo "Services status:"
docker compose ps
echo "Backend services started successfully!"
echo "Nginx: http://localhost:8080"
echo "Gateway: http://localhost:8000"
echo "User Service: http://localhost:9000"

View File

@@ -0,0 +1,14 @@
FROM golang:1.26.1-alpine3.23
# 安装 protoc 和相关工具
RUN apk add --no-cache protobuf-dev
# 安装 protoc-gen-go 和 protoc-gen-go-grpc
RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
RUN go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
# 设置工作目录
WORKDIR /proto
# 生成 proto 文件的命令
CMD protoc --go_out=. --go-grpc_out=. common/*.proto

View File

@@ -0,0 +1,12 @@
#!/bin/bash
# Docker 内编译 proto 脚本
echo "Generating proto files..."
# 进入脚本所在目录的父目录backend 目录)
cd "$(dirname "$0")/.." || exit 1
# 运行 proto-builder 容器
docker compose run --rm proto-builder
echo "Proto files generated successfully!"

View File

@@ -0,0 +1,34 @@
FROM golang:1.26.1-alpine3.23 as builder
# 设置工作目录
WORKDIR /app
# 复制 go.mod 和 go.sum
COPY go.mod go.sum ./
# 下载依赖
RUN go mod download
# 复制源代码
COPY . .
# 构建应用
RUN go build -o user-svc ./cmd/main.go
# 运行阶段
FROM alpine:3.23
# 安装必要的依赖
RUN apk add --no-cache ca-certificates
# 设置工作目录
WORKDIR /app
# 从构建阶段复制二进制文件
COPY --from=builder /app/user-svc .
# 暴露端口
EXPOSE 9000
# 启动应用
CMD ["./user-svc"]

77
prompt/v2.md Normal file
View File

@@ -0,0 +1,77 @@
# 一、前言
我需要一个单机多服务部署的后台微服务架构。
> 执行目标:基于纯 Docker 环境构建可编译、可运行的最小化后端骨架,无宿主机依赖(无全局 Go/Protoc/Postgres/Redis 环境)
> 技术栈锁定golang:1.26.1-alpine3.23、postgres:18.3-alpine3.23、redis:8.6.2-alpine、Docker/Docker Compose、nginx:1.25-alpine
# 二、完整目录结构
```
./backend/
├── gateway/
│ ├── cmd/
│ │ └── main.go
│ ├── internal/
│ │ ├── config/
│ │ │ └── config.go
│ │ ├── ws/
│ │ │ ├── hub.go
│ │ │ ├── client.go
│ │ │ └── message.go
│ │ └── router/
│ │ └── router.go
│ ├── go.mod
│ └── Dockerfile
├── services/
│ └── user-svc/
│ ├── cmd/
│ │ └── main.go
│ ├── internal/
│ │ ├── config/
│ │ │ └── config.go
│ │ ├── domain/
│ │ │ └── user.go
│ │ ├── repository/
│ │ │ └── repo.go
│ │ ├── service/
│ │ │ └── service.go
│ │ └── grpcserver/
│ │ └── server.go
│ ├── proto/
│ │ └── user.proto
│ ├── migrations/
│ │ └── 001_init.sql
│ ├── go.mod
│ └── Dockerfile
├── shared/
│ ├── proto/
│ │ ├── common/
│ │ │ └── common.proto
│ │ └── generate.go
│ └── pkg/
│ ├── logger/
│ │ └── logger.go
│ ├── errors/
│ │ └── errors.go
│ ├── database/
│ │ └── postgres.go
│ └── cache/
│ └── redis.go
├── scripts/
│ ├── dev-start.sh # 纯 Docker 启动脚本
│ ├── gen-proto.sh # Docker 内编译 proto
│ └── docker-proto-builder/ # Protoc 编译容器配置
│ └── Dockerfile
├── docker-compose.yml # 全服务编排(含 proto 编译、Go 构建)
├── docker-compose.dev.yml # 开发模式编排(挂载源码、热更新)
├── Makefile # 封装 Docker 命令(兼容无宿主机 Make 环境)
└── README.md # 纯 Docker 环境使用说明
```
# 三、核心说明
不允污染宿主机,任何操作都只能通过 Docker 进行,绝对不在本地执行任何命令,不依赖本地环境,纯容器运行。
以上需求明白后,先创建基础骨架:包含 nginx、gateway、services/user-svc、shared、scripts、docker-compose.yml、Makefile只创建目录结构不写代码让后等待我下一步指令。