Skip to content

Instantly share code, notes, and snippets.

@btwiuse
Created February 13, 2020 14:44
Show Gist options
  • Select an option

  • Save btwiuse/50e3fb47946795fd9835480c28fc00e7 to your computer and use it in GitHub Desktop.

Select an option

Save btwiuse/50e3fb47946795fd9835480c28fc00e7 to your computer and use it in GitHub Desktop.
package main
import (
"io"
"log"
"math/rand"
"net"
"time"
)
func main() {
port := ":3632"
log.Println("listening on", port)
ln, err := net.Listen("tcp", port)
if err != nil {
log.Fatalln(err)
}
for {
conn, err := ln.Accept()
if err != nil {
log.Println(err)
continue
}
lb(getBackends)(conn)
}
}
type backender func() []string
func getBackends() []string {
backends := []string{
":6011",
":6012",
":6013",
":6014",
}
return backends
}
func lb(br backender) func(net.Conn) {
return func(conn net.Conn) {
var (
be = br()
ep = ""
err error
remote net.Conn
)
if len(be) == 0 {
log.Println("Error: backend list empty")
return
}
{
s := rand.NewSource(time.Now().UnixNano())
r := rand.New(s) // initialize local pseudorandom generator
idx := r.Intn(len(be))
ep = be[idx]
}
log.Println(conn.RemoteAddr(), "<=>", ep)
//
remote, err = net.Dial("tcp", ep)
if err != nil {
log.Println(err)
return
}
go func() {
io.Copy(conn, remote)
}()
go func() {
io.Copy(remote, conn)
}()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment