Go

Go语言学习笔记:Consul访问方式之DNS

李胤
2025-07-16 / 0 评论 / 7 阅读 / 正在检测是否收录...

本次使用了一个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

评论 (0)

取消