• 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 ="
    
    • 1

    运行错误截图如下:
    在这里插入图片描述

    结论先行

    引起上述错误的主要原因是自定义的 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用 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 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    发现问题

    截至此处,基本可以上可以确定代码问题所在,因为明显在自定义的 proto 中是定义有 MyTestGrpcFunction 接口方法的,但是运行却报错 Unimplemented ,再次 check 代码发现是 package 名称,在自定义的 proto 中是 mypai ,但是在代码使用中却用的是 myapi ,可以很明显的看出是不一样的。

    参考

    Error handling

  • 相关阅读:
    数据库注入提权总结(三)
    LNMP平台搭建
    【python科研绘图】多分类多字段箱型图或者小提琴图绘制
    OpenShift Security (19) - 用红帽官方镜像加固云原生应用安全
    P5804 [SEERC2019] Absolute Game
    【数据结构趣味多】顺序表基本操作实现(Java)
    Minio + Nginx 实现静态资源对外访问
    MIPI CSI-2笔记(14) -- Low Level Protocol(包数据载荷大小相关规则,帧格式示例,数据交错Data Interleave)
    Apache JMeter 5.5 概述及下载地址
    高校教务系统登录页面JS分析——重庆交通大学
  • 原文地址:https://blog.csdn.net/lm_hao/article/details/126060083