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

How to set up gRPC client - server correctly

我有一个 gRPC 客户端和一个服务器,当我 运行 它们似乎 运行ning 正常,但是当我尝试拨号时带有客户端的服务器出现错误:

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

不知道是什么。我试图找到 google 的解决方案,但没有成功。

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

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 INFO: [userserver] running at 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,
})

这是端口 buff

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

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

message Response {}

This error means the connection to your server is down for some reason.

您正在打印您的服务器位于 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    
}

服务器是否正在侦听该端口?

// Most linux 
lsof -i :3001

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

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

c.serverAddr 应该是“127.0.0.1:3001”