【TODO:源代码层次结构】
etcd的入口main函数定义在etcdmain/main.go中,在其中主要工作如下:
然后调用etcdmain/etcd.go中的startEtcdOrProxyV2(),其主要就是解析config的工作,etcd是自身定义了一个较为复杂的config struct:
type config struct {
ec embed.Config
cp configProxy
cf configFlags
configFile string
printVersion bool
ignored []string
}
通过上面各config成员实现非常丰富的configure功能。后续专门分析其config实现,以及可借鉴之处。
完成解析后,则调用startEtcd()和startProxy()分别启动etcd主逻辑,以及proxy。
startEtcd调用embed/etcd.go中的StartEtcd,其主要流程是: 至此etcd就启动了,其中有两个非常重要的功能,
s.run()
peerListener定义如下:
type peerListener struct {
net.Listener
serve func() error
close func(context.Context) error
}
startPeerListeners()定义在embed/etcd.go中,主要逻辑:
etcd的分布式协议采用的是raft,它实现的非常高效,如果自己的项目中需要在Go语言中利用raft协议,可以直接借用。对于raft协议,可以参考。 【TODO:etcd里面rafthttp的实现】
clientListener定义如下:
type serveCtx struct {
l net.Listener
addr string
secure bool
insecure bool
ctx context.Context
cancel context.CancelFunc
userHandlers map[string]http.Handler
serviceRegister func(*grpc.Server)
serversC chan *servers
}
它的启动逻辑比peerListener要简单,就是根据config配置的接口启动相应的net.listener。
这样就等着client请求一些操作了。
【TODO:各中命令实现】