Skip to content

Commit 3c4392a

Browse files
committed
feature ✨ 优化server manager
1 parent 1904637 commit 3c4392a

File tree

3 files changed

+84
-16
lines changed

3 files changed

+84
-16
lines changed

Diff for: server/listener/options.go

+16-1
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,32 @@ type Option func(*options)
1717
type options struct {
1818
addr, certFile, keyFile string
1919
handler http.Handler
20+
startedHook func()
21+
endHook func()
2022
}
2123

2224
func setDefaultOption() options {
2325
return options{
2426
addr: ":8080",
2527
handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
26-
_, _ = w.Write([]byte("ok"))
28+
w.WriteHeader(http.StatusOK)
2729
}),
2830
}
2931
}
3032

33+
func WithEndHook(f func()) Option {
34+
return func(o *options) {
35+
o.endHook = f
36+
}
37+
}
38+
39+
// WithStartedHook 设置启动回调函数
40+
func WithStartedHook(f func()) Option {
41+
return func(o *options) {
42+
o.startedHook = f
43+
}
44+
}
45+
3146
// WithAddr 设置addr
3247
func WithAddr(s string) Option {
3348
return func(o *options) {

Diff for: server/listener/server.go

+51-13
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,46 @@ func New(name string, opts ...Option) server.Runnable {
3636
}
3737

3838
// NewMetrics 新建默认监控服务
39-
func NewMetrics(name string, opts ...Option) server.Runnable {
39+
func NewMetrics(opts ...Option) server.Runnable {
4040
s := &Server{
41-
name: name,
41+
name: "metrics",
4242
opts: setDefaultOption(),
4343
}
4444
s.opts.addr = ":3000"
45-
s.opts.handler = promhttp.Handler()
45+
h := http.NewServeMux()
46+
h.Handle("/metrics", promhttp.Handler())
47+
s.opts.handler = h
4648
s.Options(opts...)
4749
return s
4850
}
4951

50-
// NewHealth 默认健康检查服务
51-
func NewHealth(name string, opts ...Option) server.Runnable {
52+
// NewHealthz 默认健康检查服务
53+
func NewHealthz(opts ...Option) server.Runnable {
5254
s := &Server{
53-
name: name,
55+
name: "healthz",
5456
opts: setDefaultOption(),
5557
}
5658
s.opts.addr = ":4000"
57-
s.opts.handler = http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
58-
_, _ = w.Write([]byte("ok"))
59+
h := http.NewServeMux()
60+
h.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) {
61+
w.WriteHeader(http.StatusOK)
62+
})
63+
s.opts.handler = h
64+
s.Options(opts...)
65+
return s
66+
}
67+
68+
func NewReadyz(opts ...Option) server.Runnable {
69+
s := &Server{
70+
name: "readyz",
71+
opts: setDefaultOption(),
72+
}
73+
s.opts.addr = ":2000"
74+
h := http.NewServeMux()
75+
h.HandleFunc("/readyz", func(w http.ResponseWriter, _ *http.Request) {
76+
w.WriteHeader(http.StatusOK)
5977
})
78+
s.opts.handler = h
6079
s.Options(opts...)
6180
return s
6281
}
@@ -81,14 +100,33 @@ func (e *Server) Start(ctx context.Context) error {
81100
e.ctx = ctx
82101
e.started = true
83102
e.srv = &http.Server{Handler: e.opts.handler}
84-
log.Infof("%e Server listening on %e", e.name, l.Addr().String())
103+
if e.opts.endHook != nil {
104+
e.srv.RegisterOnShutdown(e.opts.endHook)
105+
}
106+
e.srv.BaseContext = func(_ net.Listener) context.Context {
107+
return ctx
108+
}
109+
log.Infof("%s Server listening on %s", e.name, l.Addr().String())
85110
go func() {
86-
if err = e.srv.Serve(l); err != nil {
87-
log.Errorf("%e gRPC Server start error: %e", e.name, err.Error())
111+
if e.opts.keyFile == "" || e.opts.certFile == "" {
112+
if err = e.srv.Serve(l); err != nil {
113+
log.Errorf("%s Server start error: %s", e.name, err.Error())
114+
}
115+
} else {
116+
if err = e.srv.ServeTLS(l, e.opts.certFile, e.opts.keyFile); err != nil {
117+
log.Errorf("%s Server start error: %s", e.name, err.Error())
118+
}
119+
}
120+
<-ctx.Done()
121+
err = e.Shutdown(ctx)
122+
if err != nil {
123+
log.Errorf("%S Server shutdown error: %s", e.name, err.Error())
88124
}
89125
}()
90-
<-ctx.Done()
91-
return e.Shutdown(ctx)
126+
if e.opts.startedHook != nil {
127+
e.opts.startedHook()
128+
}
129+
return nil
92130
}
93131

94132
// Attempt 判断是否可以启动

Diff for: server/server.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,31 @@ func (e *Server) Add(r ...Runnable) {
5555
}
5656

5757
// Start start runnable
58-
func (e *Server) Start(ctx context.Context) error {
58+
func (e *Server) Start(ctx context.Context) (err error) {
5959
e.mutex.Lock()
6060
defer e.mutex.Unlock()
61-
e.internalCtx = ctx
61+
e.internalCtx, e.internalCancel = context.WithCancel(ctx)
62+
stopComplete := make(chan struct{})
63+
defer close(stopComplete)
64+
defer func() {
65+
stopErr := e.engageStopProcedure(stopComplete)
66+
if stopErr != nil {
67+
if err != nil {
68+
err = fmt.Errorf("%s, %w", stopErr.Error(), err)
69+
} else {
70+
err = stopErr
71+
}
72+
}
73+
}()
74+
e.errChan = make(chan error)
75+
6276
for k := range e.services {
6377
if !e.services[k].Attempt() {
6478
//先判断是否可以启动
6579
return errors.New("can't accept new runnable as stop procedure is already engaged")
6680
}
6781
}
82+
//按顺序启动
6883
for k := range e.services {
6984
e.startRunnable(e.services[k])
7085
}

0 commit comments

Comments
 (0)