如何正确设置 gRPC 客户端和服务器

7

我有一个 gRPC 客户端和服务器,当我运行它们时,它们似乎都正常运行,但当我试图使用客户端拨号服务器时,出现了错误:

"Error": {
    "code": 14,
    "message": "all SubConns are in TransientFailure"
},

我不知道这是什么。我尝试在谷歌上找到解决方案,但没有成功。

有什么想法吗?这是我的服务器代码:

lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.Host, cfg.Port))
if err != nil {
    logger.Critical(ctx, "failed to listen: %v", err)
} else {
    logger.Info(ctx, "[userserver] running at %s:%d", cfg.Host, cfg.Port)
}

grpcServer := grpc.NewServer()
userServer := userserver.New()
pb.RegisterDomainServer(grpcServer, userServer)
rpcErr := grpcServer.Serve(lis)

if rpcErr != nil {
    logger.Critical(ctx, "failed to serve: %v", rpcErr)
}

顺便提一句,这里的服务器显示了日志:

2018/02/08 07:03:37.603287 信息:[用户服务器] 运行在 localhost:3001

而客户端:

conn, err := grpc.Dial(c.serverAddr, grpc.WithInsecure())
if err != nil {
    return err
}
defer conn.Close()

client := pb.NewDomainClient(conn)
_, err = client.Dispatch(ctx, &pb.Command{
    Name:    command,
    Payload: payload,
})

这是端口缓冲区

service Domain {
  rpc Dispatch(Command) returns (Response);
}

message Command {
  string name = 1;
  bytes payload = 2;
}

message Response {}
2个回答

1
服务器正在监听该端口吗?
// Most linux 
lsof -i :3001

// OSX
lsof -iTCP -sTCP:LISTEN -P

你是否将客户端连接到正确的地址?
c.serverAddr 应该是 "127.0.0.1:3001"。

我正在运行在一个 Docker 镜像 golang:latest 上,所以 lsofnetstatnmap 命令会提示 command not found - vardius
如果有帮助的话,这是我的docker-compose设置。 - vardius
1
看起来 Docker 镜像清单不正确(服务的端口部分)。 - Tommaso Barbugli

0
这个错误意味着由于某些原因,您与服务器的连接中断了。
您正在打印您的服务器在localhost:3001上运行,但没有检查服务器是否有任何错误在该地址上提供服务。
请将服务器的最后一行替换为:
if err := grpcServer.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
}

另外,在服务器启动时,ctx 上下文是从哪里来的?


我假设你的协议定义看起来像这样 - 否则可能会有其他问题:
package ...;

service Domain {
   rpc Dispatch(Command) returns (...) {}
}

message Command {
   ... Name
   ... Payload    
}

1
我已经更新了我的问题,加入了proto定义。不幸的是,grpcServer.Serve没有返回错误。 - vardius
上下文可以像这样分配:ctx := context.Background() - vardius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接