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 ».
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
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 connexionCe 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!