环境go version go1.17.4 linux/amd64libprotoc 3.6.1问题我正在测试 Go 实现的 grpc 服务器和客户端。首先,我做了 proto 定义并通过 protoc 命令生成 pb 代码。我提到了这个解决方案。下面的错误由最小代码打印以重现我的错误。错误$ go test--- FAIL: TestHello (0.00s) main_test.go:49: failed to Hello: rpc error: code = Unimplemented desc = method Hello not implementedFAILexit status 1FAIL github.com/Asuha-a/test/test 0.003s代码你好.protosyntax = "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.gopackage hello_testimport ( "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 * 1024var lis *bufconn.Listenerfunc 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 回答
哈士奇WWW
TA贡献1799条经验 获得超6个赞
在您的测试中,您pb.RegisterHelloServer(s, &server{})使用 serverstruct 进行调用。然而,这个结构只嵌入pb.UnimplementedHelloServer和声明没有方法。因此,您只能codes.Unimplemented在调用其任何 RPC 时返回。
您必须在结构上实现Hellorpc server:
func (s *server) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{}, nil
}
注意:嵌入pb.UnimplementedHelloServer使 gRPC 服务器实现向前兼容,但代价是编译时检查。要放弃前向兼容性并在编译时捕获这些错误,您可以改为嵌入pb.UnsafeHelloServer.
- 1 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消
