CloudFoundry源代码学习笔记之warden (一)

长平狐 发布于 2013/11/25 18:34
阅读 245
收藏 1
# warden 是一个有关资源隔离 和 资源管理 的框架

由三个 Gem [ em-warden-client, warden-client, warden-protocol ] 和 一个 Ruby 项目 [ warden ] 组成


## warden-protocol/ (难度系数 *)

create, stop, destroy, info  --  增删查改 (所钟对的资源是?)

Create a container, optionally pass options.

Stop all processes inside a container.

Shutdown a container.

Show metadata for a container.

spawn, link, run, stream --  封装系统执行 (要执行什么?)

Spawns a command inside a container and returns the job id.

Do blocking read on results from a job.

Short hand for spawn(link(cmd)) i.e. spawns a command, links to the result.

Spawns a command inside a container and returns the job id.

实实在在的功能:

net_in, net_out

copy_in, copy_out

limit_memory, limit_disk, limit_bandwidth

ping, list, echo

基本要实现的功能都在注释里说了,只是如果对低层不太了解的话,还真看不懂。

* 这里的 _protocol_ 和我们平时所看到的 _协议_ 是两码事,它只是对你所指定的类加一些限制条件而矣。(你可以简单理解为数据结构?!)

* _warden-protocol_ 基于 Google Protocol 的ruby库

* gem 'beefcake' --> 由*Google出品,warden-protocol的核心* _主要_ 提供这四个方法:required, optional, repeated, module (个人建议你只需要记住这几个方法在这里就够用了,也就是说熟读beefcake的README在这里就够用了)
_更多_ 请参考 beefcake 项目


* lib/warden/protocol.rb --> 全为 `require`调用其子类,没什么实际意义。共分为8类

* 具体实现刚才说过,和数据结构差不多。多了 request(即输入),response(即输出)


## warden-client/ (难度系数 **)

_注意_ 它与 *上面的 Protocol 关系密切*,体现在下面的 v1.rb 文件内。

  client/
    v1.rb --> 对protocol的具体实现(一一对应)
self.request_from_v1; self.response_to_v1 (这里使用到了元编程)

      此外, `分别对应warden_protocol` 里的 protocol/ 有以下方法:
      private self.转换 [create, stop, destroy, info, spawn, link, stream, run, net,
net_in, net_out, copy, copy_in, copy_out, limit, limit_memory,
limit_disk, ping, list, echo] 请求/响应


  client.rb --> 实现一些基本的方法,如  io; 流;读;写;连接;断开连接;调用
    连接: 其实就是创建一个套接字 unixsocket --> UNIXSocket.new
    基础设施,为上面的 client/v1.rb 服务


## em-warden-client (难度系数 ***)

 
client.rb --> 调用call(*args, &blk); 连接connect; 断开连接 disconnect

  client/

    除了引入 'eventmachine' 和 'fiber' 外,其它的和 _warden-client_ 一样
    Fiber 和 EM 似乎很受欢迎 惊讶
  
    _Fiber_ 别担心 Fiber, 它没有你想像中的那么难,阅读 *Core API Reference* 你会发现只有几个方法,使用起来不难微笑

    connection.rb --> 调用call(*args, &blk); 接收数据 receive_data(data = nil)

    event_emitter.rb --> 发射emit(event, *args); 移除监听者;
      _listeners 为 Hash 里面默认存放 []

## warden/ (难度 *******)

这一部分难度很大,是整个warden的核心。前面的3个Gem加起来也没这么复杂,下文只是做简单介绍,等我下一篇关于warden的博文会比较详细的解析。


`root` 下为 'insecure' 或 'linux' 执行的 `shell` 脚本

`src` 下为 'clone'(主) 或 'iomux'(主) 或 'oom'(次) 或 'repquota'(次) 的`C`代码 

还好这里大部分都是 `ruby` 代码.


### src
  
  src/ 为C语言所写,共分为4部分。

  其中,`clone`和`iomux`相对比较重要;而`oom`和`repquota`相对比较简单


理解warden这部分,首先,我们需要搞清楚:安装时它都用到了哪些代码?都干了些啥? (就和vcap_dev_setup安装CF一样,我们必需知道个大概。至于要不要深入,您自便)

接下来就是,它具体是如果工作的?(完成资源隔离和管理)


warden复杂的主要原因就是混乱。主要功能:一,创建一台虚拟机(在这里称之为'Container') 二,实现通过命令与这Container交互 三,其余的,想要实现的功能。

你可能会说:主要才3个功能,也不多啊? -- 关键是它们杂在一起,阅读和理解起来很费力。

如果官方能够把它们分离出来,那是一件比较好的事!

----

简单小结:

上面对warden的四部分做了一些简单介绍。阅读源代码时,个人建议你按这个顺序。不仅是因为它们的难度依次加大,更多的是它们之前是有一定联系的。先熟悉protocol, 再看client, 再到异步的client .. ... 中间过渡会比较容易。

最后一部分 -- warden的核心,我会在下一篇做简单介绍。这部分仅为个人理解,如果有什么说不明白或者错误的地方,请原谅/告诉我。


原文链接:http://blog.csdn.net/restkuan/article/details/8075542
加载中
返回顶部
顶部