cloudfoundry源码学习

上传人:xiao****1972 文档编号:84145733 上传时间:2019-03-02 格式:DOCX 页数:10 大小:27.25KB
返回 下载 相关 举报
cloudfoundry源码学习_第1页
第1页 / 共10页
cloudfoundry源码学习_第2页
第2页 / 共10页
cloudfoundry源码学习_第3页
第3页 / 共10页
cloudfoundry源码学习_第4页
第4页 / 共10页
cloudfoundry源码学习_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《cloudfoundry源码学习》由会员分享,可在线阅读,更多相关《cloudfoundry源码学习(10页珍藏版)》请在金锄头文库上搜索。

1、cloud foundry之vmc代码解读vmc其实是使用ruby来实现的一整套的cli命令转化为http restful请求的对应工具。其代码位于:https:/ clone回来代码之后,下面对代码进行半瓶水解析法解析。入口 bin/vmc引用了 $github/vmc/lib/cli直接运行VMC:Cli:Runner.run位于:lib/cli/runner.rb看上去run会被执行。进入到parse_command!方法中以push为例:when pushusage(vmc push appname -path PATH -url URL -instances N -mem -runt

2、ime RUNTIME -no-start)if args.size = 1set_cmd(:apps, :push, 1)elseset_cmd(:apps, :push, 0)end进入到set_cmd中设置变量module Cli:Runnermodule Command:Apps然后cmd = VMC:Cli:Command.const_get(namespace.to_s.capitalize)cmd.new(options).send(action, *args.collect(&:dup)最终VMC:Cli:Command:Apps.new().send(push)(在ruby语

3、法中,此处send方法是一个关键词,表示callMethod)于是来到了lib/cli/commands/apps.rbdef push(appname=nil)def do_push(appname=nil)upload_app_bits(appname, application)def upload_app_bits(appname, path)client.upload_app(appname, file, appcloud_resources)lib/vmc/clinet.rbdef upload_apphttp_post(path(VMC:APPS_PATH, name, appli

4、cation), upload_data)def http_post(path, body, content_type=nil)def request(method, path, content_type = nil, payload = nil, headers = )perform_http_requestRestClient:Request.execute(req) 于是就没有了(RestClient是ruby中一个rest库)。cloud foundry之cloud_controller代码解读cloud_controller是其管理界面的http rest api入口。补课 rail

5、sRails基于MVC(模型- 视图- 控制器)设计模式。从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的模型,Rails 为你提供一个纯Ruby的开发环境。习惯约定大于配置:model类位置app/models/xxx.rbcontroller位置app/controllers/xxx_controller.rchelp位置app/helpers/xxx_helpers.rbview位置app/views/xxx对应布局app/views/layouts/xxx.rhtml xxx.rxml开始cloud_controllerhttps:/ controller另一个是he

6、alth_manager,今天要研究的是前者,下节说后者。入口bin/cloud_controller - config/boot.rbcloud_controller必需要求ruby1.9以上,因为其中有一个fiber需要ruby支持(传说中的Coroutine)。如果没有配置 cloud_controller使用nginx,则会启用Thin去启动Rack。(Thin是ruby内置的network server,Rack: a Ruby Webserver Interface)app以vmc push举例:vmc push的关键一请求:post apps对应app/controllers/a

7、pps_controller.rbdef createupdate_app_from_params(app)检查各种参数并赋值app.save! (app使用了ActiveRecord:Base,ActiveRecord是ruby用来做orm的东东,具体可以认为save!就是入库了)stage_app(app)去nats注册:result = client.stage(request, AppConfig:staging:max_staging_runtime)关键点cloud_controller接收到请求记录到db:postgresql/sqlite(cloud_controller.ym

8、l中定义)。请求同时发送到nats等进一步处理。vmc push所做的事情1发一个POST到”apps”,创建一个app; (本文只做了这一步的分析)2发一个PUT到”apps/:name/application”,上传app;3发一个GET到”apps/:name/”,取得app状态,看看是否已经启动;4如果没有启动,发一个PUT到”apps/:name/”,使其启动。cloud foundry之warden代码解读-part1warden是其核心部分的资源管理容器,完成了各种资源分配的事情。代码位置在: https:/ = unshare(CLONE_NEWNS);unshare这个调用,

9、可以把挂载的文件系统设置成只在新的挂载命名空间(mount namespace)中可见。execvp(argv0, argv);execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。shopt -s nullglob设置shell环境变量nullglob的值为on,nullglob为on时对于通配符匹配时,若匹配不到时为空(相对应的为通配符本身)。int stat(const char *restrict pathname, struct stat *restrict buf);提供文件名字,获取文件对

10、应属性。build-essential软件包作用是提供编译程序必须软件包的列表信息,也就是说编译程序有了这个软件包,它才知道 头文件在哪,才知道库函数在哪,还会下载依赖的软件包,最后才组成一个开发环境。工具debootstrap可以用于在系统的某个目录中安装一套基本系统,这个基本系统除了一些配置项外,与ubuntu安装程序在安装的第一阶段安装的内容基本相同。这项功能有许多有趣的功能,例如,你可以从某个定制版本的ubuntu Live光盘上通过这个命令快速的在硬盘上安装ubuntu而不需要ubuntu的安装程序,也可以把创建在硬盘上的基本系统目录作为某些涉及系统安全服务的chroot运行环境,通

11、过chroot进入该目录并调试和运行一些可能修改系统配置的应用程序,作为定制小型系统模板等等。aufs一种文件格式,可以mount到目录,同时控制只读和读写。overlayfs另一种文件格式,在ubuntu 11.04后开始替代aufs作为官方livecd的文件格式。cloud foundry之warden代码解读-part2代码结构|- em-warden-client 基于eventmachine的client 依赖 warden-client与warden-protocol 通过 unix socket来通讯|- warden 巨复杂的warden实现,大部分是shell脚本+ruby,

12、还有两个c实现。|- warden-client 客户端驱动,提供与warden的阻塞式通讯client。依赖warden-protocol。其中的V1.rb对各自command进行解析之后的处理。这里有一个v1mode的概念, v1mode使用字符串,转为pb后与其他的一起使用protobuf。- warden-protocol 依赖beefcake(protobuf library for Ruby)。protocol下有所有支持的pb生成格式。小坑:ruby中的send方法send其实就是动态地根据名字调用函数,传递后面的内容作为调用参数,api函数原型为:obj.send(symbol

13、 , args.) = obj在V1.rb中,所能的convert_xxxx_request方法都是这样被调用到的。专注warden实现src下四个C程序:|- clone 用来快速复制一个环境 夹杂一堆的shell在其中运行|- iomux 分成两个部分:iomux-spawn把子进程的pid写到stdout来标示它已经做好准备接收连接。在尝试连接之后一直等待。iomux-link是用来根据pid重新link到其上去。|- oom 通过eventfd得到内存不够的通知- repquota 报告quota使用情况四个c程序将在编译后复制到root/linux/skeleton/bin中其他目录

14、:|- bin 下面有两个脚本文件,用来启动和进入命令行的|- config 下面有一个配置文件,定义了linux下的配置|- lib 所有的ruby代码|- root 各种shell脚本,操作cgroup之类的启动warden环境:chenzhenubuntu-chenzhen:/warden/warden$ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 12.04 LTSRelease: 12.04Codename: precise$cd warden/warden$sudo bundle exec rake setupconfig/linux.yml$sudo bundle exec rake warden:startconfig/linux.yml$ctrl+z$bg$sudo bundle exec bin/warden-repl$ping.pong 调用过程:bin/warden-repl lib/warden/repl.rb Warden:Client warden.sock lib/warden/server.rb Warden:Serv

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号