thrift客户端定义连接、协议部分和调用部分分离

发布于 2022-09-11 21:31:47 字数 1100 浏览 17 评论 0

最近在用go开发thrift客户端,目前客户端一个方法如下:
1  go func() {
2
3         transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
4         protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
5
6         tSocket, err := thrift.NewTSocket(net.JoinHostPort(ip, port))
7         if err != nil {
8                 fmt.Fprintln(os.Stderr, "Error resolving address, ", err)
9                 os.Exit(1)
10        }
11
12        tTransport, _ := transportFactory.GetTransport(tSocket)
13
14        client := FundInfo.NewFundInfoServiceClientFactory(tTransport, protocolFactory)
15        if err := tTransport.Open(); err != nil {
16                fmt.Fprintln(os.Stderr, (fmt.Errorf("Error opening socket to %s:%s : %v", ip, port, err)))
17                os.Exit(1)
18        }
19
20        defer tTransport.Close()
21
22        res, err :=  client.GetFundInfo(ctx, fundcode)
23        Chan <- res
24 }()
方法中第3-20行定义的是socket连接、传输协议等,只有第22行是实际调用服务端方法。
请问能否将前面部分与实际调用部分分离?不然在每个客户端方法中都得定义这些,太显得允余。
望大神指点,谢谢。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

耳根太软 2022-09-18 21:31:47
目前我自己想的一个方案是,在util目录下定义一个fundInfoServiceClient.go文件,文件中方法如下:
func FundInfoServiceClient() (*FundInfo.FundInfoServiceClient, thrift.TTransport)  {

        transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
        protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()

        tSocket, err := thrift.NewTSocket(net.JoinHostPort(ip, port))
        if err != nil {
                fmt.Fprintln(os.Stderr, "Error resolving address, ", err)
                os.Exit(1)
        }

        tTransport, _ := transportFactory.GetTransport(tSocket)

        client :=FundInfo.NewFundInfoServiceClientFactory(tTransport, protocolFactory)

        if err := tTransport.Open(); err != nil {
                fmt.Fprintln(os.Stderr, (fmt.Errorf("Error opening socket to %s:%s : %v", ip, port, err)))
                os.Exit(1)
        }

        return client, tTransport
}
然后实际调用处方法:
go func() {
        client, tTransport := util.FundInfoServiceClient()

        defer tTransport.Close()
        res, _ := client.GetFundInfo(ctx, fundcode)

        Chan <- res
}()
当客户端调用其它方法时,只需要选择所属的serviceClient,并将res, _ := client.GetFundInfo(ctx, fundcode)替换成要调用的方法名即可。
如果各位有什么更好的方案,欢迎指出哈!
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文