当前位置: 首页 > 面试题库 >

在Golang中获取Cosul SRV记录

朱保赫
2023-03-14
问题内容

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

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

如该线程中所述,如何在go应用程序中读取领事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.[]

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

但是,挖掘正确返回

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文档
后,我找到了解决方案。最好的方法是使用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是服务端点的一部分。



 类似资料:
  • 问题内容: 我想通过TLS接收TCP连接。我想验证客户端证书,并使用它来验证我的应用程序的客户端。Go具有标准包装。它可以验证客户端/服务器证书。但是我找不到方法来获取远程(客户端)证书的详细信息,例如通用名称。 问题答案: 必须调用crypto / tls / Conn.Handshake 。然后,您可以阅读对等证书:tlsconn.ConnectionState()。PeerCertifica

  • 我在Aerospike数据库中有一个名称空间:test and set:user。我通过控制台上的以下命令在users中添加了四条记录: 通过aql命令,我可以查看这四条记录。aql 我知道一个接一个地获取记录的方法,它在我这边运行得很好,但这对于我的任务来说是非常昂贵的操作。我想读取多个记录(批读取)并对其执行多个算法。我从https://www.aerospike.com/docs/clien

  • 问题内容: 我们有一个大型的golang应用程序,它使用记录器(实际上是自定义记录器)将输出写入定期轮换的日志文件中。 但是,当应用程序崩溃或出现panic()时,这些消息将变为标准错误。 有什么方法可以覆盖使用记录仪的紧急功能? 问题答案: 据我所知,您无法将恐慌的输出重定向到标准错误或记录器。最好的办法是将标准错误重定向到可以在外部或在程序内部执行的文件。 对于我的rclone程序,我重定向了

  • 我正在使用go-redis/redis和go-redis/cache来缓存Go对象。 其中obj是一个具有go映射(键值对)的结构,通过使用上面的代码,我正在设置一个键并将值保存到其中。这是package Common。现在我想在不同的包中访问它,比如GetRedis_pkg,而不导入pkg。我有什么办法可以做到。并且我可以通过任何方式访问该结构内部的特定映射吗?使用redis key imort

  • 问题内容: 或者我必须使用简单的方法,例如: 问题答案: 您所做的是干净,快速的。您可以改进的是预分配切片,并使用如下循环填充它: 该封装还具有填充用随机字节切片功能。因此,如果您想用随机数据填充一个切片,这就是所有必要的工作: 另一个有趣的方法是利用成为一个。这意味着它具有一种用随机数据填充的方法。 结合软件包,您可以用随机数据“填充”变量。创建a 并将其作为源传递给函数,仅此而已。 它是这样的

  • 问题内容: com / jinzhu / gorm”和“ github.com/go-sql- driver/mysql”包与我的数据库进行交互,并尝试获取表的描述,但未找到该功能。请帮助 问题答案: 使用 gorm, 您可以执行自定义查询并以 struct形式 返回她,以下是如何显示表说明的示例: 通过gorm查看更多信息:http ://jinzhu.me/gorm/advanced.html