首页 > 后端开发 > Golang > 正文

获取 RPC 描述符失败

WBOY
发布: 2024-02-08 21:39:09
转载
1189 人浏览过

获取 RPC 描述符失败

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 向前兼容,缺少什么部分?MyService 向前兼容,缺少什么部分?

解决方法

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

解决方法🎜🎜REPL模式下使用evans时,调用🎜前应选择包,调用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中文网其他相关文章!

相关标签:
来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!