Maison > développement back-end > Golang > le corps du texte

Échec de l'obtention du descripteur RPC

WBOY
Libérer: 2024-02-08 21:39:09
avant
1188 Les gens l'ont consulté

获取 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) {}
}
Copier après la connexion

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
}
Copier après la connexion

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")
    }
}
Copier après la connexion

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
Copier après la connexion

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>. 🎜
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
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!