環境
go version go1.17.4 linux/amd64
libprotoc 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 implemented
FAIL
exit status 1
FAIL github.com/Asuha-a/test/test 0.003s
代碼
你好.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)
}
uj5u.com熱心網友回復:
在您的測驗中,您pb.RegisterHelloServer(s, &server{})使用 server結構進行呼叫。然而,這個結構只嵌入pb.UnimplementedHelloServer并沒有宣告任何方法。因此,您只能codes.Unimplemented在呼叫其任何 RPC 時回傳。
您必須Hello在server結構上實作rpc :
func (s *server) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{}, nil
}
注意:嵌入pb.UnimplementedHelloServer使 gRPC 服務器實作向前兼容,但代價是編譯時檢查。要放棄向前兼容性并在編譯時捕獲這些錯誤,您可以改為嵌入pb.UnsafeHelloServer.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385311.html
上一篇:與劇作家一起使用Opera、Safari、Brave
下一篇:硒測驗-復選框“元素不可互動”
