Skip to content

Commit

Permalink
other: 新版 server、logger 完善
Browse files Browse the repository at this point in the history
  • Loading branch information
kercylan98 committed Apr 2, 2024
1 parent 49b8efd commit e4eee31
Show file tree
Hide file tree
Showing 22 changed files with 1,532 additions and 72 deletions.
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ require (
)

require (
github.com/bytedance/gopkg v0.0.0-20240315062850-21fc7a1671a8 // indirect
github.com/bytedance/sonic v1.9.1 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
Expand All @@ -47,7 +49,8 @@ require (
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
github.com/klauspost/reedsolomon v1.12.0 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
Expand Down
12 changes: 12 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ github.com/RussellLuo/timingwheel v0.0.0-20220218152713-54845bda3108/go.mod h1:W
github.com/alphadose/haxmap v1.3.1 h1:KmZh75duO1tC8pt3LmUwoTYiZ9sh4K52FX8p7/yrlqU=
github.com/alphadose/haxmap v1.3.1/go.mod h1:rjHw1IAqbxm0S3U5tD16GoKsiAd8FWx5BJ2IYqXwgmM=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/bytedance/gopkg v0.0.0-20240315062850-21fc7a1671a8 h1:8LX2T6XzOOPvVMS8RH0sY4+QFmO5XyFUnrmwVbtD13k=
github.com/bytedance/gopkg v0.0.0-20240315062850-21fc7a1671a8/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
Expand All @@ -22,6 +24,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg=
Expand Down Expand Up @@ -104,9 +108,14 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
Expand Down Expand Up @@ -231,6 +240,7 @@ golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
Expand Down Expand Up @@ -259,6 +269,8 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211204120058-94396e421777/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down
1 change: 1 addition & 0 deletions server/internal/v2/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"net"
)

// ConnWriter 用于兼容不同 Network 的连接数据写入器
type ConnWriter func(packet Packet) error

type Conn interface {
Expand Down
4 changes: 0 additions & 4 deletions server/internal/v2/conn_context.go

This file was deleted.

9 changes: 9 additions & 0 deletions server/internal/v2/events.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package server

import (
"fmt"
"github.com/kercylan98/minotaur/utils/log"
"reflect"
"time"

"github.com/kercylan98/minotaur/utils/collection/listings"
Expand Down Expand Up @@ -57,6 +60,12 @@ func (s *events) RegisterLaunchedEvent(handler LaunchedEventHandler, priority ..
}

func (s *events) onLaunched() {
s.Options.getManyOptions(func(opt *Options) {
opt.logger.Info("Minotaur Server", log.String("", "============================================================================"))
opt.logger.Info("Minotaur Server", log.String("", "RunningInfo"), log.String("network", reflect.TypeOf(s.network).String()), log.String("listen", fmt.Sprintf("%s://%s%s", s.network.Schema(), s.server.state.Ip, s.network.Address())))
opt.logger.Info("Minotaur Server", log.String("", "============================================================================"))
})

_ = s.server.reactor.SystemDispatch(NativeMessage(s.server, func(srv *server) {
s.launchedEventHandlers.RangeValue(func(index int, value LaunchedEventHandler) bool {
value(s.server, s.server.state.Ip, s.server.state.LaunchedAt)
Expand Down
10 changes: 10 additions & 0 deletions server/internal/v2/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,20 @@ import (
"context"
)

// Network 提供给 Server 使用的网络接口
type Network interface {
// OnSetup 装载函数,该函数将传入 Server 的上下文及一个可用于控制 Server 行为的控制器,在该函数中应该完成 Network 实现的初始化工作
OnSetup(ctx context.Context, controller Controller) error

// OnRun 运行函数,在该函数中通常是进行网络监听启动的阻塞行为
OnRun() error

// OnShutdown 停止函数,该函数在执行的时候应该完成对资源的停止及释放
OnShutdown() error

// Schema 获取协议标识
Schema() string

// Address 获取监听地址信息
Address() string
}
8 changes: 8 additions & 0 deletions server/internal/v2/network/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,11 @@ func (h *httpCore[H]) OnShutdown() error {
defer cancel()
return h.srv.Shutdown(ctx)
}

func (h *httpCore[H]) Schema() string {
return "http(s)"
}

func (h *httpCore[H]) Address() string {
return h.srv.Addr
}
11 changes: 11 additions & 0 deletions server/internal/v2/network/websocket.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,14 @@ func (w *websocketCore) OnShutdown() error {
}
return nil
}

func (w *websocketCore) Schema() string {
return "ws"
}

func (w *websocketCore) Address() string {
if w.pattern == "/" {
return w.addr
}
return fmt.Sprintf("%s:%s", w.addr, w.pattern)
}
120 changes: 80 additions & 40 deletions server/internal/v2/options.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package server

import (
"github.com/kercylan98/minotaur/utils/log/v2"
"sync"
"time"
)
Expand All @@ -11,24 +12,27 @@ func NewOptions() *Options {

func DefaultOptions() *Options {
return &Options{
ServerMessageChannelSize: 1024 * 4,
ActorMessageChannelSize: 1024,
ServerMessageBufferInitialSize: 1024,
ActorMessageBufferInitialSize: 1024,
MessageErrorHandler: nil,
LifeCycleLimit: 0,
serverMessageChannelSize: 1024 * 4,
actorMessageChannelSize: 1024,
serverMessageBufferInitialSize: 1024,
actorMessageBufferInitialSize: 1024,
messageErrorHandler: nil,
lifeCycleLimit: 0,
logger: log.GetLogger(),
}
}

type Options struct {
server *server
rw sync.RWMutex
ServerMessageChannelSize int // 服务器 Actor 消息处理管道大小
ActorMessageChannelSize int // Actor 消息处理管道大小
ServerMessageBufferInitialSize int // 服务器 Actor 消息写入缓冲区初始化大小
ActorMessageBufferInitialSize int // Actor 消息写入缓冲区初始化大小
MessageErrorHandler func(srv Server, message Message, err error) // 消息错误处理器
LifeCycleLimit time.Duration // 服务器生命周期上限,在服务器启动后达到生命周期上限将关闭服务器
serverMessageChannelSize int // 服务器 Actor 消息处理管道大小
actorMessageChannelSize int // Actor 消息处理管道大小
serverMessageBufferInitialSize int // 服务器 Actor 消息写入缓冲区初始化大小
actorMessageBufferInitialSize int // Actor 消息写入缓冲区初始化大小
messageErrorHandler func(srv Server, message Message, err error) // 消息错误处理器
lifeCycleLimit time.Duration // 服务器生命周期上限,在服务器启动后达到生命周期上限将关闭服务器
logger *log.Logger // 日志记录器
debug bool // Debug 模式
}

func (opt *Options) init(srv *server) *Options {
Expand All @@ -42,12 +46,13 @@ func (opt *Options) Apply(options ...*Options) {
for _, option := range options {
option.rw.RLock()

opt.ServerMessageChannelSize = option.ServerMessageChannelSize
opt.ActorMessageChannelSize = option.ActorMessageChannelSize
opt.ServerMessageBufferInitialSize = option.ServerMessageBufferInitialSize
opt.ActorMessageBufferInitialSize = option.ActorMessageBufferInitialSize
opt.MessageErrorHandler = option.MessageErrorHandler
opt.LifeCycleLimit = option.LifeCycleLimit
opt.serverMessageChannelSize = option.serverMessageChannelSize
opt.actorMessageChannelSize = option.actorMessageChannelSize
opt.serverMessageBufferInitialSize = option.serverMessageBufferInitialSize
opt.actorMessageBufferInitialSize = option.actorMessageBufferInitialSize
opt.messageErrorHandler = option.messageErrorHandler
opt.lifeCycleLimit = option.lifeCycleLimit
opt.logger = option.logger

option.rw.RUnlock()
}
Expand All @@ -57,74 +62,104 @@ func (opt *Options) Apply(options ...*Options) {
}

func (opt *Options) active() {
opt.server.notify.lifeCycleTime <- opt.getLifeCycleLimit()
opt.server.notify.lifeCycleTime <- opt.GetLifeCycleLimit()
}

// WithDebug 设置 Debug 模式是否开启
// - 该函数支持运行时设置
func (opt *Options) WithDebug(debug bool) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.debug = true
})
}

// IsDebug 获取当前服务器是否是 Debug 模式
func (opt *Options) IsDebug() bool {
return getOptionsValue(opt, func(opt *Options) bool {
return opt.debug
})
}

// WithLogger 设置服务器的日志记录器
// - 该函数支持运行时设置
func (opt *Options) WithLogger(logger *log.Logger) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.logger = logger
})
}

// GetLogger 获取服务器的日志记录器
func (opt *Options) GetLogger() *log.Logger {
return getOptionsValue(opt, func(opt *Options) *log.Logger {
return opt.logger
})
}

// WithServerMessageChannelSize 设置服务器 Actor 用于处理消息的管道大小,当管道由于逻辑阻塞而导致满载时,会导致新消息无法及时从缓冲区拿出,从而增加内存的消耗,但是并不会影响消息的写入
func (opt *Options) WithServerMessageChannelSize(size int) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.ServerMessageChannelSize = size
opt.serverMessageChannelSize = size
})
}

func (opt *Options) getServerMessageChannelSize() int {
func (opt *Options) GetServerMessageChannelSize() int {
return getOptionsValue(opt, func(opt *Options) int {
return opt.ServerMessageChannelSize
return opt.serverMessageChannelSize
})
}

// WithActorMessageChannelSize 设置 Actor 用于处理消息的管道大小,当管道由于逻辑阻塞而导致满载时,会导致新消息无法及时从缓冲区拿出,从而增加内存的消耗,但是并不会影响消息的写入
func (opt *Options) WithActorMessageChannelSize(size int) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.ActorMessageChannelSize = size
opt.actorMessageChannelSize = size
})
}

func (opt *Options) getActorMessageChannelSize() int {
func (opt *Options) GetActorMessageChannelSize() int {
return getOptionsValue(opt, func(opt *Options) int {
return opt.ActorMessageChannelSize
return opt.actorMessageChannelSize
})
}

// WithServerMessageBufferInitialSize 设置服务器 Actor 消息环形缓冲区 buffer.Ring 的初始大小,适当的值可以避免频繁扩容
// - 由于扩容是按照当前大小的 2 倍进行扩容,过大的值也可能会导致内存消耗过高
func (opt *Options) WithServerMessageBufferInitialSize(size int) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.ServerMessageBufferInitialSize = size
opt.serverMessageBufferInitialSize = size
})
}

func (opt *Options) getServerMessageBufferInitialSize() int {
func (opt *Options) GetServerMessageBufferInitialSize() int {
return getOptionsValue(opt, func(opt *Options) int {
return opt.ServerMessageBufferInitialSize
return opt.serverMessageBufferInitialSize
})
}

// WithActorMessageBufferInitialSize 设置 Actor 消息环形缓冲区 buffer.Ring 的初始大小,适当的值可以避免频繁扩容
// - 由于扩容是按照当前大小的 2 倍进行扩容,过大的值也可能会导致内存消耗过高
func (opt *Options) WithActorMessageBufferInitialSize(size int) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.ActorMessageBufferInitialSize = size
opt.actorMessageBufferInitialSize = size
})
}

func (opt *Options) getActorMessageBufferInitialSize() int {
func (opt *Options) GetActorMessageBufferInitialSize() int {
return getOptionsValue(opt, func(opt *Options) int {
return opt.ActorMessageBufferInitialSize
return opt.actorMessageBufferInitialSize
})
}

// WithMessageErrorHandler 设置消息错误处理器,当消息处理出现错误时,会调用该处理器进行处理
// - 如果在运行时设置,后续消息错误将会使用新的 handler 进行处理
func (opt *Options) WithMessageErrorHandler(handler func(srv Server, message Message, err error)) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.MessageErrorHandler = handler
opt.messageErrorHandler = handler
})
}

func (opt *Options) getMessageErrorHandler() func(srv Server, message Message, err error) {
func (opt *Options) GetMessageErrorHandler() func(srv Server, message Message, err error) {
return getOptionsValue(opt, func(opt *Options) func(srv Server, message Message, err error) {
return opt.MessageErrorHandler
return opt.messageErrorHandler
})
}

Expand All @@ -133,7 +168,7 @@ func (opt *Options) getMessageErrorHandler() func(srv Server, message Message, e
// - 该函数支持运行时设置
func (opt *Options) WithLifeCycleLimit(limit time.Duration) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
opt.LifeCycleLimit = limit
opt.lifeCycleLimit = limit
})
}

Expand All @@ -144,17 +179,16 @@ func (opt *Options) WithLifeCycleEnd(end time.Time) *Options {
return opt.modifyOptionsValue(func(opt *Options) {
now := time.Now()
if end.Before(now) {
opt.LifeCycleLimit = 0
opt.lifeCycleLimit = 0
return
}
opt.LifeCycleLimit = end.Sub(now)
opt.lifeCycleLimit = end.Sub(now)
})
}

// getLifeCycleLimit 获取服务器生命周期上限
func (opt *Options) getLifeCycleLimit() time.Duration {
func (opt *Options) GetLifeCycleLimit() time.Duration {
return getOptionsValue(opt, func(opt *Options) time.Duration {
return opt.LifeCycleLimit
return opt.lifeCycleLimit
})
}

Expand All @@ -165,6 +199,12 @@ func (opt *Options) modifyOptionsValue(handler func(opt *Options)) *Options {
return opt
}

func (opt *Options) getManyOptions(handler func(opt *Options)) {
opt.rw.RLock()
defer opt.rw.RUnlock()
handler(opt)
}

func getOptionsValue[V any](opt *Options, handler func(opt *Options) V) V {
opt.rw.RLock()
defer opt.rw.RUnlock()
Expand Down
Loading

0 comments on commit e4eee31

Please sign in to comment.