123 lines
3.0 KiB
Go
123 lines
3.0 KiB
Go
|
|
// 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(),
|
|||
|
|
}
|
|||
|
|
}
|