From: qydysky Date: Tue, 22 Oct 2024 12:52:54 +0000 (+0800) Subject: 1 X-Git-Tag: v0.1.20241022125502 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=2d91ad2d703da1753bb415463ab3289a0a989c23;p=front%2F.git 1 --- diff --git a/README.md b/README.md index fb5f2cf..69b761d 100755 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ 这是一个简单的http/https/ws/wss均衡负载、故障转移路由/代理,通过定时刷新配置不中断地: +- 监听占用等待 - 动态后端 - 路径继承 - 自定权重 @@ -19,12 +20,12 @@ config: - *addr*: string 监听端口 例:`0.0.0.0:8081` -- *matchRule*: string 匹配规则 `prefix`:当未匹配到时,返回最近的/匹配, `all`:当未匹配到时,返回404 +- *matchRule*: string 匹配规则,默认`prefix`。 `prefix`:当未匹配到时,返回最近的/匹配, `all`:当未匹配到时,返回404 - *copyBlocks*: int 转发的块数量,默认`1000` - *retryBlocks*: {} 重试 - *sizeB*: int 重试的块大小,默认`1000000` - *num*: int 重试的块数量,默认`1000`,为`-1`时停用重试 -- *tls*: {} 启用tls +- *tls*: {} 启用tls, 默认空 - *pub*: string 公钥pem路径 - *key*: string 私钥pem路径 - routes: [] 路由 diff --git a/config.go b/config.go index f327e62..11eacf6 100755 --- a/config.go +++ b/config.go @@ -51,14 +51,6 @@ func (t *Config) Run(ctx context.Context, logger Logger) { _ = done() }() - var matchfunc func(path string) (func(w http.ResponseWriter, r *http.Request), bool) - switch t.MatchRule { - case "all": - matchfunc = t.routeP.Load - default: - matchfunc = t.routeP.LoadPerfix - } - httpSer := http.Server{ Addr: t.Addr, BaseContext: func(l net.Listener) context.Context { return ctx }, @@ -89,13 +81,49 @@ func (t *Config) Run(ctx context.Context, logger Logger) { t.RetryBlocksI = pslice.NewBlocks[byte](t.RetryBlocks.SizeB, t.RetryBlocks.Num) } - syncWeb := pweb.NewSyncMap(&httpSer, &t.routeP, matchfunc) - defer syncWeb.Shutdown() + defer logger.Info(`I:`, fmt.Sprintf("%v shutdown", t.Addr)) + + defer t.startServer(ctx, logger, &httpSer)() t.SwapSign(ctx, logger) logger.Info(`I:`, fmt.Sprintf("%v running", t.Addr)) <-ctx.Done() - logger.Info(`I:`, fmt.Sprintf("%v shutdown", t.Addr)) +} + +func (t *Config) startServer(ctx context.Context, logger Logger, conf *http.Server) (shutdown func(ctx ...context.Context)) { + shutdown = func(ctx ...context.Context) {} + + var matchfunc func(path string) (func(w http.ResponseWriter, r *http.Request), bool) + switch t.MatchRule { + case "all": + matchfunc = t.routeP.Load + default: + matchfunc = t.routeP.LoadPerfix + } + + var notice = sync.OnceFunc(func() { + logger.Warn(`W:`, `Address already in use. Wait Release...`) + }) + + timer := time.NewTicker(time.Millisecond * 100) + defer timer.Stop() + + for { + syncWeb, err := pweb.NewSyncMapNoPanic(conf, &t.routeP, matchfunc) + if err == nil { + shutdown = syncWeb.Shutdown + return + } else if strings.Contains(err.Error(), `address already in use`) { + select { + case <-ctx.Done(): + return + case <-timer.C: + notice() + } + } else { + panic(err) + } + } } func (t *Config) SwapSign(ctx context.Context, logger Logger) { diff --git a/go.mod b/go.mod index f3e5cf9..f355c28 100755 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.23.0 require ( github.com/dustin/go-humanize v1.0.1 github.com/gorilla/websocket v1.5.3 - github.com/qydysky/part v0.28.20240828143014 + github.com/qydysky/part v0.28.20241021164252 golang.org/x/net v0.28.0 ) @@ -16,7 +16,6 @@ require ( github.com/go-ole/go-ole v1.3.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect diff --git a/go.sum b/go.sum index 9bc0a56..8ecdf24 100755 --- a/go.sum +++ b/go.sum @@ -27,8 +27,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 h1:k451T+bpsLr+Dq9Ujo+Qtx0iomRA1XXS5ttlEojvfuQ= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9/go.mod h1:cI8/gy/wjy2Eb+p2IUj2ZuDnC8R5Vrx3O0VMPvMvphA= -github.com/qydysky/part v0.28.20240828143014 h1:1fsUdLXyh03Swksf0BLRge/ObnLRx2cIVyNXaHxILMc= -github.com/qydysky/part v0.28.20240828143014/go.mod h1:s3h7P6YdST5b9WoqjlS9w+JzDFdMeSENQOi8noYuopg= +github.com/qydysky/part v0.28.20241021164252 h1:Jc1mWkZssxRlyqsgS8tJxjnNef43kvKMyoEeLlO44kw= +github.com/qydysky/part v0.28.20241021164252/go.mod h1:s3h7P6YdST5b9WoqjlS9w+JzDFdMeSENQOi8noYuopg= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -39,8 +39,6 @@ github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZ github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= -github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= -github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=