Files
Edu/services/api-gateway
SpecialX f586a0b19e feat(portal-shell): v2.0 P1-P4 token migration + unit tests + prod endpoint + e2e
P1: 31 widget 旧纸感令牌批量迁移到 shadcn 标准(1104 次替换)
- bg-paper→bg-background / bg-surface→bg-card / text-ink→text-foreground
- 保留 button.tsx 中 bg-accent(shadcn 标准 hover 语义令牌)

P2: v2.0 新增组件单元测试补齐(5 文件 81 用例)
- permission-bitmap: 24 用例(含 GRADE_READ 重复去重)
- route-permissions: 26 用例(4 张表优先级 + AND/OR 语义)
- notify: 12 用例(sonner toast 双重性质 vi.hoisted mock)
- use-error-report: 9 用例(jsdom Blob vi.stubGlobal mock)
- plugin-boundary: 10 用例(错误边界 + 骨架变体)

P3: 错误上报端点生产替换(后端 /api/v1/log)
- api-gateway: internal/log/handler.go(slog 结构化日志,64KB 限制,204 返回)
- main.go: 注册 POST /api/v1/log 路由
- useErrorReport: 环境感知端点(prod→/api/v1/log,dev→/api/log)

P4: E2E 测试(3 文件 30 用例)
- streaming: 4 用例(React 19 use() + Suspense,act 包裹 render)
- error-boundaries: 6 用例(三级错误边界层级 L1/L2/L3)
- security-boundaries: 20 用例(L1 角色门禁 + L2 权限点 + L3 数据范围)
- vitest setup: IS_REACT_ACT_ENVIRONMENT + jest-dom matchers

验证:typecheck 0 错误 / lint 0 错误 / build 6 路由 / 206 测试全部通过
2026-07-17 16:49:00 +08:00
..

API Gateway

Go (Gin) 实现的 API 网关,所有外部请求的统一入口。

职责

  • 路由转发/api/v1/<service>/* → 下游服务iam / teacher-bff / student-bff / parent-bff / core-edu / content / msg / ai / data-ana
  • JWT 鉴权RS256IAM 签发Gateway 通过 JWKS 公钥校验DevMode 下支持 dev-token 旁路
  • 请求 ID 注入:生成或透传 X-Request-Idreq-<uuid-v4> 格式),全链路追踪
  • 限流:基于令牌桶的 per-IP 限流100 rps突发 20超限返回 429 + GW_RATE_LIMITED
  • 熔断:基于 gobreaker v2 的下游服务熔断5xx 错误率 > 50% 触发 OPEN返回 503 + GW_CIRCUIT_OPEN
  • 可观测性slog 结构化日志 + 7 个业务 metrics + OpenTelemetry tracer资源属性完整
  • CORS / 安全头 / Recovery:标准化中间件链

中间件链

请求处理顺序(自外向内):

Request → Recovery → OTel → RequestID → CORS → SecurityHeaders → RequestBodyLimit → RateLimit
  → [api/v1 组] CircuitBreaker → AuthMiddleware(RS256) → Metrics → Proxy → Response
中间件 文件 职责
Recovery internal/middleware/recovery.go panic 兜底返回 500 + GW_INTERNAL_ERROR
OTel otelgin.Middleware OpenTelemetry 自动埋点
RequestID internal/middleware/requestid.go 生成/透传 X-Request-Idreq-<uuid-v4>
CORS internal/middleware/cors.go 跨域允许(从 Config 读取白名单)
SecurityHeaders internal/middleware/security.go 安全响应头 + 请求体限制413 GW_REQUEST_TOO_LARGE
RateLimit internal/middleware/ratelimit.go per-IP 令牌桶限流,超限 429 GW_RATE_LIMITED
CircuitBreaker internal/middleware/circuit-breaker.go 下游 5xx 错误率 > 50% 触发熔断503 GW_CIRCUIT_OPEN
Auth internal/middleware/auth.go JWT RS256 校验JWKS注入 x-user-id/x-user-roles/x-data-scope
Metrics internal/observability/metrics.go HTTP 请求计数 + 延迟统计7 个业务指标)

路由表

前缀 目标服务 端口 鉴权
/api/v1/iam/* iam 3002 JWTregister/login/refresh 白名单)
/api/v1/teacher/* teacher-bff 3003 JWT
/api/v1/student/* student-bff 3009 JWT
/api/v1/parent/* parent-bff 3010 JWT
/api/v1/classes/* core-edu 3004 JWT
/api/v1/exams/* core-edu 3004 JWT
/api/v1/homework/* core-edu 3004 JWT
/api/v1/grades/* core-edu 3004 JWT
/api/v1/textbooks/* content 3005 JWT
/api/v1/chapters/* content 3005 JWT
/api/v1/knowledge-points/* content 3005 JWT
/api/v1/questions/* content 3005 JWT
/api/v1/notifications/* msg 3007 JWT
/api/v1/messages/* msg 3007 JWT
/api/v1/ai/* ai 3008 JWT
/api/v1/analytics/* data-ana 3006 JWT
/api/v1/dashboard/* data-ana 3006 JWT

健康检查

端点 用途 鉴权
GET /healthz 存活探针liveness
GET /readyz 就绪探针readiness并行 ping 下游 /healthz软失败规则
GET /metrics Prometheus 指标端点7 个业务指标 + Go runtime

开发

cd services/api-gateway
go run main.go

DevMode接受 Bearer dev-token 旁路鉴权):

DEV_MODE=true go run main.go

测试

cd services/api-gateway
go test ./internal/middleware/... -v -cover

构建

go build ./...
docker build -t edu/api-gateway .

配置

通过环境变量配置(见 internal/config/config.go

变量 默认值 说明
API_GATEWAY_PORT 8080 监听端口
ENV development 部署环境production 时 W7 防护生效)
DEV_MODE false 开发模式旁路true 时接受 Bearer dev-token(仅非生产)
IAM_JWKS_URL http://localhost:3002/.well-known/jwks.json RS256 公钥端点(非 DevMode 必填)
JWT_ISSUER next-edu-cloud JWT 签发者校验
JWT_AUDIENCE next-edu-cloud JWT 受众校验
CORS_ORIGINS (空,用开发默认白名单) CORS 白名单(逗号分隔)
CLASSES_SERVICE_URL http://localhost:3001 classes 服务地址(遗留,路由实际走 core-edu
IAM_SERVICE_URL http://localhost:3002 iam 服务地址
TEACHER_BFF_URL http://localhost:3003 teacher-bff 服务地址
STUDENT_BFF_URL http://localhost:3009 student-bff 服务地址
PARENT_BFF_URL http://localhost:3010 parent-bff 服务地址
CORE_EDU_SERVICE_URL http://localhost:3004 core-edu 服务地址
CONTENT_SERVICE_URL http://localhost:3005 content 服务地址
DATA_ANA_SERVICE_URL http://localhost:3006 data-ana 服务地址
MSG_SERVICE_URL http://localhost:3007 msg 服务地址
AI_SERVICE_URL http://localhost:3008 ai 服务地址
OTEL_EXPORTER_OTLP_ENDPOINT http://localhost:4318 OpenTelemetry OTLP 端点
LOG_LEVEL info 日志级别

生产环境警告DEV_MODE=trueENV=production 时服务 panic 拒绝启动W7 防护)。

关联文档