diff --git a/network/resolver/dns/dns.go b/network/resolver/dns/dns.go index b4fa4fc5..aaa3a744 100644 --- a/network/resolver/dns/dns.go +++ b/network/resolver/dns/dns.go @@ -2,13 +2,18 @@ package dns import ( + "context" "net" "github.com/micro/go-micro/network/resolver" + "github.com/miekg/dns" ) // Resolver is a DNS network resolve -type Resolver struct{} +type Resolver struct { + // The resolver address to use + Address string +} // Resolve assumes ID is a domain name e.g micro.mu func (r *Resolver) Resolve(name string) ([]*resolver.Record, error) { @@ -22,14 +27,29 @@ func (r *Resolver) Resolve(name string) ([]*resolver.Record, error) { host = "localhost" } - addrs, err := net.LookupHost(host) + if len(r.Address) == 0 { + r.Address = "1.0.0.1:53" + } + + m := new(dns.Msg) + m.SetQuestion(dns.Fqdn(host), dns.TypeA) + rec, err := dns.ExchangeContext(context.Background(), m, r.Address) if err != nil { return nil, err } - records := make([]*resolver.Record, 0, len(addrs)) + var records []*resolver.Record + + for _, answer := range rec.Answer { + h := answer.Header() + // check record type matches + if h.Rrtype != dns.TypeA { + continue + } + + arec, _ := answer.(*dns.A) + addr := arec.A.String() - for _, addr := range addrs { // join resolved record with port address := net.JoinHostPort(addr, port) // append to record set