本次使用了一个DNS包是miekg/dns,可以自由定义从哪个DNS去获取对应的IP信息,如果没有这个包请先下载,
go get github.com/miekg/dns下载后编写如下代码:
package main
import (
"fmt"
"log"
"github.com/miekg/dns"
)
func queryConsulDNS(serviceName, consulAddr string) ([]string, error) {
m := new(dns.Msg)
m.SetQuestion(dns.Fqdn(serviceName), dns.TypeA)
m.RecursionDesired = false // 不需要递归
c := new(dns.Client)
in, _, err := c.Exchange(m, consulAddr+":8600")
if err != nil {
return nil, fmt.Errorf("DNS 查询失败: %v", err)
}
var ips []string
for _, a := range in.Answer {
if ipRecord, ok := a.(*dns.A); ok {
ips = append(ips, ipRecord.A.String())
}
}
return ips, nil
}
func main() {
serviceName := "consul.service.consul" // 这个不用变,每个consul启动后就有的
consulAddr := "xxx.xxx.xxx.xxx" // 注意这里不要加端口,ip是你的consul物理机的IP(内外网都行,保证当前测试机能访问到就行),我们手动指定 :8600,这个端口是consul的DNS服务端口
log.Printf("【客户端】查询 Consul DNS: %s", serviceName)
ips, err := queryConsulDNS(serviceName, consulAddr)
if err != nil {
log.Fatalf("【客户端】DNS 查询失败: %v", err)
}
if len(ips) == 0 {
log.Fatalf("【客户端】未找到服务 IP 地址")
}
for _, ip := range ips {
log.Printf("【客户端】发现服务 IP: %s", ip)
}
}运行结果如下:
2025/07/16 14:55:01 【客户端】查询 Consul DNS: helloworld.service.consul
2025/07/16 14:55:01 【客户端】发现服务 IP: 192.168.10.229
评论 (0)