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 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

ModernPHP读书笔记(三)——PHP的良好实践

ModernPHP读书笔记(三)——PHP的良好实践 (原创内容,转载请注明来源,谢谢) 一、密码 1、密码不宜用明文存储,也不能用可以解密的...

2626
来自专栏性能与架构

小程序示例 - 不同页面间的消息传递

场景 假设有两个页面:用户列表页、信息编辑页 在列表中点击后某条信息后,进入编辑页面 ? 修改了用户信息后,返回到列表页,列表中需要显示修改后的信息 例如把 “...

3317
来自专栏finleyMa

jsonp总结

由于浏览器有同略策略,但是<script>标签的src可以跨域,利用这个"漏洞"搞事,具体做法是: 服务端地址(比如 http://api.xxx.com/j...

422
来自专栏linux驱动个人学习

VFS四大对象之二 struct inode

继上一篇文章:https://cloud.tencent.com/developer/article/1053842 二、inode结构体:(转自http://...

4237
来自专栏Python攻城狮

Python网络爬虫(五)- Requests和Beautiful Soup1.简介2.安装3.基本请求方式5.程序中的使用4.BeautifulSoup4

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,...

554
来自专栏程序你好

在VisualStudio中提供运行时和设计时支持的WPF本地化解决方案

关于WPF本地化问题有许多其他的文章,包括使用Locbaml本地化WPF应用程序(https://www.codeproject.com/KB/WPF/Arti...

522
来自专栏文渊之博

使用vs2010生成SQL Server 随机数据

前几天做测试数据,偶然发现vs2010中有一个生成随机数据的功能,记录下来,方便以后使用,确实非常的好用灵活快捷。 为了简单扼要的说明,下面我用一个实例来说明如...

1689
来自专栏流柯技术学院

LoadRunner上传及下载文件

         web_submit_data("importStudent.do",

772
来自专栏杨建荣的学习笔记

datapump简介(一) (r6笔记第2天)

datapump是在10g之后推出的新特性,无论从功能还是性能上,都有一定的改进,可以说在功能上丰富了很多,在性能上也提升了很多。可以说exp/imp中能实现的...

2445
来自专栏Danny的专栏

【EJB学习笔记】——建立一个简单的EJB应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

582

扫描关注云+社区