php-Editor Strawberry stellt Ihnen heute ein häufiges Problem vor: Beim Ausführen von Remoteprozeduraufrufen (RPC) kann die Fehlermeldung „RPC-Deskriptor konnte nicht abgerufen werden“ auftreten. Dieser Fehler bedeutet normalerweise, dass der Client keine gültige Verbindung mit dem Server herstellen kann, was durch Netzwerkprobleme, serverseitige Konfigurationsfehler oder Berechtigungsprobleme verursacht werden kann. In diesem Artikel erklären wir die Ursache dieses Fehlers im Detail und bieten einige Lösungen zur Behebung an. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, erhalten Sie in diesem Artikel nützliche Informationen zur Behebung des Fehlers „RPC-Deskriptor konnte nicht abgerufen werden“.
Ich habe die folgende Prototypdatei:
service_myservice.proto
service MyService { rpc GetData(GetRequest) returns (GetResponse) {} }
server.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 }
Dann rufe ich im Hauptpaket diese Funktion auf
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") } }
Ich verwende Evans (https://github.com/ktr0731/evans), um meine grpc-Aufrufe zu testen. Mein gRPC-Server läuft und ich kann evans verwenden, um eine Verbindung zu localhost an einem bestimmten Port (9090) herzustellen.
Wenn ich jedoch show service
in Evans anrufe, erhalte ich folgende Antwort:
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
Ich denke, wenn ich dabei bin Server
结构中添加 pb.UnimplementedMyServiceServer
, dann ist das vorwärtskompatibel. Aber offensichtlich fehlt mir ein Code.
Welche Teile fehlen, um MyService
vorwärtskompatibel zu machen? MyService
向前兼容,缺少什么部分?
REPL模式下使用evans时,调用show service
前应选择包,调用call GetData
call GetData ausgewählt werden Code>. 🎜
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
Nach dem Login kopierenDas obige ist der detaillierte Inhalt vonDer RPC-Deskriptor konnte nicht abgerufen werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!