★ 综合题:用 GoFrame 从 0 设计企业 API 服务(骨架要点)

面试问法:给你一个企业级 API 服务需求,用 GoFrame 从零设计,你会怎么答? 一句话结论:按“分层架构 + 规范路由 + 生成器 + 横切能力”组织答案:官方目录布局、controller 薄/service 厚/dao 数据、规范路由出契约与文档、中间件链统一处理响应/跨域/鉴权/日志、gtime 管时区、gdb 管数据、gproc 管优雅退出,最后给出部署与演进路线。

目录与分层(骨架要点)

project/
├── api/                  # Req/Res 接口定义(规范路由,即契约与文档)
├── hack/config.yaml      # gf-cli 生成配置(gfcli.gen.dao 等)
├── manifest/config/      # 运行时配置(config.yaml、config.prod.yaml)
├── internal/
│   ├── cmd/              # 启动命令(gcmd)
│   ├── controller/       # 薄接线层(或 gen ctrl 生成)
│   ├── service/          # 业务接口(logic 实现,gen service 对齐)
│   ├── dao/ model/       # 生成物:数据访问、do/entity
│   ├── middleware/       # 统一响应/CORS/鉴权/访问日志
│   └── const/ code/      # 常量与错误码表
└── main.go

依赖单向:api → controller → service → dao;错误码、常量独立包防循环引用。

横切能力清单

  1. 统一响应:全局挂 ghttp.MiddlewareHandlerResponse(或自定义后置中间件)输出 {code,message,data}
  2. 中间件顺序:统一响应 → CORS → 鉴权(白名单 /login、/swagger)→ 访问日志(带计时与 TraceId)。
  3. 数据层:loc=Local&parseTime=true 连接串 + 连接池参数 + 生产 debug: false;gen dao 出 do/entity。
  4. 接口契约:规范路由 + openapiPath/swaggerPath,v 标签校验自动映射到文档。
  5. 错误体系:<1000 框架预留,业务码从 1000 起按模块分段;gerror.NewCode 抛出,统一出口记日志。
  6. 分页规范:Req 带 Page/Size 默认值与上限,Res 固定 List/Total/Page/Size,Page + ScanAndCount 收尾。
  7. 时间与追踪:SetTimeZone 统一进程时区;初始化 OTLP 上报器,ctx 首参贯穿。
  8. 运维闭环:gproc 注册优雅退出回调 → s.Shutdown;多环境配置切文件;静态编译 + nginx/supervisor/Docker。

回答时的加分点

  • 先说清“范围与假设”(C 端/B 端、QPS、团队规模),再谈取舍——比如是否需要缓存、要不要拆微服务。
  • 展示可演进性:模块先按 service 接口解耦,未来拆 gRPC 服务只加适配层(见 gRPC 章节)。
  • 兜底机制:鉴权失败 401/403 区分、错误码与 HTTP 状态解耦、分页/排序白名单、缓存一致性用 Cache Aside + TTL。
  • 面试口头禅:“这些点具体以官方文档为准,避免背错版本细节。”

记忆点

  • 骨架 = 官方布局 + 薄 controller + 厚 service + 一条中间件链 + 生成器 + 统一契约/错误/时区/优雅退出。
  • 综合题先定边界再讲分层,最后落部署与演进,最能体现工程判断力。
笔记加载中…