From eb0b17bea13c13bc9dae1ed4512eb8bbfa73ca37 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Fri, 24 Aug 2018 18:45:57 +0800 Subject: [PATCH] strategy: add experimental dh: `destination hashing` mode --- strategy/dh.go | 31 +++++++++++++++++++++++++++++++ strategy/ha.go | 10 ++++++++++ strategy/lha.go | 10 ++++++++++ strategy/strategy.go | 3 +++ 4 files changed, 54 insertions(+) create mode 100644 strategy/dh.go diff --git a/strategy/dh.go b/strategy/dh.go new file mode 100644 index 0000000..47e2b93 --- /dev/null +++ b/strategy/dh.go @@ -0,0 +1,31 @@ +package strategy + +import ( + "hash/fnv" + "net" + + "github.com/nadoo/glider/proxy" +) + +// destination hashing dialer +type dhDialer struct{ *rrDialer } + +// newDHDialer . +func newDHDialer(dialers []*proxy.Forwarder, webhost string, duration int) proxy.Dialer { + return &dhDialer{rrDialer: newRRDialer(dialers, webhost, duration)} +} + +func (dh *dhDialer) NextDialer(dstAddr string) proxy.Dialer { + fnv1a := fnv.New32a() + fnv1a.Write([]byte(dstAddr)) + idx := fnv1a.Sum32() % uint32(len(dh.fwdrs)) + return dh.fwdrs[idx] +} + +func (dh *dhDialer) Dial(network, addr string) (net.Conn, error) { + return dh.NextDialer(addr).Dial(network, addr) +} + +func (dh *dhDialer) DialUDP(network, addr string) (pc net.PacketConn, writeTo net.Addr, err error) { + return dh.NextDialer(addr).DialUDP(network, addr) +} diff --git a/strategy/ha.go b/strategy/ha.go index 5bd2c4d..ff8d2a2 100644 --- a/strategy/ha.go +++ b/strategy/ha.go @@ -1,6 +1,8 @@ package strategy import ( + "net" + "github.com/nadoo/glider/proxy" ) @@ -19,3 +21,11 @@ func (ha *haDialer) NextDialer(dstAddr string) proxy.Dialer { } return d } + +func (ha *haDialer) Dial(network, addr string) (net.Conn, error) { + return ha.NextDialer(addr).Dial(network, addr) +} + +func (ha *haDialer) DialUDP(network, addr string) (pc net.PacketConn, writeTo net.Addr, err error) { + return ha.NextDialer(addr).DialUDP(network, addr) +} diff --git a/strategy/lha.go b/strategy/lha.go index 8c0169f..0e897d7 100644 --- a/strategy/lha.go +++ b/strategy/lha.go @@ -1,6 +1,8 @@ package strategy import ( + "net" + "github.com/nadoo/glider/proxy" ) @@ -34,3 +36,11 @@ func (lha *lhaDialer) NextDialer(dstAddr string) proxy.Dialer { lha.SetIndex(idx) return lha.fwdrs[idx] } + +func (lha *lhaDialer) Dial(network, addr string) (net.Conn, error) { + return lha.NextDialer(addr).Dial(network, addr) +} + +func (lha *lhaDialer) DialUDP(network, addr string) (pc net.PacketConn, writeTo net.Addr, err error) { + return lha.NextDialer(addr).DialUDP(network, addr) +} diff --git a/strategy/strategy.go b/strategy/strategy.go index 21781a2..dcfe5bb 100644 --- a/strategy/strategy.go +++ b/strategy/strategy.go @@ -54,6 +54,9 @@ func NewDialer(s []string, c *Config) proxy.Dialer { case "lha": dialer = newLHADialer(fwdrs, c.CheckWebSite, c.CheckInterval) log.F("forward to remote servers in latency based high availability mode.") + case "dh": + dialer = newDHDialer(fwdrs, c.CheckWebSite, c.CheckInterval) + log.F("forward to remote servers in destination hashing mode.") default: log.F("not supported forward mode '%s', just use the first forward server.", c.Strategy) dialer = fwdrs[0]