bootstrap

package module
v0.0.29 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2026 License: MIT Imports: 35 Imported by: 2

README

应用程序引导

概述

此包负责程序的引导配置管理。提供一个线程安全的初始化流程和配置注册机制,用于在应用启动阶段集中管理各类配置结构体(例如服务器、客户端、数据、日志等)。

设计要点

  • 延迟初始化:使用 sync.Once 确保引导配置仅初始化一次。
  • 并发安全:读写操作通过 sync.RWMutex 保护。
  • 配置注册:通过 RegisterConfig 注册任意非空指针类型配置(例如 &configv1.SomeConfig{}),内部对同一指针地址做去重。
  • 主配置访问:使用 GetBootstrapConfig 获取共享的 *configv1.Bootstrap 实例。

app-info 初始化

启动时按以下优先级初始化 app-info 的五个基础字段:启动参数 → NewContext 传入的 *configv1.AppInfo → 默认常量。

可分别传入以下启动参数:

go run . \
  -p shop \
  -a admin-service \
  -i shop-admin-service@host \
  -n "Shop Admin Service" \
  -v v1.2.3

对应长参数为 --project--app-id--instance-id--name--version,短参数分别为 -p-a-i-n-v;未传入的字段继续从 AppInfo 或默认值补齐。

运行环境配置

--env(短参数 -e)用于选择配置目录中的环境覆盖文件,默认值为 dev。基础文件始终加载,<name>.<env>.yaml 在基础文件之后加载并覆盖同名字段,其他环境文件会被忽略。

configs/
├── data.yaml
├── data.dev.yaml
└── data.prod.yaml
go run . --conf configs --env dev
go run . -c configs -e prod

如果 data.prod.yaml 不存在,env=prod 会直接使用 data.yaml。环境覆盖文件可以只配置与基础文件不同的字段。

密钥 Provider

独立的 key.yaml 用于描述密钥 Provider。密钥配置只应包含类型、范围、根密钥引用 和 Provider 的非敏感连接参数;根密钥与 Provider 认证信息必须由外部 Secret Manager 或工作负载身份提供。

type: vault
scope: prod/order-service
root_name: secret/data/kratos/prod/root
vault:
  address: http://127.0.0.1:8200
  value_key: value

启动时 bootstrap 先读取 key.yaml;如果 sdk.Runtime 已设置 Key 实例就直接复用,否则按 key 配置创建 Key, 没有 key 配置时默认使用 configs/root.key 的 file provider,随后使用派生的 config 密钥加载业务配置。 本地 file provider 初始化时,根密钥文件不存在会使用系统随机源生成 32 字节根密钥并以 0600 权限排他创建; 文件已存在时直接复用,永远不会覆盖已有根密钥。外部 Secret Manager Provider 不会创建本地文件。

使用示例

package main

import (
    "log/slog"

    "github.com/liujitcn/kratos-kit/bootstrap"
    configv1 "github.com/liujitcn/kratos-kit/api/gen/go/config/v1"

	//_ "github.com/liujitcn/kratos-kit/config/apollo"
	//_ "github.com/liujitcn/kratos-kit/config/consul"
	_ "github.com/liujitcn/kratos-kit/config/etcd"
	//_ "github.com/liujitcn/kratos-kit/config/kubernetes"
	//_ "github.com/liujitcn/kratos-kit/config/nacos"
	//_ "github.com/liujitcn/kratos-kit/config/polaris"

	//_ "github.com/liujitcn/kratos-kit/logger/aliyun"
	//_ "github.com/liujitcn/kratos-kit/logger/fluent"
	//_ "github.com/liujitcn/kratos-kit/logger/logrus"
	//_ "github.com/liujitcn/kratos-kit/logger/tencent"
	//_ "github.com/liujitcn/kratos-kit/logger/zap"
	//_ "github.com/liujitcn/kratos-kit/logger/zerolog"
	
	//_ "github.com/liujitcn/kratos-kit/registry/consul"
	_ "github.com/liujitcn/kratos-kit/registry/etcd"
	//_ "github.com/liujitcn/kratos-kit/registry/eureka"
	//_ "github.com/liujitcn/kratos-kit/registry/kubernetes"
	//_ "github.com/liujitcn/kratos-kit/registry/nacos"
	//_ "github.com/liujitcn/kratos-kit/registry/polaris"
	//_ "github.com/liujitcn/kratos-kit/registry/servicecomb"
	//_ "github.com/liujitcn/kratos-kit/registry/zookeeper"
)

var version string

// go build -ldflags "-X main.version=x.y.z"

func newApp(
	lg *slog.Logger,
	re registry.Registrar,
	hs *http.Server,
) *kratos.App {
	return bootstrap.NewApp(
		lg,
		re,
		hs,
	)
}

func main() {
	bootstrap.Bootstrap(initApp, trans.Ptr(service.AdminService), trans.Ptr(version))
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AdjustAppInfo

func AdjustAppInfo(ai *configv1.AppInfo)

AdjustAppInfo 调整应用信息,设置默认值

func BeDaemon

func BeDaemon(arg string)

BeDaemon 将当前进程转为守护进程(尝试启动脱离的子进程并退出父进程)

func NewApp

func NewApp(ctx *Context, srv ...transport.Server) *kratos.App

NewApp 创建应用程序

func NewAppInfo

func NewAppInfo(appId, version, appName *string) *configv1.AppInfo

NewAppInfo 创建应用信息

func NewAppName

func NewAppName(project, appId string) string

NewAppName 生成应用名称

func NewInstanceId

func NewInstanceId(project, appId, version, host string) string

NewInstanceId 生成实例ID 格式:project-appId-version@host@xid

func NewRootCmd

func NewRootCmd(f *CommandFlags, runE func(cmd *cobra.Command, args []string) error) *cobra.Command

NewRootCmd 创建根命令并绑定命令行参数和执行函数。

func ResolveHost

func ResolveHost() string

ResolveHost 返回优先级选择的 host 标识:POD_NAME -> HOSTNAME env -> os.Hostname() -> 首个非 loopback IPv4 -> "unknown-host"

func RunApp

func RunApp(ctx *Context, initApp InitAppFunc, opts ...func(root *cobra.Command)) error

RunApp 运行应用程序并允许在执行前对 root 命令做定制。 opts 可用于注册子命令、对 root 添加 flag 或其他修改。

Types

type CommandFlags

type CommandFlags struct {
	Conf       string // 引导配置文件路径,默认为:../../configs
	Env        string // 开发环境:dev、debug……
	ConfigHost string // 远程配置服务端地址
	ConfigType string // 远程配置服务端类型
	Daemon     bool   // 是否转为守护进程
	Project    string // 项目标识
	AppID      string // 应用标识
	InstanceID string // 实例标识
	Name       string // 应用名称
	Version    string // 应用版本
}

CommandFlags 命令传参

func NewCommandFlags

func NewCommandFlags() *CommandFlags

NewCommandFlags 创建默认命令行参数。

func (*CommandFlags) AddFlags

func (f *CommandFlags) AddFlags(cmd *cobra.Command)

AddFlags 将 flags 绑定到传入的 cobra.Command(通常是 root command)。

func (*CommandFlags) Init

func (f *CommandFlags) Init()

type Context

type Context struct {
	// contains filtered or unexported fields
}

Context 引导上下文

func NewContext

func NewContext(parent context.Context, ai *configv1.AppInfo) *Context

NewContext 创建带 cancel 的应用级 Context(传 nil 使用 Background)

func NewContextWithParam

func NewContextWithParam(parent context.Context, ai *configv1.AppInfo, cfg *configv1.Bootstrap, log *slog.Logger) *Context

NewContextWithParam 使用指定配置和 logger 创建引导上下文。

func (*Context) CancelContext

func (c *Context) CancelContext()

CancelContext 触发取消(幂等)

func (*Context) Context

func (c *Context) Context() context.Context

Context 返回应用级根 context(保证非 nil)

func (*Context) DeleteCustomConfig

func (c *Context) DeleteCustomConfig(key string)

DeleteCustomConfig 删除自定义配置

func (*Context) GetAppInfo

func (c *Context) GetAppInfo() *configv1.AppInfo

func (*Context) GetConfig

func (c *Context) GetConfig() *configv1.Bootstrap

GetConfig 返回当前的 *configv1.bootstrap(并发安全)

func (*Context) GetCustomConfig

func (c *Context) GetCustomConfig(key string) (any, bool)

GetCustomConfig 获取自定义配置(原始类型)

func (*Context) GetLogger

func (c *Context) GetLogger() *slog.Logger

GetLogger 返回当前引导上下文中的 logger。

func (*Context) GetRegistrar

func (c *Context) GetRegistrar() registry.Registrar

func (*Context) GetValue

func (c *Context) GetValue(key string) (interface{}, bool)

GetValue 从通用存储读取值

func (*Context) InitAppInfo added in v0.0.15

func (c *Context) InitAppInfo(project, appID, instanceID, name, version string)

InitAppInfo 按启动参数、传入配置、默认值的优先级初始化应用信息。

func (*Context) NewLoggerHelper

func (c *Context) NewLoggerHelper(moduleName string) *slog.Logger

NewLoggerHelper 创建带模块字段的 logger。

func (*Context) PrintAppInfo

func (c *Context) PrintAppInfo()

func (*Context) RangeCustomConfig

func (c *Context) RangeCustomConfig(fn func(key string, val any) bool)

RangeCustomConfig 遍历自定义配置,回调返回 false 可停止遍历

func (*Context) RegisterCustomConfig

func (c *Context) RegisterCustomConfig(key string, cfg proto.Message)

RegisterCustomConfig 注册自定义配置

func (*Context) SetCustomConfig

func (c *Context) SetCustomConfig(key string, cfg proto.Message)

SetCustomConfig 存入自定义配置

func (*Context) SetValue

func (c *Context) SetValue(key string, val interface{})

SetValue 将任意值放入通用存储

func (*Context) UpTime

func (c *Context) UpTime() time.Duration

UpTime 返回应用已运行时间

type InitAppFunc

type InitAppFunc func(ctx *Context) (app *kratos.App, cleanup func(), err error)

InitAppFunc 应用初始化函数类型

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL