protobuf仅负责序列化,grpc实现跨服务调用;protoc生成go代码必须同时指定--go_out和--go-grpc_out双插件,缺一不可,否则缺失服务接口或客户端桩,导致registerxxxserver或newxxxclient未定义。

Protobuf 本身不通信,gRPC 才负责跨服务调用;直接用 Protobuf 只能序列化/反序列化数据,无法发起网络请求。
protoc 命令生成 Go 代码时必须指定两个插件
只跑 protoc --go_out=. 会生成结构体(*.pb.go),但没有 gRPC 客户端和服务端接口(*_grpc.pb.go)。漏掉任一插件,编译就报错:找不到 RegisterXXXServer 或 NewXXXClient。
- 必须同时安装并调用:
protoc-gen-go(生成消息结构)和protoc-gen-go-grpc(生成 gRPC 接口) - 命令要写全:
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative user.proto - 如果用 Buf 替代 protoc,需在
buf.gen.yaml中显式启用plugin: go和plugin: go-grpc
package 和 go_package 必须对齐,否则 import 失败
proto 文件里 package user; 是 Protobuf 的命名空间,仅用于生成 RPC 方法名(如 user.UserService);而 option go_package = "./;user"; 才决定 Go 包路径和包名。两者不一致会导致:
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- Go 代码生成到错误目录,
import路径找不到 - gRPC 注册时类型不匹配:
pb.RegisterUserServiceServer里的pb指向的包和实际结构体所在包不同 - 常见错误信息:
undefined: pb.UserServiceServer或cannot use &server{} (type *server) as type pb.UserServiceServer in argument to pb.RegisterUserServiceServer
gRPC 客户端连接必须显式设置超时和拦截器
默认 Dial 不设超时,一旦后端不可达或卡住,grpc.Dial 会阻塞几十秒甚至更久;不加拦截器则无法打日志、埋点或透传 traceID。
- 基础连接示例:
conn, err := grpc.Dial("127.0.0.1:50051", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithTimeout(5*time.Second)) - 生产环境必须替换
insecure.NewCredentials()为credentials.NewTLS(...) - 拦截器建议至少加一个 unary client interceptor:
grpc.WithUnaryInterceptor(loggingInterceptor) - 别忽略
defer conn.Close(),否则连接泄漏,Too many open files错误很快出现
多服务共用一个 proto 文件时,package 冲突会静默失败
比如 user.proto 和 order.proto 都写 package service;,且都用 option go_package = "./;service",protoc 会把两个文件生成到同一个 Go 包里,导致结构体重名、方法覆盖——编译报错但提示模糊,例如 message UserRequest redeclared。
- 正确做法:每个 proto 文件用独立
package(如package user;、package order;)和独立go_package(如./user;user、./order;order) - 若真要复用字段,用
import+google/protobuf/wrappers.proto等标准库,而不是强行合并 package - Buf 工具链能提前检测这种冲突,比裸用 protoc 更早暴露问题
真正容易被忽略的是:proto 文件一旦提交进 Git,它的字段编号(= 1, = 2)就再也不能改——哪怕只是重排顺序,也破坏 wire 兼容性。别指望靠注释或文档来维护兼容性,只有编号是 runtime 唯一依据。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










