main函数在哪里?

看到这个go文件时大家是不是有一种找到入口的欣喜,同时有一种难以言表的郁闷,为什么那么短?获取一个command,然后执行一个Execute()就运行了?好像是这么回事,然后点开了Execute()方法:

越往下看越郁闷,咋那么难。。。

这时候看一下我们在哪里,可以发现当前路径是:

D:/go/src/k8s.io/kubernetes/vendor/github.com/spf13/cobra/command.go:790

尴尬,一开始就陷入了3方库。点开NewSchedulerCommand()函数看看呢:

到这里好像我们发现了什么,cobra是个什么东西?似乎cobra影响了整个代码结构,获取command是cobra的Command对象,最后的Execute()方法也是cobra提供的方法。于是不难发现,这是一个绕不过去的三方库,我们得先花点力气查查cobra是什么!

cobra是什么?

我们可以在github上看到这个项目

来自spf13,看来是精品!上图的英文介绍里可以看到一点消息:A Commander for modern Go CLI interactions

然后浏览一下README.md(建议大家到github上认真看一下这个说明文档),我们大致可以看出来

天哪,那么多知名开源go项目,k8s生态的etcd、docker、之上的openshift等等居然都用了cobra!明显这些项目都用了cobra当做“脚手架”,也就是入口风格会很像!spf13写的pflag等都是大名鼎鼎的轮子中的精品啊,看来cobra很值得稍微深入一下,如果自己开发命令行工具,需要用到子命令和flag的话,spf13的cobra和pflag是不二之选了。

一句话介绍cobra,然后我们简单实践一下:支持子命令行模式和复杂flag的时髦命令行程序脚手架!

cobra程序长什么样?

要写个demo,当然得先install cobra. 作为一只gopher,我相信大家install 一个github上的go项目是没有压力的,此中无非可能遇到网络问题,go get不行就git clone,缺啥找啥,最终下载完是这样的:

下面我们试着写一个小小的cobra程序:

如上命令,cobra告诉我们application is ready at xxx,所以我们看一下本地生成了些什么:

本地自动创建好了一个项目,我们看一下main.go里面是什么:

是不是有点小激动?和kube-scheduler的入口一样一样的!我们运行如下命令来添加2个command:

我们打开version.go稍微修改一下:

发现没有,当我们执行一个命令时,对应的command中Run方法会被执行!我们最后看一个子命令的玩法:

怎么样,轻轻松松写了一个支持多级命令的程序,后面一张图可以看到上面我们输入命令中serverCmd的含义:

下面看kube-scheduler中对应的Run在哪里?

cmd/kube-scheduler/app/server.go:322 func NewSchedulerCommand() *cobra.Command

继续看一下Run:后面是什么:

这个Run()方法继续跟一下:

是不是发现好像接近真相了?

这个server.Run()我们继续看看:

太和谐了!这个注释也可以直观看到这就是运行SchedulerServer的入口,这个函数接收到stop信息前会一直运行下去,也就是一直运行着的kube-scheduler!!!

我们最后回头看一下main.go

是不是很好理解了?第一个红框中设置Run()方法中需要做什么,后面的Execute()方法其实就是运行了前面定义的Run()方法!

今天就讲到这里,我们下一讲寻找调度算法!

 
 
 

102 - kube-scheduler源码分析 - cobra-寻找scheduler组件启动函数的更多相关文章

  1. external-provisioner源码分析(3)-组件启动参数分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(3)-组件启动参数分析 本文将对extern ...

  2. ceph-csi源码分析(2)-组件启动参数分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(2)-组件启动参数分析 ceph-csi组件的源码分析分为五部分: ...

  3. scheduler源码分析——preempt抢占

    前言 之前探讨scheduler的调度流程时,提及过preempt抢占机制,它发生在预选调度失败的时候,当时由于篇幅限制就没有展开细说. 回顾一下抢占流程的主要逻辑在DefaultPreemption ...

  4. [源码分析] 消息队列 Kombu 之 启动过程

    [源码分析] 消息队列 Kombu 之 启动过程 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 是 ...

  5. ceph-csi组件源码分析(1)-组件介绍与部署yaml分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi组件源码分析(1)-组件介绍与部署yaml分析 基于tag v3.0.0 ht ...

  6. scheduler源码分析——调度流程

    前言 当api-server处理完一个pod的创建请求后,此时可以通过kubectl把pod get出来,但是pod的状态是Pending.在这个Pod能运行在节点上之前,它还需要经过schedule ...

  7. scrapy-redis(调度器Scheduler源码分析)

    settings里面的配置:'''当下面配置了这个(scrapy-redis)时候,下面的调度器已经配置在scrapy-redis里面了'''##########连接配置######## REDIS_ ...

  8. angular源码分析:图解angular的启动流程

    今天做了一些图来说明angular,由于angular实在太复杂了,不知道用什么图表示比较好,所以就胡乱画了一些,希望有人能看得懂. 一.源码文件编译合并顺序图 二.angular.module函数功 ...

  9. angular源码分析:angular中各种常用函数,比较省代码的各种小技巧

    angular的工具函数 在angular的API文档中,在最前面就是讲的就是angular的工具函数,下面列出来 angular.bind //用户将函数和对象绑定在一起,返回一个新的函数 angu ...

  10. 【Canal源码分析】Canal Server的启动和停止过程

    本文主要解析下canal server的启动过程,希望能有所收获. 一.序列图 1.1 启动 1.2 停止 二.源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...

随机推荐

  1. BZOJ_4892_[Tjoi2017]dna_哈希

    BZOJ_4892_[Tjoi2017]dna_哈希 Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的 性状,但是研究人员 ...

  2. 为什么说JAVA中要慎重使用继承

    JAVA中使用到继承就会有两个无法回避的缺点: 打破了封装性,迫使开发者去了解超类的实现细节,子类和超类耦合. 超类更新后可能会导致错误. 继承打破了封装性 关于这一点,下面是一个详细的例子(来源于E ...

  3. 循环神经网络之LSTM和GRU

    看了一些LSTM的博客,都推荐看colah写的博客<Understanding LSTM Networks> 来学习LSTM,我也找来看了,写得还是比较好懂的,它把LSTM的工作流程从输入 ...

  4. RabbitMQ和Kafka到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...

  5. 工厂模式讲解, 引入Spring IOC

    目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { ...

  6. 目标检测 anchor 理解笔记

    anchor在计算机视觉中有锚点或锚框,目标检测中常出现的anchor box是锚框,表示固定的参考框. 目标检测的任务: 在哪里有东西 难点: 目标的类别不确定.数量不确定.位置不确定.尺度不确定 ...

  7. Nginx技术进阶详讲

    Nginx技术进阶详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 并发数问题 讲到并发数这个概念,想必各位应该都知道是什么意思,就是同时访问一个项目,就比我们现在做的一些项目完 ...

  8. 浅谈MySQL架构体系

    一  数据库和数据库实例 在MySQL的学习研究中,存在两个非常容易混淆的概念,即数据库和数据库实例.在MySQL中,数据库和数据库实例定义如下: 数据库:存储数据的集合: 数据库实例:操作数据库的集 ...

  9. MySQL 四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  10. Restframe_work 回顾记忆集

    目录 Restframe_work 回顾记忆集 rest_framework主要功能介绍 rest_framework主要模块介绍 记忆集 错题集 混淆集 重点集 难点集 Restframe_work ...