php小编草莓今天为大家介绍一个常见问题:在进行远程过程调用(RPC)时,可能会遇到“获取 RPC 描述符失败”的错误。这个错误通常意味着客户端无法与服务器建立有效的连接,可能是由于网络问题、服务端配置错误或者权限问题所导致。在本文中,我们将详细解释这个错误的原因,并提供一些解决方案来解决这个问题。无论您是初学者还是有经验的开发人员,都将从本文中获得有关解决“获取 RPC 描述符失败”错误的有用信息。
我有以下原型文件:
service_myservice.proto
service MyService { rpc GetData(GetRequest) returns (GetResponse) {} }
服务器.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 }
然后在主包中我调用这个函数
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") } }
我正在使用 evans (https://github.com/ktr0731/evans) 来测试我的 grpc 调用。 我的 gRPC 服务器正在运行,我可以使用 evans 连接到特定端口 (9090) 上的本地主机。
但是,当我在埃文斯中调用 show service 时,我得到以下响应:
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
我认为如果我在 Server 结构中添加 pb.UnimplementedMyServiceServer ,那么这是向前兼容的。但显然,我缺少一些代码。
为了使 MyService 向前兼容,缺少什么部分?
REPL模式下使用evans时,调用show service前应选择包,调用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
以上就是获取 RPC 描述符失败的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号