gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/network/resolver/dns/dns.go (about) 1 // Package dns resolves names to dns records 2 package dns 3 4 import ( 5 "context" 6 "net" 7 8 "gitee.com/liuxuezhan/go-micro-v1.18.0/network/resolver" 9 "github.com/miekg/dns" 10 ) 11 12 // Resolver is a DNS network resolve 13 type Resolver struct { 14 // The resolver address to use 15 Address string 16 } 17 18 // Resolve assumes ID is a domain name e.g micro.mu 19 func (r *Resolver) Resolve(name string) ([]*resolver.Record, error) { 20 host, port, err := net.SplitHostPort(name) 21 if err != nil { 22 host = name 23 port = "8085" 24 } 25 26 if len(host) == 0 { 27 host = "localhost" 28 } 29 30 if len(r.Address) == 0 { 31 r.Address = "1.0.0.1:53" 32 } 33 34 //nolint:prealloc 35 var records []*resolver.Record 36 37 // parsed an actual ip 38 if v := net.ParseIP(host); v != nil { 39 records = append(records, &resolver.Record{ 40 Address: net.JoinHostPort(host, port), 41 }) 42 return records, nil 43 } 44 45 m := new(dns.Msg) 46 m.SetQuestion(dns.Fqdn(host), dns.TypeA) 47 rec, err := dns.ExchangeContext(context.Background(), m, r.Address) 48 if err != nil { 49 return nil, err 50 } 51 52 for _, answer := range rec.Answer { 53 h := answer.Header() 54 // check record type matches 55 if h.Rrtype != dns.TypeA { 56 continue 57 } 58 59 arec, _ := answer.(*dns.A) 60 addr := arec.A.String() 61 62 // join resolved record with port 63 address := net.JoinHostPort(addr, port) 64 // append to record set 65 records = append(records, &resolver.Record{ 66 Address: address, 67 }) 68 } 69 70 // no records returned so just best effort it 71 if len(records) == 0 { 72 records = append(records, &resolver.Record{ 73 Address: net.JoinHostPort(host, port), 74 }) 75 } 76 77 return records, nil 78 }