【原创】swarm源码分析(1)---command流程

来源:互联网 发布:淘宝网司法拍卖可靠吗 编辑:程序博客网 时间:2024/06/05 08:46

本文原文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版本

1、command

我们先进入到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是如何工作的。

 

2、cli

代码在github.com\codegangsta\cli\app.go

我们先看看app结构体



其中最主要的是Befor,Commands

 

下面看看NewApp


这里很简单,都是一些默认的参数设置。

 

下面进入到Run


上面一个默认helpprinter的赋值



解析参数,并将其构造成context


参数的检查,如果before有被设置,则执行befor。

在swarm中,before中设置了log


查找command,然后调用command的Run

 

这里就是commands的遍历查找

2.1 command

源码在github.com\codegangsta\cli\command.go

先看结构体


其中最重要的就是Action

 

再看看Run

func (c Command) Run(ctx *Context) error {


这里省略了一些代码,直接看核心代码。一些参数的解析,然后最后,调用了Action

 

 

3、create

我们先看看create的注册


这个是在main函数中的

那么看下Action

代码在swarm\discovery\token\token.go



初始化,TokenDiscoveryService中的heartbeat设置为0,url使用了默认的url https://discovery-stage.hub.docker.com/v1


通过向url post一个请求,获取一个token

 

4、join

先看看main函数


join的Action则是join函数

 

代码在swarm\join.go


代码流程是,构建一个discovery,然后调用discovery.Register,注册当前机器

 

那么我们看看discovery

4.1 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中

 

4.2 etcd

下面我们一etcd来讲解join的流程

代码在swarm\discovery\etcd\etcd.go


初始化了一个etcd client设置相关的参数

 

向etcd服务器发起一个注册url

 

 

5、总结

swarm的代码还是比较少的,很清晰。

 

文中如果有哪里讲解的不对的地方,还请见谅,望指正。

 

 

龚浩华

QQ 月牙寂 29185807

2016年5月9日

(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)


1 0