登录
首页 >  Golang >  Go问答

使用指定端口进行 GRPC 通信

来源:stackoverflow

时间:2024-02-22 15:00:26 417浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《使用指定端口进行 GRPC 通信》,涉及到,有需要的可以收藏一下

问题内容

我正在运行一个 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 上的端点发送消息之前,服务器 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 而不是随机端口拨号?


解决方案


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

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
}

第三种方法是使用 streaming

今天关于《使用指定端口进行 GRPC 通信》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>