【问题标题】:gRPC error about missing an "Unimplemented" server method有关缺少“未实现”服务器方法的 gRPC 错误
【发布时间】:2021-12-10 12:23:13
【问题描述】:

这是我的原型文件:

syntax = "proto3";

option go_package = ".;pb";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply); // hello
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

**

package main

import (
    "awesomeProject/grpc_test/proto"
    "context"
    "google.golang.org/grpc"
    "net"
)


type Server struct {}

func (s *Server) SayHello(ctx context.Context, request *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{
        Message: "hello" + request.Name,
    }, nil
}

func main() {
    g := grpc.NewServer()
    pb.RegisterGreeterServer(g, &Server{})

    lis, err := net.Listen("tcp", "0.0.0.0:8080")
    if err != nil {
        panic("failed to listen: " + err.Error() )
    }

    err = g.Serve(lis)
    if err != nil {
        panic("failed to start grpc: " + err.Error())
    }
}

我得到了一个错误:

cannot use &Server{} (type *Server) as type pb.GreeterServer in argument to pb.RegisterGreeterServer:*Server does not implement pb.GreeterServer (missing pb.mustEmbedUnimplementedGreeterServer method)

如何解决?

【问题讨论】:

  • 你用什么从 proto 文件生成 Go 代码?看起来您正在使用一个需要您将类型嵌入到服务器结构中的工具包。
  • 一些实现问题。你结帐了吗buf.build?它有助于在 Go 中设置和维护 gRPC 服务。
  • @BurakSerdar 在以protoc --go_out=. --go-grpc_out=. 调用时与官方protoc-gen-go-grpc 工具包一起发生。通过插件调用时(还没有)发生:protoc --go_out=plugins=grpc:.
  • 这能回答你的问题吗? grpc with mustEmbedUnimplemented*** method

标签: go grpc


【解决方案1】:

README 对此进行了介绍(this issuethis issue 提供了很多,也许太多了!,更多信息)。

解决方案是将您的struct 定义(如错误提示)编辑为:

type Server struct {
    proto.UnimplementedGreeterServer
}

您可能还想看看quickstart。您的服务似乎源自此,您会注意到main.gohere 中的/examples/helloworld/greeter_server/main.go)包含类似的struct 定义。

添加proto.UnimplementedGreeterServer 为所有服务(生成的代码的一部分)提供了默认实现;例如:

func (UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) {
    return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
}

在结构中包含UnimplementedGreeterServer 意味着如果您将新服务添加到proto 文件,然后重新编译您的应用程序,它将无错误地编译,并在客户端尝试调用新服务时返回未实现的错误。前面提到的问题包括很多关于为什么选择这种方法的讨论。

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2021-08-03
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多