publish v1.5.3

This commit is contained in:
AI Engineer 2026-06-04 21:33:14 +08:00
parent c88139e202
commit a4f5af3338
4 changed files with 20 additions and 19 deletions

View File

@ -1,13 +1,17 @@
# CHANGELOG - go/service
## v1.5.3 (2026-06-04)
- **新特性**:
- `Static` 静态文件服务增加默认索引文件识别:当请求目录时,若未配置 `IndexFiles`,会自动尝试匹配 `index.html``index.htm`
- **优化**:
- 依赖升级至 `apigo.cc/go/log v1.5.3`,实现对第三方库原始日志的自动劫持与 `serverId` 注入。
- 清理了启动阶段多余的诊断日志,确保“零配置”启动时的控制台纯净度。
- **稳定性**:
- 修复了 `Start()` 函数的幂等性问题,防止在手动调用与 `starter` 框架调度冲突时产生重复绑定端口的错误。
## v1.5.2 (2026-06-04)
- **架构重构**: 彻底移除全局状态泄露,重构为严格的单例模式。
- 将所有路由 (`webServices`)、代理配置 (`hostProxies`)、静态资源 (`statics`) 及鉴权器等 30 多个包级全局变量移入私有的 `webServer` 结构体中。
- `NewWebServer()` 改为直接返回全局安全的 `DefaultServer` 单例。
- 所有的包级公开方法(如 `Register`, `Proxy`, `Static` 等)现作为 `DefaultServer` 实例方法的安全代理。
- **依赖更新**: 升级 `apigo.cc/go/log``v1.5.1`,修复了在使用 `starter` 时异步控制台日志被静默丢弃的关键 Bug。
## v1.5.1 (2026-06-04)
...
- **修复**: 在 `WebServer.Start` 中显式调用 `config.Load(&Config, "service")`,确保启动时自动从 `env.yaml` 加载 `service:` 块。
- **修复**: 优化 `WebServer.Reload` 的配置加载逻辑,确保与启动加载逻辑保持一致。

4
go.mod
View File

@ -10,10 +10,10 @@ require (
apigo.cc/go/http v1.5.0
apigo.cc/go/id v1.5.0
apigo.cc/go/jsmod v1.5.0
apigo.cc/go/log v1.5.2
apigo.cc/go/log v1.5.3
apigo.cc/go/redis v1.5.0
apigo.cc/go/safe v1.5.0
apigo.cc/go/starter v1.5.0
apigo.cc/go/starter v1.5.1
apigo.cc/go/timer v1.5.0
github.com/gorilla/websocket v1.5.3
golang.org/x/net v0.54.0

8
go.sum
View File

@ -16,8 +16,8 @@ apigo.cc/go/id v1.5.0 h1:MjNWPhBhDsoXaLeJDv/0wfJmVMU9EvOs8pWYfsTQ6e8=
apigo.cc/go/id v1.5.0/go.mod h1:qhu4a1/KLc/XcBpcsRu+mXZt7U7Wvd9zMcPs4VspuPA=
apigo.cc/go/jsmod v1.5.0 h1:JgQtJNiJWy1NOP9AzE8NX5VXJkpO/x3GqLsCCSny5Ec=
apigo.cc/go/jsmod v1.5.0/go.mod h1:bmyeZtOAP/j5am+YRnaiM89smysK24K7ebk0koFtsSw=
apigo.cc/go/log v1.5.2 h1:ORcrDh6a4ghxIrm+TNLtm8HxjctwndGL2jCLctEIags=
apigo.cc/go/log v1.5.2/go.mod h1:Djy+I5aLhGB/EjwRz4KHqkVEz584IAD55FAFiIfInuo=
apigo.cc/go/log v1.5.3 h1:rEF0w6OpiPc/bBNA1NdGadtN+vUw645lL9tM27yZ1U8=
apigo.cc/go/log v1.5.3/go.mod h1:Djy+I5aLhGB/EjwRz4KHqkVEz584IAD55FAFiIfInuo=
apigo.cc/go/rand v1.5.0 h1:1o8hh8fhdBuk1/h02IvugvamuT3dkWbVJrqEJVQKB2E=
apigo.cc/go/rand v1.5.0/go.mod h1:Lh98S2dm9UY0X+M+kNQQEKyXHG5pcCKSFPyXN0QCGdk=
apigo.cc/go/redis v1.5.0 h1:VXNDqzKj87BchF7ubDEH+T6lp8NrjeK0izU4ooo7u1A=
@ -26,8 +26,8 @@ apigo.cc/go/safe v1.5.0 h1:W1NblmcU8cex1f9Y5z8mNLUJOzZTE1s6fszb3FbhGnk=
apigo.cc/go/safe v1.5.0/go.mod h1:OfQ5d6COePSGEuPvMeOk6KagX2sezw7nvKh7exj9SeM=
apigo.cc/go/shell v1.5.0 h1:WLDMMqUU0INeaBDmQsTPr0h/NfB2RknAtiJ5NL467+Q=
apigo.cc/go/shell v1.5.0/go.mod h1:rYHA77d5hEsQHcJrbAWf1pHy0sxayeJ0gU55LA/JWQk=
apigo.cc/go/starter v1.5.0 h1:z6wnDrGx/iM6Z+A86FbIW4Y1rNywGzPNY+y2vYQJeMw=
apigo.cc/go/starter v1.5.0/go.mod h1:ru2vVCIvBYDWZ9SmPP4JLyEueUh71Y24ww/wDvCT+Vs=
apigo.cc/go/starter v1.5.1 h1:vW/dYZYWkGGPZGXdQyGqS3UeSdrTlSI9Yg1rpN+qHt4=
apigo.cc/go/starter v1.5.1/go.mod h1:ru2vVCIvBYDWZ9SmPP4JLyEueUh71Y24ww/wDvCT+Vs=
apigo.cc/go/timer v1.5.0 h1:iPo/IQn+iuhBRI1/MR1txwZnamef/RBBfOiIlBiqkgk=
apigo.cc/go/timer v1.5.0/go.mod h1:kOnqTTX+zA4AH7SfC+LpUm4ZvS+DVyWWMqul/V5QWJs=
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=

View File

@ -389,7 +389,7 @@ func (ws *webServer) Start(ctx context.Context, logger *log.Logger) error {
errChan := make(chan error, 1)
go func() {
logger.Info("service starting", "addr", ws.Addr, "proto", protocol)
logger.Info("starting listener", "addr", ws.Addr, "proto", protocol)
ws.running = true
if err := ws.server.Serve(ws.listener); err != nil && err != http.ErrServerClosed {
errChan <- err
@ -410,11 +410,6 @@ func (ws *webServer) Start(ctx context.Context, logger *log.Logger) error {
// Stop 停止服务,实现 starter.Service 接口
func (ws *webServer) Stop(ctx context.Context) error {
logger := ws.logger
if logger == nil {
logger = log.DefaultLogger
}
logger.Info("service stopping")
ws.running = false
if ws.discoverer != nil {
ws.discoverer.Stop()
@ -424,7 +419,6 @@ func (ws *webServer) Stop(ctx context.Context) error {
return err
}
}
logger.Info("service stopped")
return nil
}
@ -483,6 +477,9 @@ var startOnce sync.Once
// Start 兼容旧版的同步启动方法 (通过内部注册 starter 实现)
func Start() {
if DefaultServer.running {
return
}
startOnce.Do(func() {
stopTimeout := time.Duration(Config.StopTimeout) * time.Millisecond
if stopTimeout <= 0 {