grpc client 報錯: code = Unimplemented desc = method *** not implemented


今天做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

主要還是配置問題,導致連接失敗

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM