File tree Expand file tree Collapse file tree 5 files changed +93
-8
lines changed
Expand file tree Collapse file tree 5 files changed +93
-8
lines changed Original file line number Diff line number Diff line change @@ -101,6 +101,30 @@ forwarding to "localhost:8003"
101101forwarding to " localhost:8004"
102102forwarding to " localhost:8000"
103103```
104+ You can also use the loadbalancer to redirect traffic to external servers. Create <b >servers.json</b > in the root directory
105+ of the project and specify servers (add weights if you want to use Weighted Round Robin).
106+ ``` json
107+ [
108+ {
109+ "addr" : " https://facebook.com" ,
110+ "weight" : 2
111+ },
112+ {
113+ "addr" : " https://twitch.tv" ,
114+ "weight" : 1
115+ },
116+ {
117+ "addr" : " https://google.com" ,
118+ "weight" : 3
119+ }
120+ ]
121+ ```
122+ Then simply pass <b >-env</b > flag. It accepts "local" and "external" where "local" will start local servers
123+ and "external" will read the JSON file.
124+
125+ ``` bash
126+ make build && ./lb -method wrr -env external
127+ ```
104128Customization
105129Number of Servers: You can modify the number of servers spawned by changing the <b >-amount</b > flag value.
106130Ports: The backend servers listen on ports 8000 and higher. You can modify the port range in the Spawner function.
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "encoding/json"
5+ "io"
6+ "log"
7+ "os"
8+ "strconv"
9+ )
10+
11+ type ExternalServer struct {
12+ Addr string `json:"addr"`
13+ Weight int `json:"weight"`
14+ }
15+
16+ func ReadJson () []LbServer {
17+ file , err := os .Open ("servers.json" )
18+ if err != nil {
19+ log .Fatalf ("Failed to load servers from JSON file %v" , err )
20+ }
21+ defer file .Close ()
22+
23+ byteVal , err := io .ReadAll (file )
24+ if err != nil {
25+ log .Fatalf ("Failed to read file: %v" , err )
26+ }
27+
28+ var servers []ExternalServer
29+ err = json .Unmarshal (byteVal , & servers )
30+ if err != nil {
31+ log .Fatalf ("Failed to unmarshal JSON: %v" , err )
32+ }
33+ res := make ([]LbServer , 0 , len (servers ))
34+ for k , s := range servers {
35+ lbServer := NewLbServer (s .Addr , s .Weight )
36+ lbServer .name = strconv .Itoa (k )
37+ res = append (res , * lbServer )
38+ }
39+
40+ return res
41+ }
Original file line number Diff line number Diff line change @@ -41,31 +41,30 @@ func NewLbServer(addr string, weight int) *LbServer {
4141 os .Exit (1 )
4242 }
4343 return & LbServer {
44- addr : addr ,
45- proxy : httputil .NewSingleHostReverseProxy (serverUrl ),
46- weight : weight ,
47- current : 0 ,
44+ addr : addr ,
45+ proxy : httputil .NewSingleHostReverseProxy (serverUrl ),
46+ weight : weight ,
4847 }
4948}
5049
5150type LoadBalancer struct {
5251 port string
5352 roundRobinCount int
5453 servers []LbServer
55- weidhted bool
54+ weighted bool
5655}
5756
5857func NewLoadBalancer (port string , servers []LbServer , weighted bool ) * LoadBalancer {
5958 return & LoadBalancer {
6059 port : port ,
6160 roundRobinCount : 0 ,
6261 servers : servers ,
63- weidhted : weighted ,
62+ weighted : weighted ,
6463 }
6564}
6665
6766func (lb * LoadBalancer ) GetNextAvailableServer () LbServer {
68- if lb .weidhted {
67+ if lb .weighted {
6968 return lb .getWeightedServer ()
7069 }
7170 return lb .getRoundRobinServer ()
Original file line number Diff line number Diff line change @@ -10,8 +10,15 @@ import (
1010func main () {
1111 nFlag := flag .Int ("amount" , 1234 , "Enter amount of local servers to be spawned" )
1212 method := flag .String ("method" , "rr" , "Load balancing method: 'rr - Round Robin | wrr - Weighted Round Robin" )
13+ env := flag .String ("env" , "local" , "Specify wether local servers should be started or provide JSON file with addresses of external servers. " )
1314 flag .Parse ()
14- servers := Spawner (* nFlag )
15+ var servers []LbServer
16+ switch * env {
17+ case "external" :
18+ servers = ReadJson ()
19+ case "local" :
20+ servers = Spawner (* nFlag )
21+ }
1522 var lb * LoadBalancer
1623 switch * method {
1724 case "wrr" :
Original file line number Diff line number Diff line change 1+ [
2+ {
3+ "addr" : " https://facebook.com" ,
4+ "weight" : 2
5+ },
6+ {
7+ "addr" : " https://twitch.tv" ,
8+ "weight" : 1
9+ },
10+ {
11+ "addr" : " https://google.com" ,
12+ "weight" : 3
13+ }
14+ ]
You can’t perform that action at this time.
0 commit comments