我有以下原稿文件:

服务_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
}

然后在主包中调用此函数

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)上的本地主机.

然而,当我在Evans中呼叫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 struct 中添加pb.UnimplementedMyServiceServer,这是向前兼容的.但很明显,我遗漏了一些代码.

为了使MyService向前兼容,缺少了什么部件?

推荐答案

REPL模式下使用evans时,应在拨打show service前 Select 套餐,在拨打call GetData前 Select 业务.

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

Go相关问答推荐

golang 的条件储存库

GetSecretValue,get identity:get credentials:无法刷新缓存的凭据

Golang文本/模板序列范围

使用一元或服务器流将切片从GRPC服务器返回到客户端

为什么(编码器).EncodeElement忽略";,innerxml";标记?

通过渠道和goroutines增值1000倍

使用goqu无法获取响应

在 Go 中使用 Apache Arrow 按时间间隔对事件进行分区

GitHub 中 REST API 的 aws 凭证问题

如果 transaction.Commit 对带有 postgres 连接的 SQL 失败,您是否需要调用 transaction.RollBack

有没有办法将 yaml node 添加到 golang 中现有的 yaml 文档中?

如何使用特定的 Go 版本运行 govulncheck?

io.Pipe 使用困难

无法访问 Go 模块导入的远程存储库

如何在测试中使用自定义标志(使用`testify/suite`)

如果服务器在客户端的 gRPC 中不可用,则等待的方法

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

如何在测试中传递用户名和密码等参数

如何使用 context.WithCancel 启动和停止每个会话的心跳?

Golang LinkedList 删除第一个元素