generated from calmato/project-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexec.go
130 lines (112 loc) · 2.73 KB
/
exec.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package admin
import (
"context"
"os"
"os/signal"
"syscall"
"time"
config "github.com/calmato/gran-book/api/config/gateway/admin"
"github.com/calmato/gran-book/api/pkg/cors"
"github.com/calmato/gran-book/api/pkg/firebase"
"github.com/calmato/gran-book/api/pkg/firebase/authentication"
"github.com/calmato/gran-book/api/pkg/log"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"golang.org/x/sync/errgroup"
"google.golang.org/api/option"
)
//nolint:funlen
func Exec() error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
env, err := config.LoadEnvironment()
if err != nil {
return err
}
// Loggerの設定
logger, err := log.NewLogger(env.LogPath, env.LogLevel)
if err != nil {
return err
}
// Firebaseの設定
opt := option.WithCredentialsJSON([]byte(env.GCPServiceKeyJSON))
fb, err := firebase.InitializeApp(ctx, nil, opt)
if err != nil {
return err
}
// Firebase Authenticationの設定
fa, err := authentication.NewClient(ctx, fb.App)
if err != nil {
return err
}
opts := []gin.HandlerFunc{gin.Recovery()}
// Logger設定
lm, err := log.NewGinMiddleware(env.LogPath, env.LogLevel)
if err != nil {
return err
}
opts = append(opts, lm)
// CORS設定
cm, err := cors.NewGinMiddleware()
if err != nil {
return err
}
opts = append(opts, cm)
// 依存関係の解決
p := ¶ms{
Insecure: env.GRPCInsecure,
FirebaseAuth: fa,
AdminServiceURL: env.AdminServiceURL,
AuthServiceURL: env.AuthServiceURL,
BookServiceURL: env.BookServiceURL,
UserServiceURL: env.UserServiceURL,
}
reg, err := newRegistry(p)
if err != nil {
return err
}
// Metrics Serverの設定取得
ms := newMetricsServer(ctx, env.MetricsPort)
// HTTP Serverの設定取得
rt := newRouter(reg, opts...)
hs := newHTTPServer(ctx, env.Port, rt)
// HTTP Server, Metrics Serverの起動
eg, ectx := errgroup.WithContext(ctx)
eg.Go(func() (err error) {
err = ms.Serve()
if err != nil {
logger.Error("Failed to run metrics server", zap.Error(err))
}
return
})
eg.Go(func() (err error) {
err = hs.Serve()
if err != nil {
logger.Error("Failed to run http server", zap.Error(err))
}
return
})
logger.Info("Started server", zap.String("port", env.Port))
// シグナル検知設定
signalCh := make(chan os.Signal, 1)
signal.Notify(signalCh, syscall.SIGTERM, syscall.SIGINT)
select {
case <-ectx.Done():
logger.Error("Done context", zap.Error(ectx.Err()))
case <-signalCh:
logger.Info("Received signal")
delay := 20 * time.Second
logger.Info("Pre-shutdown", zap.String("delay", delay.String()))
time.Sleep(delay)
}
logger.Info("Shutdown...")
err = hs.Stop()
if err != nil {
return err
}
err = ms.Stop()
if err != nil {
return err
}
return eg.Wait()
}