Heim  >  Artikel  >  Backend-Entwicklung  >  Der RPC-Deskriptor konnte nicht abgerufen werden

Der RPC-Deskriptor konnte nicht abgerufen werden

WBOY
WBOYnach vorne
2024-02-08 21:39:091167Durchsuche

获取 RPC 描述符失败

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“.

Frageninhalt

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

Lösung🎜🎜Bei Verwendung von evans im REPL-Modus sollte das Paket vor dem Aufruf ausgewählt werden 🎜 und der Dienst sollte vor dem Aufruf von call GetData ausgewählt werden Code>. 🎜 <pre class="brush:php;toolbar:false;">localhost:9090&gt; show package +-------------------------+ | PACKAGE | +-------------------------+ | example | | grpc.reflection.v1 | | grpc.reflection.v1alpha | +-------------------------+ localhost:9090&gt; package example example@localhost:9090&gt; show service +-----------+---------+--------------+---------------+ | SERVICE | RPC | REQUEST TYPE | RESPONSE TYPE | +-----------+---------+--------------+---------------+ | MyService | GetData | GetRequest | GetResponse | +-----------+---------+--------------+---------------+ example@localhost:9090&gt; service MyService example.MyService@localhost:9090&gt; call GetData id (TYPE_INT32) =&gt; 1</pre>

Das 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen