Newer
Older
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
100
101
102
103
104
105
106
package main
import (
"context"
"fmt"
"log"
"log/slog"
"os"
"os/signal"
"syscall"
"time"
"webservice/configuration"
"webservice/routing"
"webservice/state"
"github.com/gofiber/fiber/v2"
)
func main() {
config, err := configuration.New()
if err != nil {
slog.Error( fmt.Sprintf( "HTTP server failed to start: %v", err ) )
os.Exit( 1 )
}
level, _ := config.GetLogLevel()
slog.SetDefault(
slog.New(
slog.NewTextHandler(
os.Stdout,
&slog.HandlerOptions{
Level: level,
},
),
),
)
server := fiber.New( fiber.Config{
AppName: "webservice",
DisableStartupMessage: config.Environment != "development",
BodyLimit: configuration.BODY_SIZE_LIMIT,
})
var store state.Store
if len( config.DatabaseHost ) <= 0 {
store = state.NewEphemeralStore()
} else {
store = state.NewPersistentStore( config )
}
var isHealthy = false
err = routing.SetRoutes( server, config, store, &isHealthy )
if err != nil {
slog.Error( fmt.Sprintf( "HTTP server failed to start: %v", err ) )
os.Exit( 1 )
}
go func(){
err := server.Listen( fmt.Sprintf( "%s:%d", config.Host, config.Port ) )
if err != nil {
slog.Error( fmt.Sprintf( "HTTP server failed to start: %v", err ) )
os.Exit( 1 )
}
}()
osSignaling := make( chan os.Signal, 1 )
signal.Notify( osSignaling, syscall.SIGHUP )
signal.Notify( osSignaling, syscall.SIGINT )
signal.Notify( osSignaling, syscall.SIGTERM )
signal.Notify( osSignaling, syscall.SIGQUIT )
shuttingDown := context.TODO()
isHealthy = true
if config.Environment != "development" {
log.Println( "HTTP server started successfully" )
}
for {
select {
case <-osSignaling:
isHealthy = false
log.Println( "Gracefully shutting down HTTP server" )
var concludeShutdown context.CancelFunc
shuttingDown, concludeShutdown = context.WithTimeout(
context.Background(),
time.Second * 15,
)
err := server.ShutdownWithContext( shuttingDown )
if err != nil {
log.Printf( "HTTP server failed to shut down: %v", err )
}
err = store.Disconnect()
if err != nil {
log.Printf( "Store failed to disconnect: %v", err )
}
concludeShutdown()
case <-shuttingDown.Done():
return
}
}
}