为了账号安全,请及时绑定邮箱和手机立即绑定

通过特定端口发送 GRPC 通信

通过特定端口发送 GRPC 通信

Go
慕斯王 2023-07-10 14:21:06
我正在运行一个 GRPC 服务器(服务器 A),侦听特定端口。我希望能够向另一台服务器(服务器 B)发送通信,并让服务器 B 记录服务器 A 连接的传入地址,以便稍后可以联系服务器 A。在服务器 A 上,我监听端口并创建如下上下文:lis, err := net.Listen("tcp", "0.0.0.0:6000")ctx, cancel := context.WithTimeout(context.Background(),    10000*time.Millisecond)然后像这样创建连接:connection, err = grpc.DialContext(ctx, server2Address,grpc.WithInsecure(), grpc.WithBlock())在最终向服务器 B 上的端点发送消息之前,该端点尝试读取服务器 A 传入连接的 IP 地址info, _ := peer.FromContext(ctx)fmt.Printf(info.Addr.String()) // Returns a random port, NOT 6000,然而,服务器 B 打印的结果端口是随机的,例如 62056,而不是预期的 6000。我的假设是,在服务器 A 上,GRPC 从随机端口拨号 - 是否可以强制 GRPC 从端口 6000 而不是随机端口拨号?
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

您可以像这样指定源端口:


cc, err := grpc.Dial("127.0.0.1:6001", grpc.WithInsecure(),

    grpc.WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) {

        dst, err := net.ResolveTCPAddr("tcp", addr)

        if err != nil {

            return nil, err

        }

        src := &net.TCPAddr{

            IP:   net.ParseIP("127.0.0.1"),

            Port: 6000,

        }

        return net.DialTCP("tcp", src, dst)

    }))

但是,如果您的服务器正在侦听同一端口,这将导致错误:


panic: dial tcp 127.0.0.1:6000->127.0.0.1:6001: bind: address already in use

另一种方法是将地址作为元数据传递。在客户端您执行以下操作:


ctx := context.Background()

ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs("address", "127.0.0.1:6000"))

res, err := grpc_health_v1.NewHealthClient(cc).Check(ctx, &grpc_health_v1.HealthCheckRequest{

    Service: "test",

})

在服务器上:


func (s *server) Check(ctx context.Context, req *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) {

    if md, ok := metadata.FromIncomingContext(ctx); ok {

        addr := md.Get("address")

        // addr == "127.0.0.1:6000"

    }


    return &grpc_health_v1.HealthCheckResponse{

        Status: grpc_health_v1.HealthCheckResponse_SERVING,

    }, nil

}

第三种方法是使用流式传输。



查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信