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

相关文章

来自专栏张善友的专栏

如何在ASP.NET 2.0中定制Expression Builders

expressions是asp.net 2.0中的新特色,它可以使你在asp.net的页面里很方便的使用自定义的属性. 在ASPX页里只要使用$符号就可以访问...

1927
来自专栏开源优测

python unittest使用基本过程

前言 unittest是python的标准的单元测试框架,能够很好的和自动化测试相结合,并有独立的测试报告框架。 unittest提供了一系列类让测试变得更加容...

41411
来自专栏JadePeng的技术博客

weex里Vuex state使用storage持久化

在weex里使用Vuex作为state管理工具,问题来了,如何使得state可以持久化呢?weex官方提供store模块,因此我们可以尝试使用该模块来持久化st...

4536
来自专栏散尽浮华

nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

Nginx的geo模块不仅可以有限速白名单的作用,还可以做全局负载均衡,可以要根据客户端ip访问到不同的server。比如,可以将电信的用户访问定向到电信服务器...

2666
来自专栏阿杜的世界

Spring Boot:定制static path mappings

在Spring Boot:定制URL匹配规则一文中我们展示了如何调整URL请求匹配到对应的控制器方法的规则。类似得,也可以控制应用程序对静态文件(前提是被打包进...

412
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现

《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现 (原创内容,转载请注明来源,谢谢) 一、基本功能 redis的慢查询日志,用于记录执...

3084
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 统一数据访问

      统一数据访问(Uniform Data Access,简写为UDA)用于隔离系统和数据平台,使系统可以在各种数据库平台上自由移植。该数据库访问接口要...

1747
来自专栏乐百川的学习频道

Python 日志输出

打印日志是很多程序的重要需求,良好的日志输出可以帮我们更方便的检测程序运行状态。Python标准库提供了logging模块,让我们也可以方便的在Python中打...

2049
来自专栏友弟技术工作室

爬虫相关总结

爬虫 在做防止网站被爬虫爬取数据的时候,其中最简单的方式就是判断请求是程序生产的,还是人为生成的。 当然,最简单的就是通过请求头进行判断。下面给一个例子: In...

2967
来自专栏緣來來來

Python爬虫--- 1.1请求库的安装与使用

http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

390

扫码关注云+社区