标签:
本文原文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1462761975
本文原文csdn博文链接:http://blog.csdn.net/screscent/article/details/51351381
swarm是docker公司开发的一个管理docker集群的工具。swarm使用标准docker api来作为入口。功能简单,关键是复用了docker api。
下面将来简单的分析下swarm源码。
注:源码为swarm-0.1.0版本
我们先进入到main函数
代码在swarm\main.go
这里 初始化了一个app。其利用的是一个第三方库"github.com/codegangsta/cli"
然后添加了一个Before的动作,用于设置log
接着添加了create command
create操作,用于生成一个集群totken,用于集群的唯一标识
添加list command
list操作,用于打印当前集群中所有的node节点
添加了manage command还有join command。
最后调用了app.Run
manage操作,用于swarm manage的开启。
join操作,用于将机器添加到swarm集群中。
一般使用过程为:
1、create,创建一个集群的token,用于标识集群
2、join,将当前机器加入到集群中。
3、manage,开启swarm manage服务。
关于集群的创建,网上有很多文章,可以自行的去搜索。
那么我们先看看第三方库app是如何工作的。
代码在github.com\codegangsta\cli\app.go
我们先看看app结构体
其中最主要的是Befor,Commands
下面看看NewApp
这里很简单,都是一些默认的参数设置。
下面进入到Run
上面一个默认helpprinter的赋值
解析参数,并将其构造成context
参数的检查,如果before有被设置,则执行befor。
在swarm中,before中设置了log
查找command,然后调用command的Run
这里就是commands的遍历查找
源码在github.com\codegangsta\cli\command.go
先看结构体
其中最重要的就是Action
再看看Run
func (c Command) Run(ctx *Context) error {
这里省略了一些代码,直接看核心代码。一些参数的解析,然后最后,调用了Action
我们先看看create的注册
这个是在main函数中的
那么看下Action
代码在swarm\discovery\token\token.go
初始化,TokenDiscoveryService中的heartbeat设置为0,url使用了默认的url https://discovery-stage.hub.docker.com/v1
通过向url post一个请求,获取一个token
先看看main函数
join的Action则是join函数
代码在swarm\join.go
代码流程是,构建一个discovery,然后调用discovery.Register,注册当前机器
那么我们看看discovery
代码在swarm\discovery\discovery.go
discovery是一个插件模式。New中,通过查找scheme,来查找相对应的插件
下面是DiscoveryService接口
那我们看看插件注册
代码在swarm\discovery\consul\consul.go
代码在swarm\discovery\etcd\etcd.go
代码在swarm\discovery\file\file.go
代码在swarm\discovery\nodes\nodes.go
代码在swarm\discovery\token\token.go
代码在swarm\discovery\zookeeper\zookeeper.go
一共注册了6种插件
注册函数
将其放到了一个全局的map中
下面我们一etcd来讲解join的流程
代码在swarm\discovery\etcd\etcd.go
初始化了一个etcd client设置相关的参数
向etcd服务器发起一个注册url
swarm的代码还是比较少的,很清晰。
文中如果有哪里讲解的不对的地方,还请见谅,望指正。
龚浩华
QQ 月牙寂 29185807
2016年5月9日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
标签:
原文地址:http://blog.csdn.net/screscent/article/details/51351381