Dns 如何读取go申请中的领事SRV记录?

Dns 如何读取go申请中的领事SRV记录?,dns,go,consul,Dns,Go,Consul,我正在尝试实现服务发现,但在两件事上遇到了问题:连接到自定义DNS服务器和格式化请求 以下是我试图从go应用程序中查找的内容: $ dig @127.0.0.1 -p 8600 serviceb.service.consul SRV ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @127.0.0.1 -p 8600 serviceb.service.consul SRV ; (1 server found) ;;

我正在尝试实现服务发现,但在两件事上遇到了问题:连接到自定义DNS服务器和格式化请求

以下是我试图从go应用程序中查找的内容:

$ dig @127.0.0.1 -p 8600 serviceb.service.consul SRV

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @127.0.0.1 -p 8600 serviceb.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4511
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;serviceb.service.consul.   IN  SRV

;; ANSWER SECTION:
serviceb.service.consul. 0  IN  SRV 1 1 80 az1-serviceb1.node.dc1.consul.
serviceb.service.consul. 0  IN  SRV 1 1 80 az2-serviceb2.node.dc1.consul.

;; ADDITIONAL SECTION:
az1-serviceb1.node.dc1.consul. 0 IN A   10.6.41.22
az2-serviceb2.node.dc1.consul. 0 IN A   10.6.41.20

;; Query time: 6 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Fri May 16 15:09:28 2014
;; MSG SIZE  rcvd: 275
以及输出:

2014/05/16 15:24:31  [] lookup _serviceb._service.consul: no such host

任何帮助都将不胜感激!谢谢

尝试使用更锋利的工具,如软件包。上次我查看它时,它允许控制几乎所有客户端设置来进行DNS解析。

虽然这并不能回答您的确切问题,但我发现它更容易访问绿地应用程序的服务数据

使用以下工具调用HTTP API非常容易:


HTTP API的基础知识记录在中。

领事确实支持严格的RFC 2782,并且只能使用标准库进行查找:

resolver:=&net.resolver{
拨号:func(ctx context.context,网络,地址字符串)(net.Conn,错误){
return(&net.Dialer{}).DialContext(ctx,network,“127.0.0.1:8600”)
},
}
_,地址,错误:=resolver.LookupSRV(
context.Background(),“svcname”,“tcp”,“concur”,
)

最好的方法是使用preparedquerys,如下所示

导入(
“fmt”
ConsultAPI“github.com/hashicorp/consul/api”
)
func main(){
config:=consultAPI.DefaultConfig()
consur,err:=consuapi.NewClient(配置)
如果错误!=零{
fmt.Println(错误)
}
preparedQuery:=领事。preparedQuery()
queryID,U8;,err:=preparedQuery.Create(&ConsultAPI.PreparedQueryDefinition){
姓名:“DnsQuery”,
服务:ConsultAPI.ServiceQuery{
服务:“服务B”,
OnlyPassing:是的,
},
},&consultAPI.WriteOptions{})
如果错误!=零{
fmt.Println(错误)
}
res,,:=preparedQuery.Execute(queryID,&consultapi.QueryOptions{})
对于u,节点:=范围分辨率节点{
fmt.Println(node.Service.Address,node.Service.Port)
}

我正在玩弄这一点,但我希望有一个比手动解释/解析dns响应更成熟的解决方案。有什么想法吗?@benschwartz,为什么是手动的?我链接到的库可以对dns查询进行编码和发送,并接收和解析响应。在您的案例中,深入一层就可以了,因为在常见情况下,DNS客户端并不关心非标准DNS服务器设置:它只要求系统解析程序对其执行查询;这是标准库中的DNS客户端所做的,这涵盖了90%的用例。有没有更好的方法从请求解析应答数组,而不是使用字符串工具(如split)呢我写的一篇博客文章概述了我的想法:我开始解决这个问题的go库原型(使用我接受的答案中的建议)
2014/05/16 15:24:31  [] lookup _serviceb._service.consul: no such host
package main
import (
    "fmt"
    "net/http"
    "io/ioutil"
)
func main() {
    resp, _ := http.Get("http://localhost:8500/v1/catalog/service/serviceb")
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Print(string(body))
}