“rpc server: service not found”本质是注册中心未连通或服务名不一致;“context deadline exceeded”主因是TLS未禁用导致gRPC连接失败,需客户端和服务端均加WithInsecure()并确保etcd地址、服务名大小写完全匹配。

“rpc server: service not found”不是代码写错,是服务没注册成功;“context deadline exceeded”不是超时设短了,是 TLS 没关导致连接根本建不起来。
go-zero 启动报 rpc server: service not found
这个错误几乎每个刚写完 RPC 服务的人都会撞上,本质是注册中心没连通或服务名对不上——跟业务逻辑无关。
- 检查
etc/config.yaml里的Registry地址:etcd 默认只监听http://localhost:2379,但你可能写了http://127.0.0.1:2379,容器里还可能根本解析不了localhost,得换成宿主机 IP 或host.docker.internal - 确认服务端
ServiceName(比如"user-rpc")和客户端client.NewUserClient("user-rpc", ...)传的字符串完全一致:大小写、中划线、下划线都不能差 - 用
etcdctl get --prefix "/go-zero/"直接查 etcd,看有没有对应服务名的 key;没有就说明注册失败 - 别用
go run main.go启动却忘了加-f etc/config.yaml,否则加载的是空配置,Registry字段为 nil - 服务启动太快,etcd 还没 ready 就去注册:可以在
main.go加个简单健康检查循环,比sleep 2s更可靠
client 调用返回 context deadline exceeded
这不是 timeout 设置太小,而是底层 gRPC 连接压根没建立成功。go-zero 默认启用 TLS,但本地开发基本没配证书。
- 客户端初始化必须显式禁用 TLS:
client.NewUserClient("user-rpc", etcdConf, client.WithNonBlock(), client.WithInsecure()) - 服务端
server.NewServer也得加server.WithInsecure(),否则两端握手失败 - Docker 环境下,client 配置的注册中心地址如果是
localhost,容器内无法解析——必须用宿主机真实 IP 或host.docker.internal - 检查
goctl rpc生成的 client 代码里是否漏掉了WithInsecure();如果用了自定义 client 构造逻辑,很容易忽略这点
goctl api 生成的 HTTP 接口收不到 JSON body
请求发过去,AddReq 结构体字段全是零值,不是路由写错了,是两个关键点没做对。
立即学习“go语言免费学习笔记(深入)”;
-
AddReq的字段必须首字母大写 + 显式加jsontag,比如Name string `json:"name"`;小写字段不会被反序列化 -
.api文件里路由定义必须带requestBody显式声明:post /user/add (AddReq),不能写成post /user/add()或post /user/add - 生成后检查
handler代码里是否有req := new(AddReq)+c.ShouldBind(&req)逻辑;没有说明goctl没识别到 body 绑定需求
真正卡住人的从来不是语法或框架能力,而是注册中心连通性、TLS 开关、大小写敏感这些「配置层面的细节」——它们不报编译错误,也不在文档首页标红,但会让服务跑起来就挂掉。


















