Cloud Foundry参赛博文——CLOUD FOUNDRY启动流程及为其添加系统服务

前提

已经正确使用dev_setup安装Cloud Foundry


启动流程

1.流程分析

通过dev_setup安装的Cloud Foundry可以通过以下代码启动

~/cloudfoundry/vcap/dev_setup/bin/vcap_dev start

vcap_dev会从以下代码处获得Cloud Foundry的各个组件和部署信息

vcap_components = JSON.parse(File.read(Deployment.get_vcap_config_file(deployment_config_path)))
deployment_info = JSON.parse(File.read(Deployment.get_deployment_info_file(deployment_config_path)))

具体的文件路径可以从dev_setup/lib下的vcap_defs.rb下查看,其中vcap_components默认的获取文件路径是

~/cloudfoundry/.deployment/devbox/config/vcap_components.json

deployment_info默认的获取文件路径是

~/cloudfoundry/.deployment/devbox/config/deployment_info.json

经过各种处理之后,将信息送入vcap进行处理

exec_cmd("#{ruby_binary} #{vcap_launch} #{command} #{vcap_components["components"].join(" ")} -c #{deployment_config_path} -v #{vcap_path} -l #{deployment_info["deployment_log_path"]}")

vcap在解析上上述输入的信息后将各个component送入Component类中进行启动(dev_setup/lib/vcap_components.rb)

exec("#{component_start_path}")

例如:
启动vblob_gateway时,执行

/root/cloudfoundry/vcap/bin/../services/vblob/bin/vblob_gateway -c /root/cloudfoundry/.deployments/devbox/config/vblob_gateway.yml

添加系统服务

在最近安装的Cloud Foundry中,移除了vcap/bin/services目录(可能是service的借口发生了变化,我不清楚)
原先的文档(参考链接)中所提及的方法已经不可使用(还有值得借鉴的地方)
说先将echo文件夹添加到vcap/services/目录下,并添加执行权限。
根据上文描述,我们可以发现vcap_dev启动时是从下述文件获得的component信息

~/cloudfoundry/.deployment/devbox/config/vcap_components.json


则仍然通过这里添加echo_node,echo_gateway服务,并在config目录下添加配置文件。


在vcap_component.json中添加echo_node和echo_gateway服务



现在启动一下cloud foundry



这里会发现Skipping invalid component: echo_XXXXX
再回头看一下vcap的源码,从以下代码发现”Skipping invalid component”

 def self.components(args)
    args = Component.getNamedComponents().keys if args.empty?
    args = Run.expand_args(args)
    components = args.map do |arg|
      component = Component.create(arg)
      if component.nil?
        STDOUT.puts "Skipping invalid component: #{arg}"
      else
        STDOUT.puts "Skipping excluded component: #{component.name}" if component.is_excluded?
      end
      component if (component && component.exists? && !component.is_excluded?)
    end.compact
    STDERR.puts "Don't know how to process '#{args.inspect}' \?\?" if components.empty?
    components
  end

component变量是由Component.create返回的,再看Component.create函数

  def self.create(name, configuration_file=nil)
    sub_class = @@named_components[name]
    if sub_class
      sub_class.new(name, configuration_file)
    else
      nil
    end
  end

我们可以发现sub_class是由@@name_components[name]得出的,通过阅读代码可以发现@@name_components是在Component.register函数中定义的

  def self.register(name, excluded=nil)
    @@named_components[name] = self
    default_excluded=/#{DEFAULT_CLOUD_FOUNDRY_EXCLUDED_COMPONENT}/
    if excluded == true || (excluded.nil? && name =~ default_excluded)
      @@excluded << name
    end
  end

当vcap中require了vcap_components.rb时,会执行该文件最下端的代码段

# register valid named components

## core
%w(router cloud_controller dea health_manager uaa acm).each do |core|
   CoreComponent.register(core)
end

## services: gateways & nodes
%w(redis mysql mongodb rabbitmq postgresql vblob neo4j memcached couchdb elasticsearch filesystem).each do |service|
  ServiceComponent.register("#{service}_gateway")
end

%w(redis mysql mongodb rabbitmq postgresql vblob neo4j memcached couchdb elasticsearch).each do |service|
 ServiceComponent.register("#{service}_node")
end

## service auxiliary
%w(service_broker).each do |auxiliary|
 ServiceAuxiliaryComponent.register(auxiliary)
end

## service tools
%w(backup_manager snapshot_manager).each do |tool|
  ServiceToolComponent.register(tool)
end

所以当我们只在vcap_component.json中添加echo_node和echo_gateway时,vcap_dev可以识别出来,但是传入vcap时,会被认为是没有注册的component而不会处理,所以添加系统服务时同样需要修改vcap_components.rb

在vcap_components.rb中注册echo_node和echo_gateway服务



根据之前的文档,还需要向cloudcontroller中添加token配置,并向/cloudfoundry/vcap/services/tools/misc/bin/nuke_service.rb中添加配置文件路径(让cloud foundry知道系统提供了echo服务),最后安装echo的依赖库,具体参考之前的文档。
这次再次运行cloud foundry



终于运行成功了,使用VMC工具看看cloud foundry是否显示了echo服务



至此,echo服务算是添加成功了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值