topfans/backend/readme.md
2026-06-02 15:43:57 +08:00

249 lines
6.7 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.

# Top Fans Backend
微服务后端项目,使用 Go 1.25.5 和 gRPC。
## 项目架构
- **UserSocialService**: 用户与社交服务(用户、社交、展位、任务)
- **AssetChainService**: 资产与链服务
- **Gateway**: API 网关REST API
## 环境要求
- Go 1.25.5
- Protocol Buffers Compiler (protoc) 3.x+
- Make
## 快速开始
### 1. 安装 Go 环境
```bash
# 使用 Homebrew (macOS)
brew install go@1.25.5
# 或从官网下载
# https://go.dev/dl/
```
### 2. 配置环境
运行安装脚本:
```bash
chmod +x scripts/setup.sh
./scripts/setup.sh
```
或手动安装:
```bash
# 设置 Go 代理(可选,加速下载)
export GOPROXY=https://goproxy.cn,direct
# 下载依赖
go mod download
go mod tidy
# 安装 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/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
# 安装 googleapis
go get github.com/googleapis/googleapis
```
### 3. 安装 Protocol Buffers
```bash
# macOS
brew install protobuf
# Linux (Ubuntu/Debian)
apt-get install protobuf-compiler
# Linux (CentOS/RHEL)
yum install protobuf-compiler
```
### 4. 环境变量配置 ⚠️
**本项目有两套互相独立的配置文件,设计上是"二选一"关系,不要混用:**
| 文件 | 用途 | 何时生效 |
| --- | --- | --- |
| `backend/.env` | **Dev(本机开发)** 配置 | `./backend/dev.sh` 自动 source |
| `backend/deploy/envs/*.env` | **生产多机部署** 配置(每个服务一份) | 仅在目标服务器上由 systemd / docker / 部署脚本 source |
**为什么不能混用** — 同一个变量在两套里值不同,后者会覆盖前者:
| 变量 | `backend/.env`(dev) | `deploy/envs/gateway.env`(生产) | 混用后果 |
| --- | --- | --- | --- |
| `JWT_SECRET` | `topfans-secret-key-please-change-in-production` | `your_secure_jwt_secret_here` | 所有 token 校验失败,需要登录的接口 401 |
| `DUBBO_GALLERY_SERVICE_URL` | `tri://127.0.0.1:20004` | `tri://localhost:20001` | 调用 gallery 服务的接口连接失败 |
| `DUBBO_ACTIVITY_SERVICE_URL` | `tri://127.0.0.1:20005` | `tri://localhost:20004` | 调用 activity 服务的接口连接失败 |
| `OSS_ACCESS_KEY_ID` | `LTAI5t99tafzfyrzbbEbjryH` | `LTAI5t6QcdJHpYbCPxM8SXYE` | OSS 上传/下载 403 |
| `DB_USER` / `DB_PASSWORD` | `postgres` / `123456` | `haihuizhu` / `admin` | 启动期就连不上 DB |
| `ENV` | `development` | `production` | 日志格式、限流策略等会按生产行为跑 |
**dev.sh 当前的加载规则**(见 `dev.sh:load_service_env`):
- `dev.sh` 启动时**只** source `backend/.env`
- 启动每个服务前,按服务名(去掉 `Service` 后缀)source 对应的 `deploy/envs/<name>.env`,**但仅对 `userService`** 生效
- `userService` 之所以特殊:它的 `deploy/envs/user.env` 里有 `SMS_ACCESS_KEY_ID` / `SMS_ACCESS_KEY_SECRET``backend/.env` 没有的变量,需要叠加
- **其他服务不再 source `deploy/envs/`** — 否则会被生产端口/密钥覆盖 dev 端口/密钥,导致接口大面积失败(典型症状:token 401、Dubbo 调用超时、OSS 403)
**生产部署时**(由部署脚本负责,与 dev.sh 无关):
- 把对应服务的 `deploy/envs/<name>.env` 放到目标服务器的 `/etc/topfans/<name>.env`
- systemd unit / docker-compose 引用该文件
- **不要** source `backend/.env`
**新增配置项时的纪律:**
1. 如果是 dev 和生产都需要的(如 `DB_*`、Dubbo URL 模板),在 `backend/.env` 改 + 在 `deploy/envs/*.env` 同步改
2. 如果仅生产需要(如 `SMS_*`、OSS 角色),只改 `deploy/envs/<name>.env`
3. 如果仅 dev 需要(如本地 mock 开关),只改 `backend/.env`
4. 改完后,在 dev 环境跑一次 `./dev.sh` 验证没有端口/密钥错乱
---
### 5. 生成代码
```bash
# 生成 gRPC 代码
make proto
# 生成 REST API 代码和 Swagger 文档
make swagger
# 生成所有代码
make all
```
### 6. 启动服务
```bash
# 一键启动所有服务(带文件热更新)
./dev.sh
# 或者只跑某个服务(略)
# 详见 dev.sh 注释
```
启动后会监听:
- Gateway: http://localhost:8080
- UserService: tri://localhost:20000
- Swagger UI: http://localhost:8080/swagger/index.html
> ⚠️ 启动前确认 `backend/.env` 里的 `DB_HOST/REDIS_HOST` 在本机能通(默认 `localhost`)。如果用远程 DB/Redis,改 `backend/.env` 而不是 `deploy/envs/*.env`。
## 项目结构
```
backend/
├── api/
│ └── gateway/ # 生成的 REST API Gateway 代码
├── pkg/
│ └── proto/ # 生成的 gRPC 代码
├── proto/ # Proto 定义文件
│ ├── common.proto
│ ├── user.proto
│ └── asset-chain.proto
├── swagger/ # Swagger 文档
├── scripts/ # 脚本文件
├── go.mod # Go 模块定义
├── go.work # Go 工作区配置
├── Makefile # 构建脚本
└── README.md
```
## 开发工具
### 代码检查
项目使用 golangci-lint 进行代码检查:
```bash
# 安装 golangci-lint
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# 运行检查
golangci-lint run
```
### 代码格式化
```bash
# 格式化代码
go fmt ./...
# 整理 imports
goimports -w .
```
## 依赖管理
主要依赖:
- `google.golang.org/protobuf`: Protocol Buffers Go 支持
- `google.golang.org/grpc`: gRPC 框架
- `github.com/grpc-ecosystem/grpc-gateway/v2`: gRPC 到 REST 的转换
- `github.com/gin-gonic/gin`: HTTP Web 框架
- `github.com/googleapis/googleapis`: Google API 定义
## Makefile 命令
```bash
make help # 显示帮助信息
make proto # 生成 gRPC 代码
make swagger # 生成 REST API 代码和 Swagger 文档
make all # 生成所有代码
make clean-proto # 清理生成的 proto 代码
make clean-swagger # 清理生成的 gateway 代码和 swagger
make clean # 清理所有生成的代码
```
## 版本管理
- Go 版本: 1.25.5 (在 `.go-version` 文件中指定)
- 使用 Go Workspace 模式管理多模块项目
## 注意事项
1. 生成的代码(`pkg/proto`、`api/gateway`)不要手动修改
2. 修改接口时,先更新 `.proto` 文件,再运行 `make all` 重新生成
3. 确保 `GOPATH/bin``PATH` 中,以便使用 protoc 插件
## 问题排查
### protoc 插件未找到
确保 `$GOPATH/bin``$HOME/go/bin` 在 PATH 中:
```bash
export PATH=$PATH:$(go env GOPATH)/bin
```
### googleapis 未找到
```bash
go get github.com/googleapis/googleapis
```
### 生成代码失败
检查 protoc 版本:
```bash
protoc --version # 应该是 3.x 版本
```
## 许可证
[添加许可证信息]