【原创】swarm源码分析(1)---command流程
2016-05-09 10:58
246 查看
本文原文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1462761975
本文原文csdn博文链接:/article/9299820.html
swarm是docker公司开发的一个管理docker集群的工具。swarm使用标准docker api来作为入口。功能简单,关键是复用了docker api。
下面将来简单的分析下swarm源码。
注:源码为swarm-0.1.0版本
代码在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是如何工作的。
我们先看看app结构体
其中最主要的是Befor,Commands
下面看看NewApp
这里很简单,都是一些默认的参数设置。
下面进入到Run
上面一个默认helpprinter的赋值
解析参数,并将其构造成context
参数的检查,如果before有被设置,则执行befor。
在swarm中,before中设置了log
查找command,然后调用command的Run
这里就是commands的遍历查找
先看结构体
其中最重要的就是Action
再看看Run
func (c Command) Run(ctx *Context) error {
这里省略了一些代码,直接看核心代码。一些参数的解析,然后最后,调用了Action
这个是在main函数中的
那么看下Action
代码在swarm\discovery\token\token.go
初始化,TokenDiscoveryService中的heartbeat设置为0,url使用了默认的url https://discovery-stage.hub.docker.com/v1
通过向url post一个请求,获取一个token
join的Action则是join函数
代码在swarm\join.go
代码流程是,构建一个discovery,然后调用discovery.Register,注册当前机器
那么我们看看discovery
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中
代码在swarm\discovery\etcd\etcd.go
初始化了一个etcd client设置相关的参数
向etcd服务器发起一个注册url
文中如果有哪里讲解的不对的地方,还请见谅,望指正。
龚浩华
QQ 月牙寂 29185807
2016年5月9日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
本文原文csdn博文链接:/article/9299820.html
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.godiscovery是一个插件模式。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日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
相关文章推荐
- Android Volley组件的优化
- Android Volley组件的优化
- 几大常用头文件stdio.h,stdio.h ,stdbool.h里的定义
- Linux忘记开机密码怎么办?
- fir.im weekly - 「 持续集成 」实践教程合集
- H5中section和article标签之间的区别
- 盖得化工_采集一页的所有公司网址
- Linux忘记开机密码怎么办?
- iOS开发详细技巧
- Tarjan算法
- 解决Android模拟器中修改host文件无效/android域名解析为Ip方法
- Razor 语法之两个紧邻的括号的处理
- matlab_离散数据处理_插值拟合积分
- Ubuntu15.10 安装OpenCV3.1
- 堆的应用(1000个数据中找最大的前K个元素,堆排序)
- Ubuntu15.10 安装OpenCV3.1
- MyBatis Generator代码生成工具及参考文档链接
- netlink socket
- 合作类项目有什么特点?这类项目有哪些风险点?
- 转: 视频相关的协议族介绍(rtsp, hls, rtmp)