1. 程式人生 > >CloudFoundry原始碼學習筆記之warden (一)

CloudFoundry原始碼學習筆記之warden (一)

# 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的核心,我會在下一篇做簡單介紹。這部分僅為個人理解,如果有什麼說不明白或者錯誤的地方,請原諒/告訴我。