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中文網其他相關文章!