Skip to content

Instantly share code, notes, and snippets.

@ahmetanbar
Created April 23, 2020 20:14
Show Gist options
  • Save ahmetanbar/d5d93ab0256b1505f0d4cbfc74c544db to your computer and use it in GitHub Desktop.
Save ahmetanbar/d5d93ab0256b1505f0d4cbfc74c544db to your computer and use it in GitHub Desktop.
Golang Load Balancing code practice via: https://www.youtube.com/watch?v=QTBZxDgRZM0
package main
import (
"fmt"
"io"
"log"
"net"
)
var (
counter int
// TODO configurable
listenAddr = "localhost:8080"
// TODO configurable
server = []string {
"localhost:5001",
"localhost:5002",
"localhost:5003",
}
)
func main() {
listener, err := net.Listen("tcp", listenAddr)
if err != nil {
log.Fatal("failed to listen: %s", err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
log.Printf("failed to accept connection: %v", err)
}
backend := chooseBackend()
fmt.Printf("counter=%d, backend=%s", counter, backend)
go func() {
err := proxy(backend, conn)
if err != nil {
log.Printf("WARNING: proxing failed: %v", err)
}
}()
}
}
func proxy(backend string, c net.Conn) error {
bc, err := net.Dial("tcp", backend)
if err != nil {
return fmt.Errorf("failed to connect to backend %s: %v", backend, err);
}
// c -> bc
go io.Copy(bc, c)
// bc -> c
go io.Copy(c, bc)
return nil
}
func chooseBackend() string{
s := server[counter%len(server)]
counter++
return s
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment