grpc 版本
在 go 语言场景下使用 grpc,编译 ok,运行的时候报错。
grpc 版本:1.40.0
go version: go1.16.10 linux/amd64
运行报错提示
"rpc error: code = Unimplemented desc ="
运行错误截图如下:
结论先行
引起上述错误的主要原因是自定义的 proto 文件中 package
的名字和代码中的 import
中的 package 名称不一致才导致的问题。
因此检查自定义的 proto 文件以及代码中引用(import)的文件名称,将二者改为一致即可。
后续的内容只是简单记录下发现错误过程而已。感兴趣的可以继续阅读。
错误调查
查看 proto 文件
package mypai;
option go_package = "./;mypai";
service mygrpc{
rpc MyTestGrpcFunction(EmptyReq) returns (MyActiveTable) {}
}
message EmptyReq{}
message MyActiveTable
{
repeated string idList = 1;
}
grpcClient 部分代码
报错的位置是第 27 行
处,其他部分代码截图如下:
3 import (
4 "fmt"
5 myapi "mycodes/egrpcProtoc/test"
6 "time"
7 "errors"
8 )
...........
25 func TestMyTestGrpcFunction(req *myapi.EmptyReq) (resp *myapi.MyActiveTable) {
26 if resp, err = grpcClient.MyTestGrpcFunction(req); err != nil {
27 log.Logger.Error(err)
28 }
29 } else {
30 log.Logger.Error(err)
31 }
32 return resp
33 }
使用 grpc 工具生成的 *.pb.go 部分代码
3 package mypai
...........
72 type GrpcClient interface {
73 MyTestGrpcFunction(in *EmptyRequest, opts ...grpc.CallOption) (*MyActiveTable, error)
74 }
...........
78 func (c *grpcClient ) MyTestGrpcFunction(in *EmptyRequest, opts ...grpc.CallOption) (*MyActiveTable, error) {
79 out := new(MyActiveTable)
80 err := c.cc.Invoke(ctx, "/mypai_communication.myapi/MyTestGrpcFunction", in, out, opts...)
81 if err != nil {
82 return nil, err
83 }
84 return out, nil
85 }
...........
112 type GrpcClient interface {
113 MyTestGrpcFunction(*EmptyRequest) (*MyActiveTable, error)
114 }
...........
123 func (*UnimplementedMypaiServer) MyTestGrpcFunction(*EmptyRequest) (*MyActiveTable, error) {
124 return nil, status.Errorf(codes.Unimplemented, "method MyTestGrpcFunctionnot implemented")
125 }
发现问题
截至此处,基本可以上可以确定代码问题所在,因为明显在自定义的 proto
中是定义有 MyTestGrpcFunction
接口方法的,但是运行却报错 Unimplemented
,再次 check 代码发现是 package 名称,在自定义的 proto
中是 mypai ,但是在代码使用中却用的是 myapi ,可以很明显的看出是不一样的。