4.4 KiB
4.4 KiB
ChatAppGateway 第一版 prompt
你是一名资深 Golang 后端架构师,请为一个海外社交 App 实现一个主业务聚合服务 ChatAppGateway。
服务定位
ChatAppGateway不是纯反向代理网关,而是 BFF / 聚合编排服务。- 对客户端暴露 HTTP JSON API。
- 对内通过 gRPC 调用:
ChatAppUser.LoginChatAppPay.QueryOrder
- 自身不实现用户域认证规则,也不实现支付域核心规则,只做参数校验、字段归一化、协议适配、统一错误响应、日志与 trace。
目标能力
第一版只实现三条 HTTP 接口:
GET /healthGET /readyPOST /api/v1/auth/loginGET /api/v1/pay/orders/{order_no}
配置要求
配置文件放在 config/xxx.yaml,默认读取 config/local.yaml。
YAML 结构固定如下:
app:
name: chatappgateway
env: local
http_addr: ":8080"
shutdown_timeout: 10s
grpc:
user:
target: "127.0.0.1:9001"
timeout: 3s
pay:
target: "127.0.0.1:9002"
timeout: 3s
必须支持:
-config config/local.yaml命令行参数gopkg.in/yaml.v3- 默认值补齐
- 配置校验
登录接口要求
POST /api/v1/auth/login
请求 DTO 至少包含:
login_typeaccountpasswordcountry_codeverify_codeproviderprovider_tokendevice_idplatformapp_version
支持三种登录模式:
password- 必填:
account、password
- 必填:
sms_code- 必填:
country_code、account、verify_code
- 必填:
oauth- 必填:
provider、provider_token
- 必填:
网关职责:
- 只做模式校验和字段归一化
- 将请求映射到
ChatAppUser.Login - 接收用户服务返回后再统一包装给客户端
ChatAppUser.Login 返回至少包含:
user_idaccess_tokenrefresh_tokenexpires_inis_new_userprofile
其中 profile 至少包含:
user_idnicknameavatar_url
支付查询接口要求
GET /api/v1/pay/orders/{order_no}
网关职责:
- 校验
order_no非空 - 调用
ChatAppPay.QueryOrder - 把支付服务返回的订单结果转成统一 HTTP JSON 响应
返回字段至少包含:
order_nouser_idstatusamountcurrencysubjectpay_methodpaid_at
健康检查要求
GET /health
- 只做网关自身存活检查
- 固定返回 200
- 返回:
{
"status": "ok",
"service": "chatappgateway"
}
GET /ready
- 用于 K8s / LB readiness probe
- 不是只判断进程活着
- 至少要判断:
- 配置已经成功加载
- 关键依赖已经连通
- 服务已经具备接流量能力
- 对
ChatAppGateway第一版来说,/ready至少检查:ChatAppUser的 gRPC 连接可用ChatAppPay的 gRPC 连接可用
- 返回 200 时表示可以接流量,失败时返回 503
错误码和状态码要求
- 参数错误:
400 - 登录失败或凭证错误:
401 - 订单不存在:
404 - 下游 gRPC 超时:
504 - 下游 gRPC 不可用或内部异常:
502
要求统一 JSON 错误结构,例如:
{
"code": "bad_request",
"message": "login_type is required",
"request_id": "..."
}
目录结构要求
项目目录至少包含:
cmd/gateway/main.gointernal/configinternal/appinternal/transport/httpinternal/integration/usergrpcinternal/integration/paygrpcinternal/service/authinternal/service/payapi/protoconfig/local.yaml
技术要求
- 使用 idiomatic Go
- 使用
http.ServeMux - 使用
slog结构化日志 - 支持优雅关闭
- 收到
SIGTERM后先摘除/ready,再停止接新请求,等待旧请求处理完成后退出 - gRPC 连接使用
insecure.NewCredentials()即可 - 所有关键代码写中文注释
- 不要写成教学 demo,要保持生产风格
测试要求
至少覆盖以下场景:
- 配置加载成功
- 配置非法时失败
/health返回正确 JSON/ready在依赖可用时返回 200,在依赖不可用时返回 503- 三种
login_type的参数校验 - 登录请求正确映射到
ChatAppUser.Login - 订单查询正确映射到
ChatAppPay.QueryOrder - user/pay gRPC 超时、不可达、业务错误时的 HTTP 状态码映射
输出顺序要求
请按以下顺序输出实现内容:
- 项目目录结构
- proto 定义
- 配置结构与示例
- HTTP API 设计
- gRPC client 封装
- Go 代码实现
- 测试代码
- 本地运行说明