環(huán)境go version go1.17.4 linux/amd64libprotoc 3.6.1問題我正在測試 Go 實(shí)現(xiàn)的 grpc 服務(wù)器和客戶端。首先,我做了 proto 定義并通過 protoc 命令生成 pb 代碼。我提到了這個解決方案。下面的錯誤由最小代碼打印以重現(xiàn)我的錯誤。錯誤$ 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貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個贊
在您的測試中,您pb.RegisterHelloServer(s, &server{})使用 serverstruct 進(jìn)行調(diào)用。然而,這個結(jié)構(gòu)只嵌入pb.UnimplementedHelloServer和聲明沒有方法。因此,您只能codes.Unimplemented在調(diào)用其任何 RPC 時返回。
您必須在結(jié)構(gòu)上實(shí)現(xiàn)Hellorpc server:
func (s *server) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{}, nil
}
注意:嵌入pb.UnimplementedHelloServer使 gRPC 服務(wù)器實(shí)現(xiàn)向前兼容,但代價是編譯時檢查。要放棄前向兼容性并在編譯時捕獲這些錯誤,您可以改為嵌入pb.UnsafeHelloServer.
- 1 回答
- 0 關(guān)注
- 150 瀏覽
添加回答
舉報
0/150
提交
取消