引言
dea主要负责的是应用的打包和部署,下面来简单剖析下dea的启动步骤。
bootstrap
setup
- validate_config:config配置加载
- setup_logging:设置日志
- setup_droplet_registry:初始化DropletRegistry对象,参数是droplet的打包存储路径
- setup_instance_registry:初始化InstanceRegistry对象,参数是config
- setup_staging_task_registry:初始化StagingTaskRegistry对象,这个对象维护了一个map
- setup_resource_manager:初始化ResourceManager对象,参数是InstanceRegistry,StagingTaskRegistry,config["resource"]
- setup_directory_server:初始化DirectoryServer对象
- setup_directory_server_v2:初始化DirectoryServerV2,源码文件系统,jdc file命令就是请求的这个服务
- setup_signal_handlers:信号处理初始化
- setup_directories:文件目录创建:db,droplets, instances, tmp, staging
- setup_pid_file:生成dea的pid
- setup_sweepers:启动heartbeat的定时任务,汇报instance的状态;InstanceRegistry启动定时任务start_reaper;启动定时任务进行droplet的清理
- setup_nats:初始化nats对象,参数是bootstrap,config;这个是由于所有消息订阅的处理全部在bootstrap中实现的
- setup_router_client:初始化RouterClient对象,负责向router发布消息
start
- start_component:vcap中注册dea这个组件
- start_nats:nats的启动,开始订阅消息
- start_directory_server:启动DirectoryServer
- greet_router:往gorouter发送greet消息,收到response后,初始化一个定时器,instance往gorouter的注册
- register_directory_server_v2:往router注册文件目录服务
- directory_server_v2这个文件目录服务的启动
- setup_varz:设置统计信息
经过setup和start后,dea就启动起来了,后续的操作都是通过消息订阅来进行处理的。
消息订阅
nats
- healthmanager.start:如果收到healthmanager的启动消息,会发布dea.heartbeat消息,告知当前所有instance的状态;
- router.start:收到router的启动消息,如果收到register的定时时间间隔,那么需要取消默认的定时器,重新初始化一个定时器,往gorouter注册dea中instance的信息;
- dea.status:回复当前的dea状态信息给订阅者
- dea.#{bootstrap.uuid}.start:收到app启动命令,会先初始化instance,然后启动instance;这里涉及了很多操作,具体细节可以查看源码;只是这里droplet包的下载和虚拟化空间是同步进行
- dea.stop:暂停app实例
- dea.update:dea状态更新(指的是uri更新)
- dea.find.droplet:返回droplet包对应的地址
dea_locator
- dea.locate:发布消息dea.advertise,汇报这个dea的id,app个数,可使用内存等信息
staging
- staging.#{@dea_id}.start:启动打包流程
- staging.stop:暂停打包
staging_locator
- staging.locate:发布消息staging.advertise,汇报可用内存和平台信息