mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-04 07:42:38 +08:00 
			
		
		
		
	doc: add info for dh mode
This commit is contained in:
		
							parent
							
								
									035e15df5c
								
							
						
					
					
						commit
						2f239d60f1
					
				@ -2,5 +2,6 @@ language: go
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - "1.10.x"
 | 
					  - "1.10.x"
 | 
				
			||||||
 | 
					  - "1.11.x"
 | 
				
			||||||
  - master
 | 
					  - master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -217,6 +217,7 @@ Available forward strategies:
 | 
				
			|||||||
  rr: Round Robin mode
 | 
					  rr: Round Robin mode
 | 
				
			||||||
  ha: High Availability mode
 | 
					  ha: High Availability mode
 | 
				
			||||||
  lha: Latency based High Availability mode
 | 
					  lha: Latency based High Availability mode
 | 
				
			||||||
 | 
					  dh: destination hashing mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Forwarder option scheme: FORWARD_URL#OPTIONS
 | 
					Forwarder option scheme: FORWARD_URL#OPTIONS
 | 
				
			||||||
  priority: set the priority of that forwarder, default:0
 | 
					  priority: set the priority of that forwarder, default:0
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										1
									
								
								conf.go
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								conf.go
									
									
									
									
									
								
							@ -190,6 +190,7 @@ func usage() {
 | 
				
			|||||||
	fmt.Fprintf(os.Stderr, "  rr: Round Robin mode\n")
 | 
						fmt.Fprintf(os.Stderr, "  rr: Round Robin mode\n")
 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "  ha: High Availability mode\n")
 | 
						fmt.Fprintf(os.Stderr, "  ha: High Availability mode\n")
 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "  lha: Latency based High Availability mode\n")
 | 
						fmt.Fprintf(os.Stderr, "  lha: Latency based High Availability mode\n")
 | 
				
			||||||
 | 
						fmt.Fprintf(os.Stderr, "  dh: destination hashing mode\n")
 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "\n")
 | 
						fmt.Fprintf(os.Stderr, "\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fmt.Fprintf(os.Stderr, "Forwarder option scheme: FORWARD_URL#OPTIONS\n")
 | 
						fmt.Fprintf(os.Stderr, "Forwarder option scheme: FORWARD_URL#OPTIONS\n")
 | 
				
			||||||
 | 
				
			|||||||
@ -105,6 +105,7 @@ listen=socks5://:1080
 | 
				
			|||||||
# Round Robin mode: rr
 | 
					# Round Robin mode: rr
 | 
				
			||||||
# High Availability mode: ha
 | 
					# High Availability mode: ha
 | 
				
			||||||
# Latency based High Availability mode: lha
 | 
					# Latency based High Availability mode: lha
 | 
				
			||||||
 | 
					# Destination Hashing mode: dh
 | 
				
			||||||
strategy=rr
 | 
					strategy=rr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -105,7 +105,7 @@ func newDialer(fwdrs []*proxy.Forwarder, c *Config) *Dialer {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, f := range fwdrs {
 | 
						for _, f := range fwdrs {
 | 
				
			||||||
		f.AddHandler(d.OnStatusChanged)
 | 
							f.AddHandler(d.onStatusChanged)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return d
 | 
						return d
 | 
				
			||||||
@ -128,6 +128,7 @@ func (d *Dialer) DialUDP(network, addr string) (pc net.PacketConn, writeTo net.A
 | 
				
			|||||||
func (d *Dialer) NextDialer(dstAddr string) proxy.Dialer {
 | 
					func (d *Dialer) NextDialer(dstAddr string) proxy.Dialer {
 | 
				
			||||||
	d.mu.RLock()
 | 
						d.mu.RLock()
 | 
				
			||||||
	defer d.mu.RUnlock()
 | 
						defer d.mu.RUnlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return d.nextForwarder(dstAddr)
 | 
						return d.nextForwarder(dstAddr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -158,12 +159,13 @@ func (d *Dialer) initAvailable() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// OnStatusChanged will be called when fwdr's status changed
 | 
					// onStatusChanged will be called when fwdr's status changed
 | 
				
			||||||
func (d *Dialer) OnStatusChanged(fwdr *proxy.Forwarder) {
 | 
					func (d *Dialer) onStatusChanged(fwdr *proxy.Forwarder) {
 | 
				
			||||||
	d.mu.Lock()
 | 
						d.mu.Lock()
 | 
				
			||||||
	defer d.mu.Unlock()
 | 
						defer d.mu.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if fwdr.Enabled() {
 | 
						if fwdr.Enabled() {
 | 
				
			||||||
 | 
							log.F("[strategy] %s changed from Disabled to Enabled ", fwdr.Addr())
 | 
				
			||||||
		if fwdr.Priority() == d.Priority() {
 | 
							if fwdr.Priority() == d.Priority() {
 | 
				
			||||||
			d.available = append(d.available, fwdr)
 | 
								d.available = append(d.available, fwdr)
 | 
				
			||||||
		} else if fwdr.Priority() > d.Priority() {
 | 
							} else if fwdr.Priority() > d.Priority() {
 | 
				
			||||||
@ -172,6 +174,7 @@ func (d *Dialer) OnStatusChanged(fwdr *proxy.Forwarder) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !fwdr.Enabled() {
 | 
						if !fwdr.Enabled() {
 | 
				
			||||||
 | 
							log.F("[strategy] %s changed from Enabled to Disabled", fwdr.Addr())
 | 
				
			||||||
		for i, f := range d.available {
 | 
							for i, f := range d.available {
 | 
				
			||||||
			if f == fwdr {
 | 
								if f == fwdr {
 | 
				
			||||||
				d.available[i], d.available = d.available[len(d.available)-1], d.available[:len(d.available)-1]
 | 
									d.available[i], d.available = d.available[len(d.available)-1], d.available[:len(d.available)-1]
 | 
				
			||||||
@ -239,8 +242,7 @@ func (d *Dialer) check(i int) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *Dialer) scheduleRR(dstAddr string) *proxy.Forwarder {
 | 
					func (d *Dialer) scheduleRR(dstAddr string) *proxy.Forwarder {
 | 
				
			||||||
	idx := atomic.AddUint32(&d.index, 1) % uint32(len(d.available))
 | 
						return d.available[atomic.AddUint32(&d.index, 1)%uint32(len(d.available))]
 | 
				
			||||||
	return d.available[idx]
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *Dialer) scheduleHA(dstAddr string) *proxy.Forwarder {
 | 
					func (d *Dialer) scheduleHA(dstAddr string) *proxy.Forwarder {
 | 
				
			||||||
@ -263,6 +265,5 @@ func (d *Dialer) scheduleLHA(dstAddr string) *proxy.Forwarder {
 | 
				
			|||||||
func (d *Dialer) scheduleDH(dstAddr string) *proxy.Forwarder {
 | 
					func (d *Dialer) scheduleDH(dstAddr string) *proxy.Forwarder {
 | 
				
			||||||
	fnv1a := fnv.New32a()
 | 
						fnv1a := fnv.New32a()
 | 
				
			||||||
	fnv1a.Write([]byte(dstAddr))
 | 
						fnv1a.Write([]byte(dstAddr))
 | 
				
			||||||
	idx := fnv1a.Sum32() % uint32(len(d.available))
 | 
						return d.available[fnv1a.Sum32()%uint32(len(d.available))]
 | 
				
			||||||
	return d.available[idx]
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user