Go mod 好菜系列 - 0x15 grpc-gateway 这盘协议翻译官到底该不该上桌

详细聊 grpc-gateway 为什么常出现在 HTTP + gRPC 共存的项目里、它适合什么场景、注解路由怎么工作,以及它会带来哪些维护成本。

当团队内部服务已经开始全面走 gRPC,但外部客户端、前端联调、开放接口又还得继续说 HTTP/JSON 的时候,项目里很容易出现一个角色:协议翻译官。而在 Go 生态里,这个角色常常就是 grpc-gateway

它到底在干什么

最朴素的理解就是:你用 proto 定义了一套 gRPC 接口,它帮你再暴露一套 HTTP 接口,让外部还能用熟悉的 REST 风格来访问。

所以它不是要替代 gRPC,而是帮你在“内部偏 RPC、外部偏 REST”的现实里搭一座桥。

为什么很多项目会需要它

  • 浏览器、前端、第三方系统更容易接 HTTP/JSON
  • 团队内部又不想维护两套完全独立的接口实现
  • proto 已经是主定义来源,希望接口契约尽量统一

这时候自己手写一层 HTTP handler 当然也行,但时间一长,你会发现维护两套定义非常烦:一边改了,另一边很容易忘。

它一般怎么用

最常见的方式是在 proto 里加上 HTTP 注解:

rpc GetUser(GetUserRequest) returns (GetUserReply) {
  option (google.api.http) = {
    get: "/v1/users/{id}"
  };
}

然后通过代码生成,把这层映射关系编译出来。这样你的 gRPC 方法和 HTTP 路由就尽量贴在一起,而不是散落在不同文件里各玩各的。

网关启动代码通常长这样

mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}

err := pb.RegisterUserHandlerFromEndpoint(
    context.Background(),
    mux,
    "127.0.0.1:9000",
    opts,
)
if err != nil {
    log.Fatal(err)
}

http.ListenAndServe(":8080", mux)

它做的事情很直接:HTTP 进来,gateway 按 proto 注解翻译成 gRPC 调用,再把结果转回 JSON 响应。理解这层转换关系以后,很多调试问题会清晰不少。

它真正的价值在哪

不是“省掉几行 handler”,而是让接口定义更集中。团队协作时,大家更容易形成一个共识:proto 才是契约源头,HTTP 只是它的一种投影。

这玩意儿也不是零成本

这里要稍微踩个刹车。grpc-gateway 很实用,但它不是“自动拥有 REST 体验”的按钮。你还是会碰到一些现实问题:

  • 错误码映射要不要统一
  • 字段命名和 JSON 风格要不要额外处理
  • 流式接口映射到 HTTP 时并不总是自然
  • 文档、认证、中间件到底挂在 gRPC 侧还是 gateway 侧

所以它更像是“省掉重复劳动”,不是“消灭所有协议差异”。

什么时候值得上

  • 团队内部已经把 proto 当主契约
  • 需要同时服务内部 RPC 和外部 HTTP 客户端
  • 希望两种入口尽量共用接口定义

这种场景下,grpc-gateway 非常顺手。

什么时候没必要

如果你本来就只做单纯 HTTP API,那没必要为了“以后可能微服务”先套一层 gateway。技术债有时候不是少了,而是提前借了。

实战里要注意什么

  • 别把所有 HTTP 风格差异都强行塞给 proto 注解
  • 统一好错误响应格式
  • 提前想清楚鉴权、限流、审计日志放在哪一层
  • 文档和测试最好也围绕 gateway 的对外形态补齐

小结

grpc-gateway 这盘菜很像后厨里的传菜口:

  • 它适合内部 gRPC、外部 HTTP 共存的系统
  • 核心价值是让契约更集中,减少双份维护
  • 它不能消灭协议差异,只能管理这层差异
  • 小项目别为了“听起来高级”硬上,大项目里它会很省心

Read more

Harness Engineering:从驾驭模型到构建 AI 工厂

Harness Engineering:从驾驭模型到构建 AI 工厂

2026 年,AI 编程工具的竞争焦点发生了根本性转变:决定 AI 助手好不好用的,不再是模型本身,而是包裹在模型外面的那层"Harness"。同一个模型,在不同的 Harness 下,性能差距可以达到 78% vs 42%。 这篇文章将带你深入了解 Harness Engineering——这个正在重新定义 AI 工程实践的新兴领域。 一、什么是 Harness Engineering? Harness 的字面意思是"马具/缰绳"——用来驾驭一匹强壮但不受控的马。在 AI 语境下,Harness 就是 LLM 之外的一切:工具定义、记忆系统、权限模型、反馈循环、文档规范、多

By Fuyu Jia

Claude Code CLI + Ralph:让 AI 自动完成大型编程任务的终极方案

TL;DR 当你的编程任务大到一个 AI 对话窗口装不下时,Ralph 会帮你把任务拆成小块,让 Claude Code CLI 一个接一个地自动完成——每轮都用全新的上下文窗口,不会越写越糊涂。 一、什么是 Ralph? Ralph 是一个开源项目(GitHub 16k+ Stars),基于 Geoffrey Huntley 提出的 "Ralph Pattern" 构建。它的核心理念很简单: 不要让 AI 在一个漫长的会话里做完所有事情,而是把大任务拆成小故事,每个故事用一个全新的 AI 实例来完成。 这解决了 AI 编程中最常见的痛点——上下文窗口耗尽。当对话越来越长,AI 的输出质量会明显下降。Ralph 通过「每轮一个新实例」的方式,

By Fuyu Jia