# API Gateway - Kong Deployment Guide RWADurian 项目的 API 网关,基于 Kong 实现。 ## 目录 - [架构概览](#架构概览) - [快速开始](#快速开始) - [环境配置](#环境配置) - [部署命令](#部署命令) - [监控](#监控) - [生产环境部署](#生产环境部署) - [故障排除](#故障排除) ## 架构概览 ### 分布式部署架构 ``` ┌─────────────────────────────────────────────────────────────────────────────────┐ │ 网关服务器 │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Nginx │ │ Nginx │ │ Nginx │ │ │ │ (Admin Web) │ │ (API SSL) │ │ (Mobile Update) │ │ │ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Admin Web │ │ Kong Gateway │ │ Mobile Upgrade │ │ │ │ (Next.js) │ │ │ │ (Next.js) │ │ │ │ :3000 │ │ :8000 │ │ :3020 │ │ │ └─────────────────┘ └────────┬────────┘ └─────────────────┘ │ └─────────────────────────────────┼───────────────────────────────────────────────┘ │ 通过网络访问后端服务器 │ ▼ ┌─────────────────────────────────────────────────────────────────────────────────┐ │ 后端服务器 │ │ │ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │ │identity-service│ │wallet-service │ │backup-service │ │planting-service│ │ │ │ :3000 │ │ :3001 │ │ :3002 │ │ :3003 │ │ │ └───────────────┘ └───────────────┘ └───────────────┘ └───────────────┘ │ │ │ │ └ ... 更多微服务 ... │ │ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ Infrastructure │ │ │ │ PostgreSQL / Redis / Kafka / Zookeeper │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────────────┘ ``` ## 特点 - **与后端服务解耦**: Kong 独立部署,不依赖后端服务的 Docker 网络 - **分布式支持**: Kong 通过外部 IP 地址访问后端服务,支持跨服务器部署 - **可选部署**: 不部署 Kong 也不影响后端服务运行 ## 目录结构 ``` api-gateway/ ├── docker-compose.yml # Kong Docker Compose 配置 ├── deploy.sh # 一键部署脚本 ├── kong.yml # Kong 声明式路由配置 ├── README.md # 本文档 └── nginx/ ├── rwaapi.szaiai.com.conf # Nginx 配置 (SSL) └── install.sh # Nginx 安装脚本 ``` ## 快速开始 ### 1. 配置环境变量 ```bash cd backend/api-gateway # 创建 .env 文件 cp .env.example .env # 编辑 .env 并根据实际环境修改配置 nano .env # 或使用你喜欢的编辑器 ``` **重要**: 必须修改 `.env` 中的以下配置项: ```bash # 修改数据库密码(生产环境必须) KONG_PG_PASSWORD=your_secure_password_here # 更新后端服务器 IP(根据实际部署修改) BACKEND_SERVER_IP=192.168.1.111 # 改为实际后端服务器IP # 如需监控,修改 Grafana 配置 GRAFANA_ADMIN_PASSWORD=secure_password GRAFANA_ROOT_URL=https://monitor.yourdomain.com ``` ### 2. 修改 Kong 路由配置 编辑 `kong.yml`,更新后端服务的 URL: ```bash # 批量替换后端服务器 IP(如果不是 192.168.1.111) sed -i 's/192.168.1.111/YOUR_BACKEND_IP/g' kong.yml ``` ### 3. 先启动后端微服务 **在后端服务器上**执行: ```bash cd backend/services ./deploy.sh up ``` ### 4. 启动 Kong API Gateway **在网关服务器上**执行: ```bash cd backend/api-gateway chmod +x deploy.sh ./deploy.sh up ``` ### 5. 验证部署 ```bash # 检查Kong状态 ./deploy.sh status # 健康检查 ./deploy.sh health # 查看路由 ./deploy.sh routes # 测试API curl http://localhost:8000/api/v1/versions ``` ### 6. 配置 Nginx + SSL (生产环境,可选) ```bash cd nginx sudo chmod +x install.sh sudo ./install.sh yourdomain.com ``` ## 环境配置 所有配置通过 `.env` 文件管理。参考 `.env.example` 了解所有可用选项。 ### 环境变量说明 | 变量名 | 说明 | 默认值 | 是否必需 | |--------|------|--------|----------| | `KONG_PG_PASSWORD` | Kong 数据库密码 | `kong_password` | 是 | | `KONG_ADMIN_GUI_URL` | 管理界面URL | `http://localhost:8002` | 否 | | `GRAFANA_ADMIN_PASSWORD` | Grafana 管理密码 | `admin123` | 否* | | `GRAFANA_ROOT_URL` | Grafana 公开URL | `http://localhost:3030` | 否* | | `NETWORK_NAME` | Docker 网络名称 | `api-gateway_rwa-network` | 否 | | `BACKEND_SERVER_IP` | 后端服务器IP | `127.0.0.1` | 否 | \* 仅在使用监控时需要 ### Kong 数据库配置说明 Kong 使用 PostgreSQL 作为数据存储,数据库配置如下: - **数据库用户名**: `kong` (硬编码,不可修改) - **数据库名称**: `kong` (硬编码,不可修改) - **数据库密码**: 通过 `.env` 中的 `KONG_PG_PASSWORD` 配置(**生产环境必须修改**) - **数据库初始化**: Kong 容器启动时自动执行 `kong migrations bootstrap`,无需手动创建数据库或表结构 **重要提示**: - Kong 的数据库用户名和数据库名都是固定为 `kong`,这是 Kong 的设计,无法通过环境变量修改 - 只有密码可以通过 `KONG_PG_PASSWORD` 自定义 - 生产环境部署时,务必修改 `KONG_PG_PASSWORD` 为强密码 ### 生成安全密码 ```bash # 生成数据库密码 openssl rand -base64 32 # 生成 Grafana 密码 openssl rand -base64 24 ``` ## 部署命令 ### 基础操作 ```bash ./deploy.sh up # 启动 Kong 网关 ./deploy.sh down # 停止 Kong 网关 ./deploy.sh restart # 重启 Kong 网关 ./deploy.sh logs # 查看日志 (实时) ./deploy.sh status # 查看服务状态 ``` ### 配置管理 ```bash ./deploy.sh reload # 重载 Kong 配置 (从 kong.yml) ./deploy.sh sync # 同步配置到数据库 (同 reload) ``` ### 健康检查与监控 ```bash ./deploy.sh health # Kong 健康检查 ./deploy.sh routes # 查看所有路由 ./deploy.sh services # 查看所有服务 ./deploy.sh test # 测试 API 路由 ./deploy.sh metrics # 查看 Prometheus 指标 ``` ### 监控栈管理 ```bash ./deploy.sh monitoring up # 启动 Prometheus + Grafana ./deploy.sh monitoring down # 停止监控服务 ./deploy.sh monitoring install [domain] # 完整安装 (Nginx+SSL+监控) ``` ### 清理 ```bash ./deploy.sh clean # 清理容器和数据 (警告:会删除数据!) ``` ## API 路由表 | 路径 | 目标服务 | 端口 | 说明 | |------|----------|------|------| | `/api/v1/auth/*` | identity-service | 3000 | 认证登录 | | `/api/v1/users/*` | identity-service | 3000 | 用户管理 | | `/api/v1/wallets/*` | wallet-service | 3001 | 钱包管理 | | `/api/v1/backups/*` | backup-service | 3002 | 备份服务 | | `/api/v1/plantings/*` | planting-service | 3003 | 种植管理 | | `/api/v1/trees/*` | planting-service | 3003 | 树木管理 | | `/api/v1/referrals/*` | referral-service | 3004 | 推荐系统 | | `/api/v1/rewards/*` | reward-service | 3005 | 奖励系统 | | `/api/v1/mpc/*` | mpc-service | 3006 | 多方计算 | | `/api/v1/leaderboard/*` | leaderboard-service | 3007 | 排行榜 | | `/api/v1/reports/*` | reporting-service | 3008 | 报表 | | `/api/v1/statistics/*` | reporting-service | 3008 | 统计 | | `/api/v1/authorization/*` | authorization-service | 3009 | 授权 | | `/api/v1/permissions/*` | authorization-service | 3009 | 权限 | | `/api/v1/roles/*` | authorization-service | 3009 | 角色 | | `/api/v1/versions/*` | admin-service | 3010 | 版本管理 | | `/api/v1/admin/*` | admin-service | 3010 | 后台管理 | | `/api/v1/presence/*` | presence-service | 3011 | 在线状态 | ## Kong 端口说明 | 端口 | 说明 | |------|------| | 8000 | Proxy HTTP - API 请求入口 | | 8443 | Proxy HTTPS - API 请求入口 (SSL) | | 8001 | Admin API - 管理接口 | | 8002 | Admin GUI - 管理界面 | ## 全局插件 | 插件 | 说明 | |------|------| | cors | 跨域支持,允许前端访问 | | rate-limiting | 请求限流 (100/分钟, 5000/小时) | | file-log | 请求日志记录 | | request-size-limiting | 请求大小限制 (50MB) | ## 监控 ### 启动监控栈 ```bash # 启动 Prometheus + Grafana ./deploy.sh monitoring up ``` ### 访问监控服务 启动后可以访问: - **Grafana**: http://localhost:3030 - 用户名: `admin` - 密码: 在 `.env` 中配置 (`GRAFANA_ADMIN_PASSWORD`) - **Prometheus**: http://localhost:9099 - **Kong 指标**: http://localhost:8001/metrics ### 查看指标 ```bash # 快速查看关键指标 ./deploy.sh metrics ``` ### 配置告警 (可选) 在 Grafana 中可以配置告警规则,监控: - 请求率 - 错误率 (4xx, 5xx) - 延迟 (p50, p95, p99) - Kong 健康状态 ### Grafana 通过 Nginx/域名访问配置 如果使用 `install-monitor.sh` 安装了 Nginx + SSL,需要配置 Grafana 允许通过域名访问: 1. **编辑 `.env` 文件**,设置正确的访问 URL: ```bash GRAFANA_ROOT_URL=https://monitor.szaiai.com ``` 2. **重启监控服务**使配置生效: ```bash ./deploy.sh monitoring down ./deploy.sh monitoring up ``` 3. **验证配置**: ```bash docker exec rwa-grafana env | grep GF_SERVER_ROOT_URL # 应该输出: GF_SERVER_ROOT_URL=https://monitor.szaiai.com ``` **常见错误**: - 如果看到 "origin not allowed" 错误,说明 `GRAFANA_ROOT_URL` 与实际访问地址不匹配 - 修改 `.env` 后必须重启容器才能生效 **如果之前已安装 Nginx,需要更新配置**: 如果你之前运行过 `install-monitor.sh`,需要手动更新 Nginx 配置文件以支持 Grafana 10+: ```bash # 1. 编辑 Nginx 配置文件 sudo nano /etc/nginx/sites-available/monitor.szaiai.com.conf # 2. 在 Grafana location / 块中添加以下 headers: # proxy_set_header Host $http_host; # proxy_set_header X-Forwarded-Host $host; # proxy_set_header X-Forwarded-Port $server_port; # proxy_set_header Origin $scheme://$host; # proxy_buffering off; # 3. 测试并重载 Nginx sudo nginx -t sudo systemctl reload nginx ``` 或者重新运行安装脚本(会使用更新后的配置): ```bash cd ~/rwadurian/backend/api-gateway sudo ./scripts/install-monitor.sh monitor.szaiai.com ``` ## 生产环境部署 ### 部署前检查清单 - [ ] 修改 `.env` 中的所有默认密码 - [ ] 更新 `.env` 中的 `BACKEND_SERVER_IP` 为实际后端服务器IP - [ ] 更新 `kong.yml` 中的后端服务URL (替换IP地址) - [ ] 配置 SSL/TLS 证书 (如使用 HTTPS) - [ ] 设置 PostgreSQL 数据库备份 - [ ] 配置防火墙规则 - [ ] 启用监控栈 - [ ] 配置日志聚合 ### 分布式部署流程 **服务器规划示例:** - 服务器A: 网关服务器 (Nginx + Kong + 前端) - 服务器B: 后端服务器 (微服务 + 基础设施) **步骤 1: 在后端服务器部署微服务** ```bash # 克隆代码 git clone /opt/rwadurian cd /opt/rwadurian/backend/services # 配置环境变量 cp .env.example .env nano .env # 配置生产环境参数 # 启动服务 ./deploy.sh up # 开放防火墙端口 3000-3011 (根据实际微服务数量) sudo ufw allow 3000:3011/tcp ``` **步骤 2: 在网关服务器部署 Kong** ```bash # 克隆代码 git clone /opt/rwadurian cd /opt/rwadurian/backend/api-gateway # 配置环境变量 cp .env.example .env nano .env # 配置 BACKEND_SERVER_IP 等参数 # 修改 kong.yml 中的后端服务器地址 nano kong.yml # 更新服务URL中的IP地址 # 或使用 sed: sed -i 's/OLD_IP/NEW_IP/g' kong.yml # 启动 Kong ./deploy.sh up # 验证连接 ./deploy.sh health ./deploy.sh test ``` **步骤 3: 配置 Nginx + SSL (可选)** ```bash cd nginx sudo ./install.sh yourdomain.com # 验证HTTPS curl https://yourdomain.com/api/v1/versions ``` ### 服务依赖关系 ``` 后端服务器: 1. Infrastructure (PostgreSQL, Redis, Kafka) ↓ 2. Application Services (微服务) 网关服务器: 3. Kong API Gateway (通过网络访问后端) ↓ 4. Nginx (SSL 终结, 可选) ``` ## 管理命令 ### 查看 Kong 状态 ```bash # 查看运行中的容器 docker ps | grep kong # 查看 Kong 健康状态 curl http://localhost:8001/status # 查看所有路由 curl http://localhost:8001/routes # 查看所有服务 curl http://localhost:8001/services # 查看所有插件 curl http://localhost:8001/plugins ``` ### 重载配置 ```bash # 编辑 kong.yml 后重载 docker exec rwa-kong kong reload # 或使用部署脚本 ./deploy.sh reload ``` ### 查看日志 ```bash # Kong 日志 docker logs -f rwa-kong # 或使用部署脚本 ./deploy.sh logs ``` ## 故障排除 ### 1. Kong 无法启动 ```bash # 检查数据库连接 docker logs rwa-kong-db # 手动运行迁移 docker exec -it rwa-kong kong migrations bootstrap ``` ### 2. 路由不生效 ```bash # 检查 kong.yml 语法 docker exec rwa-kong kong config parse /etc/kong/kong.yml # 重启 Kong docker restart rwa-kong ``` ### 3. 502 Bad Gateway ```bash # 检查目标服务是否运行 docker ps | grep rwa- # 检查网络连通性 docker exec rwa-kong curl http://admin-service:3010/api/v1/health # 检查 Kong 日志 docker logs rwa-kong --tail 100 ``` ### 4. 跨域问题 检查 kong.yml 中的 cors 插件配置,确保 origins 包含前端域名。 ## 安全建议 1. **生产环境**: 不要暴露 8001 (Admin API) 到公网 2. **HTTPS**: 使用 Nginx 做 SSL 终结 3. **限流**: 根据实际流量调整 rate-limiting 配置 4. **日志**: 定期清理 /tmp/kong-access.log