今天做grpc 簡單的例子:
grpcT.proto
syntax = "proto3"; option go_package = "/grpcT;grpcT"; package grpcT; service GrpcService { rpc Fun(RequestData) returns (ResponseData){} } message RequestData { string repT = 1; int64 r = 2; } message ResponseData { string resT = 1; int64 code = 2; }
生成文件:
命令
protoc --go_out=plugins=grpc:.grpcT.proto
或者 protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./grpcT.proto
server.go
package main import ( "context" "fmt" "log" "net" pb "studyGo/grpcServer/grpcT" "google.golang.org/grpc" ) const ( port = ":50051" ) type server struct { //服務的結構類型 *pb.UnimplementedGrpcServiceServer } func (s *server) Fun(ctx context.Context, in *pb.RequestData) (*pb.ResponseData, error) { fmt.Println("-------%d,===%s", in.R, in.RepT) return &pb.ResponseData{ResT: "aaa", Code: 200}, nil } func (s *server) A(ctx context.Context, in *pb.RequestData) (*pb.ResponseData, error) { fmt.Println("-------%d,===%s", in.R, in.RepT) return &pb.ResponseData{ResT: "aaa", Code: 200}, nil } func main() { lis, err := net.Listen("tcp", port) //開啟監聽 if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() //新建一個grpc服務 pb.RegisterGrpcServiceServer(s, &server{}) //這個服務和上述的服務結構聯系起來,這樣你新建的這個服務里面就有那些類型的方法 if err := s.Serve(lis); err != nil { //這個服務和你的監聽聯系起來,這樣外界才能訪問到啊 log.Fatalf("failed to serve: %v", err) } }
出現報錯:
client.go
package main import ( "context" "fmt" "log" "time" pb "studyGo/grpcServer/grpcT" "google.golang.org/grpc" ) const ( address = "localhost:50051" ) func main() { conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewGrpcServiceClient(conn) //返回一個client連接,通過這個連接就可以訪問到對應的服務資源,就像一個對象 // Contact the server and print out its response. ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second) //返回一個client,並設置超時時間 defer cancel() r, err := c.Fun(ctx, &pb.RequestData{RepT: "aaa", R: int64(10)}) //訪問對應的服務器上面的服務方法 if err != nil { log.Fatalf("could not rpc: %v,%T", err, c) } fmt.Println(fmt.Sprintf("%v", r)) }
以上是成功的案例!
調試過程出現了錯誤:could not rpc: rpc error: code = Unimplemented desc = method Fun not implemented,*grpcT.grpcServiceClient
后來發現錯誤原因,server中的方法寫錯了。Fun 方法寫錯成其他的了,導致報錯!
排查過程中還有其他的錯誤點:
1)pb中的package name 被修改,
2)參考:https://stackoverflow.com/questions/56035027/rpc-error-code-unimplemented-desc-rpc-method-not-implemented
3)參考:https://ask.csdn.net/questions/7138747
主要還是配置問題,導致連接失敗