go-micro v4+ 已移除 protoc-gen-micro,须改用 protoc-gen-go 和 protoc-gen-go-grpc 生成标准 grpc 接口并手动集成;默认注册中心为内存 mdns,跨环境需显式配置 etcd;gin 与 go-micro 混用须桥接 context 并透传 metadata;service.run() 卡住多因漏调或重复调用 service.init()。

go-micro v4+ 已不兼容旧版代码生成链,强行沿用 protoc-gen-micro 会直接报错或生成空文件——这不是你环境没配好,是框架本身已移除该插件。
protoc-gen-micro 报 unknown flag: --micro_out?换插件,别硬扛
这是 v4 起最常踩的第一个坑:很多教程还教用 protoc-gen-micro 生成 *.micro.go,但 v4 完全删掉了这个插件入口。运行时会提示 unknown flag: --micro_out 或静默产出空文件。
- v4+ 正确路径是用
protoc-gen-go+protoc-gen-go-grpc生成标准 gRPC 接口(*_grpc.pb.go和*_pb.go) - go-micro 的 client/server 不再自动绑定 proto service,需手动注册 handler:
proto.RegisterXXXHandler(service.Server(), new(Impl)) - 若想保留
proto.NewXXXService()风格客户端,得自己写一层薄包装器,或降级到 v3.10.x(但 v3 不支持 Go 1.21+ module 行为)
服务启动后调用返回 service not found?检查注册中心是否真在用 etcd
v4 默认注册中心是内存型 mdns,不是 Consul 也不是 etcd。它只在单机多进程调试时有效,跨容器、跨机器就失联——但不会报错,只会让客户端卡住或返回 service not found。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 开发阶段可用
--registry=mdns --registry_address=192.168.x.x:5353显式绑定网卡,避免 macOS/Linux 默认绑定失败 - 测试/预发必须切到
--registry=etcd --registry_address=http://etcd:2379(注意是http://,不是etcd://) - 别信“自动 fallback”——go-micro 不 fallback,它就默默用内存注册,然后等你花半天查网络策略和 DNS
gin handler 调用 go-micro client 时 traceID 断掉?必须桥接 context
把 *gin.Context 直接传进 go-micro 的 RPC 调用,ctx.Value() 全是 nil。因为两者 context 类型不兼容:gin.Context 是 HTTP 生命周期,go-micro 的 context.Context 是 RPC 调用链上下文。
- 在 gin handler 中调用 client 时,必须用
micro.WithContext(ctx, r.Context())显式桥接(r是*gin.Context) - metadata(如
traceID、user_id)需从r.Request.Header提取后注入,不能依赖中间件自动透传 - 若用了自定义中间件往
gin.Context塞值,记得在桥接前手动拷贝到新 context,例如:ctx = context.WithValue(ctx, "traceID", r.GetString("traceID"))
真正容易被忽略的是:v4 的 registry 和 selector 是解耦的,service.Init() 漏调或重复调用都会导致 service.Run() 卡住——日志里没提示,debug 时也看不出哪行出问题。建议所有初始化逻辑统一收口,加个 initOnce sync.Once 控制。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










