feat(service): align with discover stateless architecture (by AI)

This commit is contained in:
AI Engineer 2026-05-09 21:11:50 +08:00
parent 591da84018
commit 449d8b0ad9
3 changed files with 31 additions and 9 deletions

View File

@ -42,7 +42,7 @@ type ServiceConfig struct {
SessionWithoutCookie bool // Session 禁用 Cookie SessionWithoutCookie bool // Session 禁用 Cookie
DeviceWithoutCookie bool // 设备ID禁用 Cookie DeviceWithoutCookie bool // 设备ID禁用 Cookie
IdServer string // Redis 服务器连接 (用于全局唯一 ID 生成) IdServer string // Redis 服务器连接 (用于全局唯一 ID 生成)
DiscoverApp string // 强制指定 Discover 应用名称,如果不指定且 Listen 为空则自动获取并注册 DiscoverApp string // Discover 应用名称。优先从环境变量 DISCOVER_APP 获取,若为空则自动通过代码检测。
KeepKeyCase bool // 是否保持 Key 的首字母大小写 KeepKeyCase bool // 是否保持 Key 的首字母大小写
IndexFiles []string // 静态文件索引文件 IndexFiles []string // 静态文件索引文件
IndexDir bool // 访问目录时显示文件列表 IndexDir bool // 访问目录时显示文件列表

View File

@ -1,7 +1,6 @@
package service package service
import ( import (
"apigo.cc/go/discover"
gohttp "apigo.cc/go/http" gohttp "apigo.cc/go/http"
"apigo.cc/go/log" "apigo.cc/go/log"
"fmt" "fmt"
@ -117,7 +116,12 @@ func processProxy(request *Request, response *Response, logger *log.Logger) bool
copyResponse(res, response, logger) copyResponse(res, response, logger)
} else { } else {
// Discover 代理 // Discover 代理
caller := discover.NewCaller(request.Request, logger) if GlobalDiscoverer == nil {
logger.Error("proxy failed: GlobalDiscoverer is not initialized")
response.WriteHeader(http.StatusBadGateway)
return true
}
caller := GlobalDiscoverer.NewCaller(request.Request, logger)
caller.NoBody = true caller.NoBody = true
res, _ := caller.ManualDoWithNode(request.Method, app, "", path, request.Body) res, _ := caller.ManualDoWithNode(request.Method, app, "", path, request.Body)
copyResponse(res, response, logger) copyResponse(res, response, logger)

View File

@ -1,6 +1,7 @@
package service package service
import ( import (
"apigo.cc/go/config"
"apigo.cc/go/discover" "apigo.cc/go/discover"
"apigo.cc/go/log" "apigo.cc/go/log"
"context" "context"
@ -16,6 +17,9 @@ import (
"time" "time"
) )
// GlobalDiscoverer 供服务框架内部使用的发现实例
var GlobalDiscoverer *discover.Discoverer
// AsyncServer 异步服务实例 // AsyncServer 异步服务实例
type AsyncServer struct { type AsyncServer struct {
server *http.Server server *http.Server
@ -24,6 +28,7 @@ type AsyncServer struct {
stopChan chan os.Signal stopChan chan os.Signal
startChan chan bool startChan chan bool
useDiscover bool useDiscover bool
discoverer *discover.Discoverer
} }
// AsyncStart 异步启动服务 // AsyncStart 异步启动服务
@ -105,10 +110,23 @@ func (as *AsyncServer) start() {
ip := GetServerIp() ip := GetServerIp()
discoverAddr := fmt.Sprintf("%s:%s", ip, port) discoverAddr := fmt.Sprintf("%s:%s", ip, port)
conf := discover.GetConfig() // 从 discover.yml/json 加载基础结构,但不包含敏感的 SafeBuf
conf.App = appName // 此处不再强行注入 discover.Config 的 Calls而是留给具体业务手动注入或者后续提供安全的反序列化机制
discover.SetConfig(conf) var discConf discover.Config
if discover.Start(discoverAddr) { _ = config.Load(&discConf, "discover")
// Logger 继承
logger := log.DefaultLogger
// 解析必需的 Registry支持环境变量 fallback
registry := os.Getenv("DISCOVER_REGISTRY")
if registry == "" {
registry = "127.0.0.1:6379::15" // Default fallback
}
as.discoverer = discover.Start(registry, appName, discoverAddr, logger, discConf)
GlobalDiscoverer = as.discoverer
if as.discoverer != nil {
log.DefaultLogger.Info("discover registered", "app", appName, "addr", discoverAddr) log.DefaultLogger.Info("discover registered", "app", appName, "addr", discoverAddr)
} }
} }
@ -127,8 +145,8 @@ func (as *AsyncServer) start() {
// Stop 停止服务 // Stop 停止服务
func (as *AsyncServer) Stop() { func (as *AsyncServer) Stop() {
log.DefaultLogger.Info("service stopping") log.DefaultLogger.Info("service stopping")
if as.useDiscover { if as.discoverer != nil {
discover.Stop() as.discoverer.Stop()
} }
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)