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  }