-
Notifications
You must be signed in to change notification settings - Fork 3
/
best-practise.go
100 lines (87 loc) · 2.37 KB
/
best-practise.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
package main
import (
"flag"
"fmt"
"net"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/heyHui2018/log"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"github.com/heyHui2018/best-practise/base"
"github.com/heyHui2018/best-practise/controller/rpc"
"github.com/heyHui2018/best-practise/middleWare"
"github.com/heyHui2018/best-practise/pb"
"github.com/heyHui2018/best-practise/routers"
"github.com/heyHui2018/best-practise/service/cron"
"github.com/heyHui2018/best-practise/service/etcd"
"github.com/heyHui2018/best-practise/service/rabbitMQ"
"github.com/heyHui2018/best-practise/service/stop"
)
func main() {
flag.Parse() // 用于优雅重启
base.ConfigInit()
base.LogInit()
base.DbInit()
rabbitMQ.MQInit()
etcd.EtcdInit()
cron.CronInit()
// nsq.NsqInit()
// kafka.KafkaInit()
g := routers.InitRouter()
g.Use(middleWare.Cors()) // 支持跨域
var err error
var opts []grpc.ServerOption
// TLS
// c := tls.TLS()
// c := tls.CATLS()
// opts = append(opts, grpc.Creds(c))
// 拦截器
// opts = append(opts, grpc_middleware.WithUnaryServerChain(middleWare.LoggingInterceptor, middleWare.RecoveryInterceptor))
// rpc
rpcPort := fmt.Sprintf(":%d", base.GetConfig().Server.RpcPort)
listen, err := net.Listen("tcp", rpcPort)
if err != nil {
log.Fatalf("failed to listen,err = %v", err)
}
s := grpc.NewServer(opts...)
pb.RegisterGetServer(s, &rpc.Server{})
pb.RegisterUserServer(s, &rpc.Server{})
reflection.Register(s)
go s.Serve(listen)
log.Infof("rpc start listening on %v", rpcPort)
// http
httpPort := fmt.Sprintf(":%d", base.GetConfig().Server.HttpPort)
var listener net.Listener
if *stop.Graceful {
f := os.NewFile(3, "")
listener, err = net.FileListener(f)
} else {
listener, err = net.Listen("tcp", httpPort)
}
if err != nil {
log.Fatalf("failed to listen,err = %v", err)
}
server := &http.Server{
Addr: httpPort,
Handler: g,
}
go server.Serve(listener)
log.Infof("http start listening on %v", httpPort)
signs := make(chan os.Signal)
signal.Notify(signs, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGINT)
for {
select {
case sign := <-signs:
log.Infof("Receive signal: %v", sign)
// 此处设置的sign配置可根据实际情况修改
if sign == syscall.SIGKILL || sign == syscall.SIGTERM || sign == syscall.SIGINT {
stop.Stop(server)
} else {
stop.Restart(server, listener)
}
}
}
}