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

在 golang 中获取 Basket SRV 记录

在 golang 中获取 Basket SRV 记录

Go
牧羊人nacy 2022-06-13 15:44:26
我有一个主应用程序和多个工作节点,它们在领事中注册。我想通过负载平衡将数据发送到工作节点。使用 golang 的 consul API,我可以在主应用程序上获得可用的服务。但是,我无法在我的 golang 应用程序中获取 DNS SRV 记录。正如这个线程中提到的,如何在我的 go 应用程序中读取 consul SRV 记录?,我尝试了 github.com/miekg/dns,但没有成功。另外,我尝试使用 github.com/benschw/consul-clb-go,如下所示:c := clb.NewClb("127.0.0.1", "8600", clb.Random)srvRecord := "Processor" + ".service.consul"address, err := c.GetAddress(srvRecord)if err != nil {    fmt.Println(err)}fmt.Println(address)它给了我这个错误:panic: runtime error: index out of range [0] with length 0另外,我尝试使用 net 包如下:resolver := &net.Resolver{    Dial: func(ctx context.Context, network, address string) (net.Conn, error) {        return (&net.Dialer{}).DialContext(ctx, network, "127.0.0.1:8600")    },}_, addrs, err := resolver.LookupSRV(    context.Background(), "Processor", "tcp", "consul",)if err != nil {    fmt.Printf("Error : %v", err)}fmt.Println(addrs)它返回:Error : lookup _Processor._tcp.consul: dnsquery: DNS name does not exist.[]我也尝试将“服务”添加到查询字符串中,但它也返回了相同的错误。但是, dig 正确返回:C:\Users\Sude>dig @127.0.0.1 -p 8600 Processor.service.consul SRV; <<>> DiG 9.8.8 <<>> @127.0.0.1 -p 8600 Processor.service.consul SRV; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62807;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0;; WARNING: recursion requested but not available;; QUESTION SECTION:;Processor.service.consul.      IN      SRV;; ANSWER SECTION:Processor.service.consul. 0     IN      SRV     1 1 8001 localhost.Processor.service.consul. 0     IN      SRV     1 1 8005 localhost.Processor.service.consul. 0     IN      SRV     1 1 8004 localhost.;; Query time: 0 msec;; SERVER: 127.0.0.1#8600(127.0.0.1);; WHEN: Sat Jun 27 09:37:05 India Standard Time 2020;; MSG SIZE  rcvd: 129我如何在我的 go 应用程序中读取这些记录?此外,Go Consul API中是否有任何函数可以获取负载平衡的端点?这也足够了。
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

我通过Consul Golang API docs找到了解决方案。最好的方法是使用 PreparedQueries:


preparedQuery := consul.PreparedQuery()

queryID, _, err := pq.Create(&consulapi.PreparedQueryDefinition{

    Name: "DnsQuery",

    Service: consulapi.ServiceQuery{

        Service:     "Processor",

        OnlyPassing: true,

    },

}, &consulapi.WriteOptions{})

if err != nil {

    fmt.Println(err)

}


res, _, _ := preparedQuery.Execute(queryID, &consulapi.QueryOptions{})

for _, node := range res.Nodes {

    fmt.Println(node.Service.Address, node.Service.Port)

}

res.Nodes 是服务端点的一部分。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

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