用途:在 Go 中用 gqlgen 构建 GraphQL 服务端,覆盖从 schema 定义到生成、解析器实现、性能与安全防护的完整流程。
主要能力与要点:
- Schema-first:.graphql 为唯一事实来源,gqlgen 生成模型、resolver 桩与执行层。安装与生成命令为 go get -tool github.com/99designs/gqlgen、go tool gqlgen init、go tool gqlgen generate。通过 gqlgen.yml 将生成类型绑定到自有领域模型,避免生成贫血结构体。生成代码需提交,并用 go tool gqlgen generate && git diff --exit-code 在 CI 中检查是否过期;不要手改 generated.go 与 models_gen.go。
- Resolver 保持轻薄:只做请求到服务调用的转换,不含业务逻辑与 SQL;依赖通过 Resolver 结构体注入,始终传递 ctx。
- N+1 问题:列表字段的字段解析器会逐元素执行,需用 dataloader(如 github.com/vikstrous/dataloadgen)批量合并请求。loader 必须按请求创建,经中间件注入,不可进程级共享以免跨用户泄漏数据;批处理函数须按 key 顺序返回等长结果。
- 查询限制:配置复杂度上限(如 extension.FixedComplexityLimit)、深度限制(gqlgen 无内置,需在 operation 中间件实现)、列表字段强制分页、生产环境禁用或按角色限制 introspection、使用持久化查询、设置每操作超时与 http.Server 读写超时。
- 错误处理:用 SetErrorPresenter 剥离内部错误,返回稳定安全信息;用 SetRecoverFunc 将 panic 转为错误;注意非空字段出错会向上置空最近的可空祖先。
- 授权:在字段级通过指令(如 @hasRole)校验,身份来自 HTTP 中间件写入的 context,绝不信任查询参数。
- 测试:用 client.New 发起查询断言结果,并对使用 dataloader 的解析器断言查询次数,防止 N+1 回归。
适用场景:需要构建公开或内部 GraphQL API 的 Go 后端项目。限制:资料未提供具体版本兼容性、性能基准与部署平台信息。