首頁  >  文章  >  後端開發  >  取得 RPC 描述符失敗

取得 RPC 描述符失敗

WBOY
WBOY轉載
2024-02-08 21:39:091167瀏覽

获取 RPC 描述符失败

php小編草莓今天為大家介紹一個常見問題:在進行遠端過程呼叫(RPC)時,可能會遇到「取得 RPC 描述符失敗」的錯誤。這個錯誤通常意味著客戶端無法與伺服器建立有效的連接,可能是由於網路問題、服務端配置錯誤或權限問題所導致。在本文中,我們將詳細解釋這個錯誤的原因,並提供一些解決方案來解決這個問題。無論您是初學者還是有經驗的開發人員,都將從本文中獲得有關解決「獲取 RPC 描述符失敗」錯誤的有用資訊。

問題內容

我有以下原型檔案:

service_myservice.proto

service MyService {
    rpc GetData(GetRequest) returns (GetResponse) {}
}

伺服器.go

type Server struct {
    pb.UnimplementedMyServiceServer
    config util.Config
}

// NewServer creates a new gRPC server.
func NewServer(config util.Config) (*Server, error) {
    server := &Server{
        config: config,
    }

    return server, nil
}

然後在主包中我呼叫這個函數

func runGrpcServer(config util.Config) {
    server, err := gapi.NewServer(config)
    if err != nil {
        log.Fatal().Err(err).Msg("cannot create server")
    }

    grpcLogger := grpc.UnaryInterceptor(gapi.GrpcLogger)
    grpcServer := grpc.NewServer(grpcLogger)
    pb.RegisterMyServiceServer(grpcServer, server)
    reflection.Register(grpcServer)

    listener, err := net.Listen("tcp", config.GRPCServerAddress)
    if err != nil {
        log.Fatal().Err(err).Msg("cannot create listener")
    }

    log.Info().Msgf("start gRPC server at %s", listener.Addr().String())
    err = grpcServer.Serve(listener)
    if err != nil {
        log.Fatal().Err(err).Msg("cannot start gRPC server")
    }
}

我正在使用 evans (https://github.com/ktr0731/evans) 來測試我的 grpc 呼叫。 我的 gRPC 伺服器正在運行,我可以使用 evans 連接到特定連接埠 (9090) 上的本機。

但是,當我在埃文斯中呼叫 show service 時,我得到以下回應:

localhost:9090> show service
+---------+-----+--------------+---------------+
| SERVICE | RPC | REQUEST TYPE | RESPONSE TYPE |
+---------+-----+--------------+---------------+
+---------+-----+--------------+---------------+
localhost:9090> call GetData
command call: failed to get the RPC descriptor for: GetData: service unselected

我認為如果我在 Server 結構中新增 pb.UnimplementedMyServiceServer ,那麼這是向前相容的。但顯然,我缺少一些程式碼。

為了讓 MyService 向前相容,缺少哪個部分?

解決方法

REPL模式下使用evans時,呼叫show service前應選擇包,呼叫call GetData前應選擇服務。

localhost:9090> show package
+-------------------------+
|         PACKAGE         |
+-------------------------+
| example                 |
| grpc.reflection.v1      |
| grpc.reflection.v1alpha |
+-------------------------+

localhost:9090> package example

example@localhost:9090> show service
+-----------+---------+--------------+---------------+
|  SERVICE  |   RPC   | REQUEST TYPE | RESPONSE TYPE |
+-----------+---------+--------------+---------------+
| MyService | GetData | GetRequest   | GetResponse   |
+-----------+---------+--------------+---------------+

example@localhost:9090> service MyService

example.MyService@localhost:9090> call GetData
id (TYPE_INT32) => 1

以上是取得 RPC 描述符失敗的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除