一、newConfig()
newConfig()
是 ETCD 启动过程中的一个重要函数,它用于初始化和配置 ETCD 的各种配置项。该函数构造了一个 config
类型的实例,并为其配置了多个启动参数、标志和默认值。接下来,我们将逐行解析该函数的具体实现。
1. 创建 config
实例
cfg := &config{
ec: *embed.NewConfig(),
ignored: ignored,
}
cfg := &config{...}
:创建一个新的config
结构体实例,并为其各个字段赋予默认值。ec: *embed.NewConfig()
:初始化embed.Config
,这是 ETCD 服务的配置,包含了网络监听、存储路径等基础配置。ignored: ignored
:ignored
是一个包含需要忽略的标志名称的字符串切片。它用于存储那些不会被解析和使用的标志。
2. 初始化 configFlags
结构体
cfg.cf = configFlags{
flagSet: flag.NewFlagSet("etcd", flag.ContinueOnError),
clusterState: flags.NewSelectiveStringValue(
embed.ClusterStateFlagNew,
embed.ClusterStateFlagExisting,
),
fallback: flags.NewSelectiveStringValue(
fallbackFlagExit,
fallbackFlagProxy,
),
v2deprecation: flags.NewSelectiveStringsValue(
string(cconfig.V2Depr1WriteOnly),
string(cconfig.V2Depr1WriteOnlyDrop),
string(cconfig.V2Depr2Gone)),
}
-
flagSet: flag.NewFlagSet("etcd", flag.ContinueOnError)
:创建一个新的FlagSet
实例,该实例用于解析命令行参数。"etcd"
是标志集的名称,flag.ContinueOnError
表示在遇到错误时继续执行(不退出)。 -
clusterState: flags.NewSelectiveStringValue(...)
:clusterState
是一个标志,表示集群的状态。它使用NewSelectiveStringValue
初始化,支持选择值"new"
(新集群)或"existing"
(已有集群)。这个标志告诉 ETCD 是启动一个新集群还是加入现有集群。 -
fallback: flags.NewSelectiveStringValue(...)
:fallback
是一个标志,控制发现失败时的处理方式。它的可选值为"exit"
或"proxy"
,决定在发现失败时退出或继续作为代理。 -
v2deprecation: flags.NewSelectiveStringsValue(...)
:v2deprecation
是一个包含多个选择值的标志,用于控制 ETCD v2 API 的弃用阶段。它使用NewSelectiveStringsValue
初始化,支持不同的弃用阶段(如"write-only"
、"write-only-drop"
和"gone"
)。
3. 定义 Usage
函数
fs := cfg.cf.flagSet
fs.Usage = func() {
fmt.Fprintln(os.Stderr, usageline)