mirror of
https://github.com/nadoo/glider.git
synced 2025-02-24 01:45:39 +08:00
strategy: add experimental dh: destination hashing
mode
This commit is contained in:
parent
104e51ae3c
commit
eb0b17bea1
31
strategy/dh.go
Normal file
31
strategy/dh.go
Normal file
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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]
|
||||
|
Loading…
Reference in New Issue
Block a user