Files
common/startup/startup.go
2026-03-12 08:51:05 +08:00

123 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package startup 提供服务启动时的组件初始化控制
// 各服务可以按需初始化所需组件,避免不必要的资源占用
package startup
import (
"context"
"sync"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/glog"
)
// Components 组件配置
type Components struct {
Consul bool // Consul 服务注册发现(所有服务都需要)
Jaeger bool // Jaeger 链路追踪(所有服务都需要)
Redis bool // Redis 缓存
RabbitMQ bool // RabbitMQ 消息队列
MongoDB bool // MongoDB 数据库
RAGFlow bool // RAGFlow AI 客户端
ES bool // Elasticsearch
}
var (
initialized bool
initOnce sync.Once
components *Components
)
// Init 初始化指定的组件
// 示例:
//
// bootstrap.Init(ctx, &bootstrap.Components{
// Consul: true,
// Jaeger: true,
// Redis: true,
// RabbitMQ: true,
// })
func Init(ctx context.Context, c *Components) {
initOnce.Do(func() {
components = c
initialized = true
glog.Infof(ctx, "Bootstrap 初始化完成: %+v", c)
})
}
// IsInitialized 检查是否已初始化
func IsInitialized() bool {
return initialized
}
// GetComponents 获取组件配置
func GetComponents() *Components {
if components == nil {
// 默认配置:从配置文件读取
return loadFromConfig()
}
return components
}
// NeedRedis 是否需要 Redis
func NeedRedis() bool {
c := GetComponents()
return c != nil && c.Redis
}
// NeedRabbitMQ 是否需要 RabbitMQ
func NeedRabbitMQ() bool {
c := GetComponents()
return c != nil && c.RabbitMQ
}
// NeedMongoDB 是否需要 MongoDB
func NeedMongoDB() bool {
c := GetComponents()
return c != nil && c.MongoDB
}
// NeedRAGFlow 是否需要 RAGFlow
func NeedRAGFlow() bool {
c := GetComponents()
return c != nil && c.RAGFlow
}
// NeedES 是否需要 Elasticsearch
func NeedES() bool {
c := GetComponents()
return c != nil && c.ES
}
// loadFromConfig 从配置文件加载组件配置
// 如果配置文件中没有 startup 配置,则默认全部启动
func loadFromConfig() *Components {
ctx := context.Background()
// 检查是否有 startup 配置节
startupCfg := g.Cfg().MustGet(ctx, "startup")
if startupCfg.IsEmpty() {
// 没有配置 startup默认全部启动
glog.Debug(ctx, "未找到 startup 配置,默认启动所有组件")
return &Components{
Consul: true,
Jaeger: true,
Redis: true,
RabbitMQ: true,
MongoDB: true,
RAGFlow: true,
ES: true,
}
}
// 有配置则按配置来,未配置的项默认 true
return &Components{
Consul: g.Cfg().MustGet(ctx, "startup.consul", true).Bool(),
Jaeger: g.Cfg().MustGet(ctx, "startup.jaeger", true).Bool(),
Redis: g.Cfg().MustGet(ctx, "startup.redis", true).Bool(),
RabbitMQ: g.Cfg().MustGet(ctx, "startup.rabbitmq", true).Bool(),
MongoDB: g.Cfg().MustGet(ctx, "startup.mongodb", true).Bool(),
RAGFlow: g.Cfg().MustGet(ctx, "startup.ragflow", true).Bool(),
ES: g.Cfg().MustGet(ctx, "startup.es", true).Bool(),
}
}