在bin目录下面有一个cloud_controller启动脚本,主要进行了源码目录lib和app的加载,然后进行了vcap::cloudcontroller::runner初始化,并调用run!启动接口
启动命令:./bin/cloud_controller [-c] [-m] [-d]
VCAP::CloudController::Runner
- 读取启动命令后的参数
- -c 设置配置文件读取路径,如果没有指定-c,那么默认会读取config/cloud_controller.yml文件作为cloud_controller启动的配置文件,读取配置文件信息到内存中保存起来,供后续使用
- -d 进行rack_env设置,默认是production模式,如果有-m那么会是development,那么执行 register Sinatra::Reloader,动态加载 reload_path 路径下的*.rb文件,这样就可以在不需求重启进程情况下,查看修改后结果,加快开发速度
- -m 数据库初始化,默认进行 rake db:migrate 后,数据库都是空的,加了-m 选项,cc会在启动的时候将一些默认的值写到数据库中,比如:quota定义等等
- setno日志对象初始化
- message_bus初始化,所有的subscribe和publish都通过这个对象来进行操作
- cloud_controller初始化,创建pid文件,设置logger,创建和db数据库的连接,对象初始化将message_bus和config作为参数传递
- 创建app,用户接收所有的request请求,包括消息的订阅和注册
- thin_server初始化,app设置为第5部的那个app值,bing到ip和port上,由app来处理请求
- 监听信号,如果接收到term quit的信号的话,那么thin server会暂停,并且调用EM.stop命令暂停
使用EM.run来启动一个事件循环机制,当有io事件,信号,或者是timer时候,会调用run中相应的处理模块,直到调用EM.stop时候,才会退出这个loop。
VCAP::CloudController::Controller
继承于Sinatra::Base,处理所有http请求的入口
http请求分为两部分:
- 一部分是直接定义在*.rb文件中,比如 lib/cloud_controller/legacy_api/*.rb 下的所有请求都是直接在脚本中定义get或者post请求处理函数,这种是直观就可以看见的