cloud foundry源码启动(二)

时间:2022-04-27 21:53:02

上一篇文章主要是写了vcap_dev的执行过程,在其执行完成之后,将会运行vcap文件进行真正的cloud foundry各个模块的启动。

对于真正的源码启动,主要涉及的两个程序文件是vcap和vcap_components文件。。。。

vcap_dev调用vcap文件的时候传进去的命令为:

start cloud_controller health_manager mongodb_node uaa dea mongodb_gateway router stager -c /home/fjs/.......

前面start后面的表示需要启动的模块,-c表示配置文件的目录,还有一些其他的参数就省略了,比较简单,一看就明白了。。。

  def self.start(args)
self.start_init
components(args).each(&:start)
end

上面是真正的启动代码,在vcap文件定义的Run模块中。。首先是调用start_init函数,进行一些初始化,其实主要是启动nats服务器。。。。

接下来就是调用components函数来启动各个模块。。。。接下来分析component函数、、。、、

  def self.components(args)
args = Component.getNamedComponents().keys if args.empty? #如果传进来的参数是空的话,那么直接开启所有的模块
args = Run.expand_args(args) #这里args保存的是处理后的需要启动的所有东西
components = args.map do |arg|
component = Component.create(arg) #跟路模块的名字,找到相应的子类,然后构造相应的对象
STDOUT.puts "Skipping invalid component: #{arg}" if component.nil?
component if (component && component.exists?)
end.compact
STDERR.puts "Don't know how to process '#{args.inspect}' \?\?" if components.empty?
components
end
其实相对还是很简单的,首先是调用expand_args函数对例如controller,dea等参数进行一些预处理,然后再根据处理完成以后的参数来具体的启动各个模块,这里要生成跟各个模块相关的对象,这些类型的定义都在dev_components文件中完成的。。。将生成的这些对象放入到components序列中,然后在将他们返回。。然后再在start函数中分别调用这些对象的start方法完成模块的启动。。。。

接下来分析dev_components文件。。。
在这个文件中首先定义了基本的模块类型---Component,其中定义了start,stop等方法来进行模块的启动,停止等操作。。。

接下来还定义了许多子类来继承Component类,例如CoreComponent,ServiceComponent等等。。cloud 否的内容与的不同模块对应着不同的具体类型。。例如mongodb_node 就属于ServiceComponent,

在Component类中有一个类变量@@named_components,它是一个哈希结构,key是名字,value是具体的了类型,例如key是mongodb,那么对应的value就是ServiceComponent。。。

这样就建立了名字与类型之间的关系。。。

通过调用create方法,通过不同的名字来建立不同的对象。。。然后再调用对象的start方法来进行模块的启动。。。

  def start
if !running?
pid = fork do
# Capture STDOUT when no log file is configured
if !log_file?
stdout = File.open(log_file, 'a')
stdout.truncate(0)
STDOUT.reopen(stdout)
stderr = File.open(log_file, 'a')
STDERR.reopen(stderr)
end
# Make sure db is setup, this is slow and we should make it faster, but
# should help for now.
if is_cloud_controller?
cc_dir = File.expand_path(File.join($vcap_home, 'cloud_controller', 'cloud_controller'))
Dir.chdir(cc_dir) { `bundle exec rake db:migrate` }
end
exec("#{component_start_path}")
end

Process.detach(pid)

start = Time.now
while ((Time.now - start) < 20)
break if running?
sleep (0.25)
end
end

status

if !running?
if File.exists?(log_file)
log = File.read(log_file)
STDERR.puts "LOG:\n #{log}" if !log.empty?
end
end
end
这个样子,源码的启动过程就差不多弄完了。。

接下来就可以进行各个模块的启动过程了。。。。