Maison  >  Article  >  développement back-end  >  Échec de l'obtention du descripteur RPC

Échec de l'obtention du descripteur RPC

WBOY
WBOYavant
2024-02-08 21:39:091167parcourir

获取 RPC 描述符失败

l'éditeur php Strawberry vous présentera aujourd'hui un problème courant : lors des appels de procédure à distance (RPC), vous pouvez rencontrer l'erreur "Échec de l'obtention du descripteur RPC". Cette erreur signifie généralement que le client ne peut pas établir une connexion valide avec le serveur, ce qui peut être dû à des problèmes de réseau, à des erreurs de configuration côté serveur ou à des problèmes d'autorisation. Dans cet article, nous expliquerons en détail la cause de cette erreur et proposerons quelques solutions pour y remédier. Que vous soyez débutant ou développeur expérimenté, vous obtiendrez des informations utiles dans cet article sur la résolution de l'erreur « Échec de l'obtention du descripteur RPC ».

Contenu de la question

J'ai le fichier prototype suivant :

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
}

Ensuite, dans le package principal, j'appelle cette fonction

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")
    }
}

J'utilise evans (https://github.com/ktr0731/evans) pour tester mes appels grpc. Mon serveur gRPC est en cours d'exécution et je peux utiliser evans pour me connecter à localhost sur un port spécifique (9090).

Cependant, lorsque j'appelle show service à Evans, j'obtiens la réponse suivante :

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

Je pense que si je suis dans Server 结构中添加 pb.UnimplementedMyServiceServer, alors c'est compatible avec les versions ultérieures. Mais évidemment, il me manque du code.

Qu'est-ce qui manque pour rendre MyService rétrocompatible ? MyService 向前兼容,缺少什么部分?

解决方法

REPL模式下使用evans时,调用show service前应选择包,调用call GetData

Solution🎜🎜Lors de l'utilisation de evans en mode REPL, le package doit être sélectionné avant d'appeler 🎜, et le service doit être sélectionné avant d'appeler call GetData 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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer