如何正确设置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”
我有一个 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”