在 golang 中获取 Cosul SRV 记录
Fetching Cosul SRV records in golang
我有一个主应用程序和多个工作节点,它们已在 consul 中注册。我想通过负载平衡将数据发送到工作节点。使用 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
此外,我尝试使用如下网络包:
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)
它returns:
Error : lookup _Processor._tcp.consul: dnsquery: DNS name does not exist.[]
我也试过在查询字符串中添加“服务”,但它也返回了同样的错误。
但是,正确挖掘returns:
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 是服务端点的一部分。
我有一个主应用程序和多个工作节点,它们已在 consul 中注册。我想通过负载平衡将数据发送到工作节点。使用 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
此外,我尝试使用如下网络包:
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)
它returns:
Error : lookup _Processor._tcp.consul: dnsquery: DNS name does not exist.[]
我也试过在查询字符串中添加“服务”,但它也返回了同样的错误。
但是,正确挖掘returns:
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 是服务端点的一部分。