rpc error: code = Unimplemented desc =

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 ,可以很明显的看出是不一样的。

参考

Error handling

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值