Skip to content

Instantly share code, notes, and snippets.

@fujiwara
Created December 7, 2016 05:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fujiwara/d66ef960e08d69bc02442eef4cc597ec to your computer and use it in GitHub Desktop.
Save fujiwara/d66ef960e08d69bc02442eef4cc597ec to your computer and use it in GitHub Desktop.
var ResovedAddress = make(map[string][]string)
var mu sync.RWMutex
func Dialer(network, addr string) (net.Conn, error) {
host, port, _ := net.SplitHostPort(addr)
mu.RLock()
addrs, found := ResovedAddress[host]
mu.RUnlock()
if found {
// log.Println("cache hit for", host)
} else {
// log.Println("cache miss for", host)
var err error
addrs, err = net.LookupHost(host)
if err != nil || len(addrs) == 0 {
return nil, err
}
}
mu.Lock()
ResovedAddress[host] = addrs
mu.Unlock()
// for DNS round robin
n := rand.Intn(len(addrs))
addr = addrs[n]
var format string
if strings.Contains(addr, ":") {
// v6
format = "[%s]:%s"
} else {
// v4
format = "%s:%s"
}
resolved := fmt.Sprintf(format, addr, port)
// log.Println("resolved", resolved)
return net.Dial(network, resolved)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment