Skip to content

Commit 5cfcc0e

Browse files
author
SamSyntax
committed
Adding external servers balancing
1 parent 25e06e8 commit 5cfcc0e

File tree

5 files changed

+93
-8
lines changed

5 files changed

+93
-8
lines changed

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,30 @@ forwarding to "localhost:8003"
101101
forwarding to "localhost:8004"
102102
forwarding 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+
```
104128
Customization
105129
Number of Servers: You can modify the number of servers spawned by changing the <b>-amount</b> flag value.
106130
Ports: The backend servers listen on ports 8000 and higher. You can modify the port range in the Spawner function.

json.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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+
}

loadbalancer.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff 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

5150
type LoadBalancer struct {
5251
port string
5352
roundRobinCount int
5453
servers []LbServer
55-
weidhted bool
54+
weighted bool
5655
}
5756

5857
func 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

6766
func (lb *LoadBalancer) GetNextAvailableServer() LbServer {
68-
if lb.weidhted {
67+
if lb.weighted {
6968
return lb.getWeightedServer()
7069
}
7170
return lb.getRoundRobinServer()

main.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,15 @@ import (
1010
func 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":

servers.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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+
]

0 commit comments

Comments
 (0)