grpc 测试代码退出 1 并出现“rpc 错误:代码 = 未实现的 desc = 方法 Hello 未实现”
Posted
技术标签:
【中文标题】grpc 测试代码退出 1 并出现“rpc 错误:代码 = 未实现的 desc = 方法 Hello 未实现”【英文标题】:grpc testing code exit 1 with 'rpc error: code = Unimplemented desc = method Hello not implemented' 【发布时间】:2022-01-15 04:50:49 【问题描述】:环境
go version go1.17.4 linux/amd64
libprotoc 3.6.1
问题
我正在测试 Go 实现的 grpc 服务器和客户端。 首先,我做了 proto 定义并通过 protoc 命令生成 pb 代码。 我提到了这个solution。 以下错误由最小代码打印以重现我的错误。
错误
$ go test
--- FAIL: TestHello (0.00s)
main_test.go:49: failed to Hello: rpc error: code = Unimplemented desc = method Hello not implemented
FAIL
exit status 1
FAIL github.com/Asuha-a/test/test 0.003s
代码
hello.proto
syntax = "proto3";
option go_package = "github.com/Asuha-a/test/pb";
package hello;
service Hello
rpc Hello (HelloRequest) returns (HelloReply)
message HelloRequest
string foo = 1;
message HelloReply
string bar = 1;
main_test.go
package hello_test
import (
"context"
"log"
"net"
"testing"
"github.com/Asuha-a/test/pb"
"google.golang.org/grpc"
"google.golang.org/grpc/test/bufconn"
)
type server struct
pb.UnimplementedHelloServer
const bufSize = 1024 * 1024
var lis *bufconn.Listener
func init()
lis = bufconn.Listen(bufSize)
s := grpc.NewServer()
pb.RegisterHelloServer(s, &server)
go func()
if err := s.Serve(lis); err != nil
log.Fatalf("server exited with error: %v", err)
()
func bufDialer(context.Context, string) (net.Conn, error)
return lis.Dial()
func TestHello(t *testing.T)
ctx := context.Background()
conn, err := grpc.DialContext(ctx, "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithInsecure())
if err != nil
t.Fatalf("failed to dial bufnet: %v", err)
defer conn.Close()
client := pb.NewHelloClient(conn)
r, err := client.Hello(ctx, &pb.HelloRequest
Foo: "foo",
)
if err != nil
t.Fatalf("failed to Hello: %v", err) //49th line prints the error
log.Println(r)
【问题讨论】:
【参考方案1】:在您的测试中,您使用server
结构调用pb.RegisterHelloServer(s, &server)
。然而,这个结构只嵌入了pb.UnimplementedHelloServer
并且没有声明任何方法。因此,您只能在调用其任何 RPC 时返回 codes.Unimplemented
。
您必须在server
结构上实现Hello
rpc:
func (s *server) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error)
return &pb.HelloReply, nil
注意: 嵌入 pb.UnimplementedHelloServer
使 gRPC 服务器实现向前兼容,但代价是编译时检查。要放弃前向兼容性并在编译时捕获这些错误,您可以改为嵌入 pb.UnsafeHelloServer
。
【讨论】:
以上是关于grpc 测试代码退出 1 并出现“rpc 错误:代码 = 未实现的 desc = 方法 Hello 未实现”的主要内容,如果未能解决你的问题,请参考以下文章
谷歌首次出现集体请辞!锤子480万门票收入全部捐赠给OpenSSL与OpenBSD;gRPC 1.12.0