Dockerfile
This commit is contained in:
@@ -20,6 +20,7 @@ var (
|
||||
consulAddr string
|
||||
reconnectMutex sync.RWMutex
|
||||
reconnectDone chan struct{}
|
||||
connected bool
|
||||
)
|
||||
|
||||
// connectConsul 连接 Consul
|
||||
@@ -27,6 +28,11 @@ func connectConsul(ctx context.Context) error {
|
||||
reconnectMutex.Lock()
|
||||
defer reconnectMutex.Unlock()
|
||||
|
||||
// 如果已经连接,不再重复连接
|
||||
if connected && registry != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
registry, err = consul.New(consul.WithAddress(consulAddr))
|
||||
if err != nil {
|
||||
@@ -36,9 +42,10 @@ func connectConsul(ctx context.Context) error {
|
||||
|
||||
gsvc.SetRegistry(registry)
|
||||
gsel.SetBuilder(gsel.NewBuilderRoundRobin())
|
||||
connected = true
|
||||
g.Log().Infof(ctx, "✅ Consul 初始化成功: %s", consulAddr)
|
||||
|
||||
// 启动健康检查和自动重连
|
||||
// 启动健康检查和自动重连(只启动一次)
|
||||
go startHealthCheckAndReconnect()
|
||||
|
||||
return nil
|
||||
@@ -65,6 +72,13 @@ func startHealthCheckAndReconnect() {
|
||||
}
|
||||
|
||||
g.Log().Warning(ctx, "⚠️ Consul 连接异常,尝试重新连接...")
|
||||
|
||||
// 重置连接状态并重连
|
||||
reconnectMutex.Lock()
|
||||
connected = false
|
||||
registry = nil
|
||||
reconnectMutex.Unlock()
|
||||
|
||||
if err := connectConsul(ctx); err != nil {
|
||||
g.Log().Errorf(ctx, "❌ Consul 重连失败: %v,5秒后重试...", err)
|
||||
}
|
||||
@@ -81,18 +95,11 @@ func checkConsulHealth(ctx context.Context) bool {
|
||||
reconnectMutex.RLock()
|
||||
defer reconnectMutex.RUnlock()
|
||||
|
||||
if registry == nil {
|
||||
if registry == nil || !connected {
|
||||
return false
|
||||
}
|
||||
|
||||
// 尝试获取服务列表来检测连接是否正常
|
||||
services, err := registry.Search(ctx, gsvc.SearchInput{})
|
||||
if err != nil {
|
||||
g.Log().Debugf(ctx, "Consul 健康检查失败: %v", err)
|
||||
return false
|
||||
}
|
||||
|
||||
g.Log().Debugf(ctx, "✅ Consul 健康检查通过,发现 %d 个服务", len(services))
|
||||
// 简单检查注册器是否可用,避免频繁调用Search导致错误
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user