★ 综合题:用 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;错误码、常量独立包防循环引用。
横切能力清单
- 统一响应:全局挂
ghttp.MiddlewareHandlerResponse(或自定义后置中间件)输出{code,message,data}。 - 中间件顺序:统一响应 → CORS → 鉴权(白名单 /login、/swagger)→ 访问日志(带计时与 TraceId)。
- 数据层:
loc=Local&parseTime=true连接串 + 连接池参数 + 生产debug: false;gen dao 出 do/entity。 - 接口契约:规范路由 +
openapiPath/swaggerPath,v 标签校验自动映射到文档。 - 错误体系:<1000 框架预留,业务码从 1000 起按模块分段;gerror.NewCode 抛出,统一出口记日志。
- 分页规范:Req 带 Page/Size 默认值与上限,Res 固定 List/Total/Page/Size,
Page + ScanAndCount收尾。 - 时间与追踪:
SetTimeZone统一进程时区;初始化 OTLP 上报器,ctx 首参贯穿。 - 运维闭环:gproc 注册优雅退出回调 → s.Shutdown;多环境配置切文件;静态编译 + nginx/supervisor/Docker。
回答时的加分点
- 先说清“范围与假设”(C 端/B 端、QPS、团队规模),再谈取舍——比如是否需要缓存、要不要拆微服务。
- 展示可演进性:模块先按 service 接口解耦,未来拆 gRPC 服务只加适配层(见 gRPC 章节)。
- 兜底机制:鉴权失败 401/403 区分、错误码与 HTTP 状态解耦、分页/排序白名单、缓存一致性用 Cache Aside + TTL。
- 面试口头禅:“这些点具体以官方文档为准,避免背错版本细节。”
记忆点
- 骨架 = 官方布局 + 薄 controller + 厚 service + 一条中间件链 + 生成器 + 统一契约/错误/时区/优雅退出。
- 综合题先定边界再讲分层,最后落部署与演进,最能体现工程判断力。