/
main.go
98 lines (83 loc) · 2.45 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
// Copyright (c) 2022 The Linna Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"context"
crand "crypto/rand"
"encoding/binary"
"math/rand"
"os"
"runtime"
"time"
"github.com/doublemo/linna/cores/signal"
"github.com/doublemo/linna/internal/logger"
"github.com/doublemo/linna/kits/linna"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// 定义版本信息
var (
// version 版本号
version string = "0.1.0"
// commitid 代码提交版本号
commitid string = "default"
// builddate 编译日期
builddate string = "default"
)
func main() {
// 日志
log, startupLogger := logger.Logger()
// 参数解析
config := linna.ParseArgs(log, version, commitid, builddate, os.Args)
if err := config.Check(log); err != nil {
startupLogger.Panic(err.Error())
}
// 日志重建
log, startupLogger = logger.New(log, config.Logger)
logger.Initializer(log, startupLogger)
startupLogger.Info("Linna starting")
programInfo := []zapcore.Field{
zap.String("id", ""),
zap.String("name", ""),
zap.String("version", version),
zap.String("runtime", runtime.Version()),
zap.Int("cpu", runtime.NumCPU()),
zap.Int("proc", runtime.GOMAXPROCS(0)),
}
startupLogger.Info("Node", programInfo...)
startupLogger.Info("Data directory", zap.String("path", config.Datadir))
// 随机种子
var seed int64
if err := binary.Read(crand.Reader, binary.BigEndian, &seed); err != nil {
startupLogger.Warn("failed to get strongly random seed, fallback to a less random one.", zap.Error(err))
seed = time.Now().UnixNano()
}
rand.Seed(seed)
ctx, ctxCancelFn := context.WithCancel(context.Background())
// 启动主程序
if err := linna.Serve(ctx, *config); err != nil {
log.Panic(err.Error())
}
startupLogger.Info("Startup done")
signal.Handler(ctx, func(sig signal.Command) {
switch sig {
case signal.INT, signal.TERM:
ctxCancelFn()
linna.Shutdown()
case signal.HUP:
}
})
startupLogger.Info("Linna complete")
os.Exit(0)
}