swarm源码分析(1)---command流程

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

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的代码还是比较少的,很清晰。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户画像

使用Maven管理Jar包

②点击Maven project,在右侧会出现下图的菜单栏,点击刷新,即可pom文件所有的jar包到本地仓库

942
来自专栏linux系统运维

zip压缩以及tar打包

21310
来自专栏别先生

mysql输入密码后闪退怎么办?

第一: 首先需要想到的是mysql的服务可能没开,首先打开mysql的服务 ? 第二: 打开Mysql的命令行输入密码即可 ? 第三: 登录成功 ? 第四: 顺...

2319
来自专栏流柯技术学院

修改windows系统文件权限

修改windows系统文件总是提示没有权限,虽然已是administrator也不管用。

1081
来自专栏前端vue

Node中间件multer文件上传实践

单文件上传,接收一个以fieldname命名的文件,文件信息保存在req.file

962
来自专栏玩转JavaEE

MongoDB基本操作

上篇文章我们简单介绍了MongoDB安装以及启动命令,本文我们来看看基本的增删改查,对MongoDB有一个直观的认识。 ---- 客户端安装配置 上篇文章我们提...

4154
来自专栏www.96php.cn

【fastadmin安全篇】设置全局 HtmlPurifier 安全过滤

首先下载HtmlPurifier 链接:https://github.com/ezyang/htmlpurifier

2483
来自专栏xcywt

《Linux命令行与shell脚本编程大全》 第六章环境变量

很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。 6.1 什么是环境变量: bash shell用一个叫环境变量(environment v...

19110
来自专栏Linyb极客之路

linux常用基本命令之文件搜索命令

命令:find 语法:find [搜索范围路径] -name 【文件名称】(根据文件名查找) find [搜索范围路径] -size [...

3906
来自专栏zcqshine's blog

android6.0 drawable 的变化

3587

扫码关注云+社区