代码之家  ›  专栏  ›  技术社区  ›  vardius

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

  •  7
  • vardius  · 技术社区  · 8 年前

    我有一个 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年2月8日07:03:37.603287信息:[用户服务器]在本地主机上运行: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 回复  |  直到 8 年前
        1
  •  1
  •   Tommaso Barbugli    8 年前

    服务器正在侦听该端口吗?

    // Most linux 
    lsof -i :3001
    
    // OSX
    lsof -iTCP -sTCP:LISTEN -P
    

    您是否将客户端连接到正确的地址?

    c、 serverAddr应为“127.0.0.1:3001”

        2
  •  0
  •   Kevin Sandow    8 年前

    此错误表示与服务器的连接因某种原因中断。

    您正在打印服务器正在本地主机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    
    }