/
main.go
99 lines (82 loc) · 2.21 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main
import (
"fmt"
"geo-distributed-message-broker/api"
"geo-distributed-message-broker/config"
"geo-distributed-message-broker/data"
"geo-distributed-message-broker/services"
"log/slog"
"os"
"os/signal"
"syscall"
"time"
"github.com/lmittmann/tint"
)
func main() {
// Logger
configureLogger()
// Config
cfg, err := config.NewConfig()
if err != nil {
slog.Error("Failed to load config", "error", err.Error())
return
}
// Database
db, err := data.NewDB(cfg)
if err != nil {
slog.Error("Failed to create database connection", "error", err.Error())
return
}
repo := data.NewRepository(db)
broker := services.NewBrokerService(repo)
consensus := services.NewConsensusService(cfg, broker)
// Broker Server
brokerSrv, brokerListener, err := api.NewBrokerServer(cfg, broker, consensus)
if err != nil {
slog.Error("Failed to create broker server", "error", err.Error())
return
}
slog.Info(fmt.Sprintf("Starting broker server on port %s 🚀", cfg.BrokerPort))
go func() {
if err := brokerSrv.Serve(brokerListener); err != nil {
slog.Error("Failed to start broker server", "error", err.Error())
return
}
}()
// Node Server
nodeSrv, nodeListener, err := api.NewNodeServer(cfg, consensus)
if err != nil {
slog.Error("Failed to create node server", "error", err.Error())
return
}
slog.Info(fmt.Sprintf("Starting node server on port %s 🚀", cfg.NodePort))
go func() {
if err := nodeSrv.Serve(nodeListener); err != nil {
slog.Error("Failed to start node server", "error", err.Error())
return
}
}()
// Graceful shutdown
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM, syscall.SIGSEGV)
<-quit
slog.Warn("Shutting down server ⛔")
// Shutdown broker server
brokerSrv.GracefulStop()
// Shutdown node server
nodeSrv.GracefulStop()
// Close DB connection
if err := data.CloseDB(db); err != nil {
slog.Error("Failed to close database connection", "error", err.Error())
return
}
slog.Info("Server successful shutdown ✅")
}
func configureLogger() {
var handler slog.Handler = tint.NewHandler(os.Stdout, &tint.Options{
Level: slog.LevelDebug,
TimeFormat: time.RFC3339,
})
l := slog.New(handler)
slog.SetDefault(l)
}