码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-12 18:32:18      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

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

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


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

标签:

原文地址:http://blog.csdn.net/screscent/article/details/51351381

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!