go - 在golang中获取Cosul SRV记录

标签 go dns consul srv

我有一个主应用程序和多个工作节点,它们在领事中注册。我想通过负载平衡将数据发送到工作节点。使用 golang 的 consul API,我能够获取主应用程序上的可用服务。

但是,我无法在我的 golang 应用程序中获取 DNS SRV 记录。

正如本文中提到的,How can I read consul SRV records in my go application? ,我尝试了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.[]

我还尝试将“service”添加到查询字符串中,但它也返回了相同的错误。

但是,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有什么功能吗?获得负载平衡的端点?这也足够了。

最佳答案

我在查看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 是服务端点的一部分。

关于go - 在golang中获取Cosul SRV记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62605772/

相关文章:

pointers - Golang 中 []*Users 和 *[]Users 的区别?

java - Java Socket 是否缓存 DNS?

c# - 使用不同(任意)DNS 服务器的 DNS 解析

microservices - 领事注销 'failing' 服务

consul - 领事可以支持大型键/值存储

go - 使用 go get 命令获取 "mkdir home/user permission denied"

rest - 多个参数REST API调用

go - 将 Caddy 导入 go 项目依赖项失败

dns - 经过一段时间后,kube-dns停止工作

docker - Consul 连接 Docker 容器中的上游接口(interface)