DEA(Droplet Execution Agent),主要流程都在agent.rb文件中实现。
由于CloudFoundry平台是以NATS为中心的,只要弄清楚了这个组件能够处理的NATS消息,也就清楚了这个组件的基本流程。DEA也不例外。
Agent主要注册了以下几种事件,下面分别介绍这些方法的实现流程 。
NATS.subscribe('dea.status') { |msg, reply| process_dea_status(msg, reply) } NATS.subscribe('droplet.status') { |msg, reply| process_droplet_status(msg, reply) } NATS.subscribe('dea.discover') { |msg, reply| process_dea_discover(msg, reply) } NATS.subscribe('dea.find.droplet') { |msg, reply| process_dea_find_droplet(msg, reply) } NATS.subscribe('dea.update') { |msg| process_dea_update(msg) } NATS.subscribe('dea.stop') { |msg| process_dea_stop(msg) } NATS.subscribe("dea.#{uuid}.start") { |msg| process_dea_start(msg) } NATS.subscribe('router.start') { |msg| process_router_start(msg) } NATS.subscribe('healthmanager.start') { |msg| process_healthmanager_start(msg) } NATS.subscribe('dea.locate') { |msg| process_dea_locate(msg) }
register_instance_with_router(instance, :uris => (uris - current_uris)) unregister_instance_from_router(instance, :uris => (current_uris - uris))
tgz_file = File.join(@staged_dir, "#{sha1}.tgz") instance_dir = File.join(@apps_dir, "#{name}-#{instance_index}-#{instance_id}")这个tgz_file就是staged droplet。sha1当初研究了很久,不解其意,这里可以看到其实就是droplet的一个标识,目前手头没有实例可以验证,但是app的目录名称应该也和这个sha1相关。
然后启动了一个纤程Fiber,首先将staged文件放置到staged dir中(如果有cache最好,否则会去shared folder取,或者会HTTP去读),然后调用start_operation lambda。
用来向router注册该DEA的所有APP Instances。
DEA收到了router发出的要求注册的信息。DEA循环将所有的APP的所有instances注册到router中,便于router路由app请求信息。
@droplets.each_value do |instances| instances.each_value do |instance| register_instance_with_router(instance) if instance[:state] == :RUNNING end end
DEA向HealthManager发送心跳信息
DEA向CC发送改DEA的运行信息,包括memory和runtimes等,供CC选择。