proto中google.api.http注解没生效,是因为缺少import "google/api/annotations.proto"和import "google/api/http.proto",或protoc未带--grpc-gateway_out参数;生成的service.pb.gw.go必须被显式import,且路径参数名须与message字段名严格一致。

proto 中 google.api.http 注解没生效?检查 import 和 protoc 参数
注解本身不运行,只在 protoc 生成阶段起作用。漏掉任一 import,生成的 service.pb.gw.go 就没有路由逻辑。
- 必须显式写两行:
import "google/api/annotations.proto";和import "google/api/http.proto"; -
protoc命令必须带--grpc-gateway_out,且路径要包含third_party/googleapis - 生成的
service.pb.gw.go文件必须被 Go 项目 import(哪怕用 blank import:_ "your/project/proto")
GET /v1/users/{id} 总是 404?字段名与路径占位符必须严格一致
gateway 不做推导、不忽略大小写、不自动展开嵌套。URL 中的 {id} 必须对应 request message 中同名字段。
- message 定义里得有
string id = 1;,不能是user_id、ID或user.id - query 参数如
?page=1同样要求 message 中存在int32 page = 2; - 类型不匹配(比如 path 传
"123",但字段是int32)→ gateway 静默跳过,不填充也不报错
启动后全是 503 或 context canceled?endpoint 地址和 gRPC server 状态必须对齐
RegisterXXXHandlerFromEndpoint 内部会立即 dial,失败就直接返回 error,但很多场景下这个 error 被忽略,导致后续请求全 503。
- endpoint 必须是真实可连通地址:本地开发用
"localhost:9090",Docker 部署改用容器名或"host.docker.internal:9090" - gRPC server 必须先监听成功,再调用
RegisterXXXHandlerFromEndpoint;顺序颠倒会 dial timeout - 传入的
ctx不能已 cancel(例如从context.WithTimeout创建后超时),否则注册失败且无日志提示
想共用 8080 端口同时支持 REST 和 gRPC?别起两个 ListenAndServe
两个服务抢同一个 listener 会导致随机断连、503、连接拒绝。必须用 h2c.NewHandler 包裹 gRPC server 作为 fallback。
立即学习“go语言免费学习笔记(深入)”;
- 主 handler 是
runtime.ServeMux(处理 REST) - gRPC server 要包装成
http.Handler:用h2c.NewHandler(grpcServer, &http2.Server{}) - 最终
http.Server{Handler: mux}启动,其中 mux 的NotFoundHandler设为包裹后的 gRPC handler


















