CloudFoundry原始碼學習筆記之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在這裡就夠用了)
_更多_ 請參考
* 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的核心,我會在下一篇做簡單介紹。這部分僅為個人理解,如果有什麼說不明白或者錯誤的地方,請原諒/告訴我。