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

Der RPC-Deskriptor konnte nicht abgerufen werden

WBOY
Freigeben: 2024-02-08 21:39:09
nach vorne
1246 Leute haben es durchsucht

获取 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) {}
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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")
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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. 🎜
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 kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage