偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深度剖析CloudFoundry的架構(gòu)設(shè)計(jì)

云計(jì)算
本文會(huì)分為兩個(gè)部份:第一部份主要介紹CloudFoundry的架構(gòu)設(shè)計(jì),從它所包含的模塊介紹起,到各部份的消息流向,各模塊如何協(xié)調(diào)合作;第二部份會(huì)在第一部份的基礎(chǔ)上,以如何在你的數(shù)據(jù)中心里面用CloudFoundry部署一個(gè)私有PaaS為目標(biāo),把第一部分介紹到的架構(gòu)知識使用起來。

VMware在今年4月份突然發(fā)布了業(yè)內(nèi)第一個(gè)開源的PaaS——CloudFoundry。發(fā)布至今的這幾個(gè)月里,筆者一直關(guān)注它的演進(jìn),并從它的架構(gòu)設(shè)計(jì)中獲益良多,覺得有必要寫出來與大家分享一下。

本文會(huì)分為兩個(gè)部份:第一部份主要介紹CloudFoundry的架構(gòu)設(shè)計(jì),從它所包含的模塊介紹起,到各部份的消息流向,各模塊如何協(xié)調(diào)合作;第二部份會(huì)在第一部份的基礎(chǔ)上,以如何在你的數(shù)據(jù)中心里面用CloudFoundry部署一個(gè)私有PaaS為目標(biāo),把第一部分介紹到的架構(gòu)知識使用起來。

第一部份講的很多內(nèi)容,會(huì)引用Pat在10月12日的VMwareCloud Forum上面關(guān)于CloudFoundry架構(gòu)的演講。Pat是CloudFoundry Core的負(fù)責(zé)人,他的那次演講很值得一聽。如果你當(dāng)時(shí)在場,并且理解他所說的內(nèi)容,本部份可以選擇直接跳過。我除了會(huì)把說的內(nèi)容講具體點(diǎn)外,不太可能可以講得比他好。

一、架構(gòu)及模塊

從總體地看,CloudFoundry的架構(gòu)如下:

 

 

這個(gè)架構(gòu)圖以及下文所用到的各模塊架構(gòu)圖均來自Pat的PPT。從上圖能夠看到CloudFoundry主要有以下幾大組件組成:

1、 Router:顧名思義,Router組件在CloudFoundry中是對所有進(jìn)來的Request進(jìn)行路由。進(jìn)入Router的request主要有兩類:首先是來自VMCClient或者STS的,由CloudFoundry使用者發(fā)出的,管理型指令。

例如:列出你所有apps的vmcapps,提交一個(gè)apps等等。這類request會(huì)被路由到AppLife Management組件,又叫CloudController組件去;第二類是外界對你所部署的apps訪問的request。這部份requests會(huì)被路由到Appexecution,又或者叫做DEAs的組件去。所有進(jìn)入CloudFoundry系統(tǒng)的requests都會(huì)經(jīng)過Router組件,看到這里可能會(huì)有朋友會(huì)擔(dān)心Router成為單點(diǎn),從而成為整個(gè)云的瓶頸。

但是CloudFoundry作為云系統(tǒng),其設(shè)計(jì)的核心就是去單點(diǎn)依賴,組件平行擴(kuò)充,且可替代的以保證擴(kuò)展性,這是CloudFoundry,甚至所有云計(jì)算系統(tǒng)的設(shè)計(jì)原則,后文會(huì)討論CloudFoundry如何做到這點(diǎn),目前只要知道,系統(tǒng)可以部署多個(gè)Routers共同處理進(jìn)來的requests,但是Router上層的LoadBalance不在CloudFoundry的實(shí)現(xiàn)范圍,CloudFoundry只保證所有的request是無狀態(tài)的,這樣就使上層均衡附載選擇面非常非常大了,例如可以通過DNS做,也可以部署硬件的LoadBalancer,或者簡單點(diǎn),弄臺ngnix作負(fù)載均衡器,都是可行的。

#p#

Router組件,目前版本是對nginx的一個(gè)簡單封裝。熟悉ngnix的朋友應(yīng)該知道,它可以一個(gè)套接字文件(.sock文件)作為輸入輸出。所有安裝CloudFoundry的Router組件服務(wù)器都會(huì)安裝一個(gè)nginx,其ngnix.conf文件有以下配置:

 

從整體的來看,Router組件的結(jié)構(gòu)如下:

 

 

2、DEA(Droplet Execution Agency): 首先要解析下什么叫做Droplet。Droplet在CloudFoundry的概念里面是指一個(gè)把你提交的源代碼,以及CloudFoundry配套好的運(yùn)行環(huán)境,再加上一些管理腳本,例如Start/Stop這些小腳本全部壓縮好在一起的tar包。還有一個(gè)概念,叫做Stagingapp,就是指制作上面描述這個(gè)包,然后把它存儲好的過程。CloudFoundry會(huì)自動(dòng)保存這個(gè)Droplet,直到你start一個(gè)app的時(shí)候,一臺部署了DEA模塊的服務(wù)器會(huì)來拿一個(gè)Droplet的copy去運(yùn)行。所以如果你擴(kuò)展你的app到10個(gè)instances,那這個(gè)Droplet就被會(huì)復(fù)制十份,讓10個(gè)DEA服務(wù)器拿去運(yùn)行。

#p#

下圖是DEA模塊的架構(gòu)圖:

 

Cloud Controller模塊(下面會(huì)介紹)會(huì)發(fā)送start/stop等基本的apps管理請求給DEA,dea.rb接收這些請求,然后從NFS里面找到合適的Droplet。前面說到Droplet其實(shí)是一個(gè)帶有運(yùn)行腳本的,帶運(yùn)行環(huán)境的tar包,DEA只需要把它拿過來解壓,并即行里面的start腳本,就可以讓這個(gè)app跑起來。到此,app算是可以訪問,并start起來了,換句話說就是有這臺服務(wù)器的某一個(gè)端口已經(jīng)在待命,只要有request從這個(gè)端口進(jìn)來,這個(gè)app就可以接收并返回正確的信息。

接著dea.rb要做些善后的工作:1、把這個(gè)信息告訴Router模塊。我們前面說到,所有進(jìn)入CloudFoundry的requests都是由Router模塊處理并轉(zhuǎn)發(fā)的,包括用戶對app的訪問request,一個(gè)app起來后,需要告訴router,讓它根據(jù)loadbalance等原則,把合適的request轉(zhuǎn)進(jìn)來,使這個(gè)app的instance能夠干起活;2、一些統(tǒng)計(jì)性的工作,例如要把這個(gè)用戶又新部署了一個(gè)app告訴CloudController,以作quota控制等;3、把運(yùn)行信息告訴HealthManager模塊,實(shí)時(shí)報(bào)告該app的instance運(yùn)行情況。另外DEA還要負(fù)責(zé)部份對Droplet的查詢工作,譬如,如果用戶通過CloudController想查詢一個(gè)app的log信息,那DEA需要從該Droplet里面取到log返回等等。

3、CloudController:CloudController是CloudFoundry的管理模塊。主要工作包括:

a) 對apps的增刪改讀;

b) 啟動(dòng)、停止應(yīng)用程序;

c) Staging apps(把a(bǔ)pps打包成一個(gè)droplet);

d) 修改應(yīng)用程序運(yùn)行環(huán)境,包括instance、mem等等;

e) 管理service,包括service與app的綁定等;

f) Cloud環(huán)境的管理;

g) 修改Cloud的用戶信息;

h) 查看Cloud Foundry,以及每一個(gè)app的log信息。

這似乎有點(diǎn)復(fù)雜,但簡單的說,可以很簡單:就是與VMC和STS交互的服務(wù)器端。VMC和STS與CloudFoundry通信采用的是restful接口,另一方面CloudController是一個(gè)典型的Rubyon Rails項(xiàng)目,從VMC或者STS接到JSON格式的協(xié)議,然后寫入CloudController Database,并發(fā)消息到各??烊タ刂乒芾碚麄€(gè)云。和其他ROR項(xiàng)目一樣,CloudController的所有API可以從conf/routes.rb里看到。開放的Restful接口好處在于第三方應(yīng)用開發(fā)和集成,企業(yè)在用CloudFoundry部署私有云的時(shí)候,可以通過這些接口來自動(dòng)化控制管理整個(gè)Cloud環(huán)境。這部份內(nèi)容將在第二部份論述。

#p#

下圖是Cloud Controller的架構(gòu)圖:

 

圖中Health Manager和DEA是外部模塊,CCDatabase就是CloudController Database,這個(gè)是整個(gè)CloudFoundry不能做HP的地方。CloudController Database的并發(fā)性不會(huì)很多,應(yīng)用級別的數(shù)據(jù)庫訪問是由底下的Service模塊處理的,這個(gè)數(shù)據(jù)庫存的是Cloud的配置信息。讀操作主要來自DEA啟動(dòng),作為初始化DEA的依據(jù);以及healthmanager模塊會(huì)從這里讀取預(yù)期的狀態(tài)信息,這部份數(shù)據(jù)會(huì)與從DEA得到的實(shí)際狀態(tài)信息進(jìn)行比對。

NFS是多個(gè)CloudController的共享存儲,CloudController其中一個(gè)重要工作就是StagingApps。Droplets的存儲是在集群環(huán)境的唯一的。而CloudController是集群運(yùn)行,換言之,就是每一個(gè)控制Request可能由不同的CloudController處理,假設(shè)一個(gè)簡單的用戶場景:我們需要部署一個(gè)app到CloudFoundry中。我們在敲完那條簡單的push命令后,VMC開始工作,在做完一輪的用戶鑒權(quán)、查看所部署的apps數(shù)量是否超過預(yù)定數(shù)額,問了一堆相關(guān)app的問題后,需要發(fā)4個(gè)指令:

1.發(fā)一個(gè)POST到”apps”,創(chuàng)建一個(gè)app;

2.發(fā)一個(gè)PUT到”apps/:name/application”,上傳app;

3.發(fā)一個(gè)GET到”apps/:name/”,取得app狀態(tài),看看是否已經(jīng)啟動(dòng);

4.如果沒有啟動(dòng),發(fā)一個(gè)PUT到”apps/:name/”,使其啟動(dòng)。

如果第2和第4步由不同的Cloud Controller來處理,而又無法保證他們能找到同一個(gè)Droplet,那第4步將會(huì)因?yàn)檎也坏綄?yīng)的Droplet而啟動(dòng)失敗。如何保證這一連串指令過來所指向的Droplet都是同一個(gè)呢?使用NFS,使CloudController共享存儲是最簡單的方法。但是這個(gè)方法在安全性等方面并不完美。在10月12日的VMwareCloud Forum上,Pat告訴我們下一版本的CloudFoundry這里將會(huì)有大調(diào)整,但是在那部份代碼公開前,我不方便在這評價(jià)太多。

4、HealthManager: 做的事情不復(fù)雜,簡單的說是從各個(gè)DEA里面拿到運(yùn)行信息,然后進(jìn)行統(tǒng)計(jì)分析,報(bào)告等。統(tǒng)計(jì)數(shù)據(jù)會(huì)與CloudController的設(shè)定指標(biāo)進(jìn)行比對,并提供Alert等。HealthManager模塊目前還不是十分完善,但是CloudManage棧里面,自動(dòng)化health管理、分析是一個(gè)很重要的領(lǐng)域,而這方面可以擴(kuò)展的地方也很多,結(jié)合OrchestrationEngine可以使云自管理、自預(yù)警;而與BI方面技術(shù)結(jié)合,可以統(tǒng)計(jì)運(yùn)營情況,合理分配資源等。這方面CloudFoundry還在發(fā)展之中。

5、Services:Cloud Foundry的Service模塊從源代碼控制上看就知道是一個(gè)獨(dú)立的、可Plugin的模塊,以方便第三方把自己的服務(wù)整合入CloudFoundry生態(tài)系統(tǒng)。在Github上看到service是與CloudFoundry Core項(xiàng)目vcap獨(dú)立的一個(gè)repository,為vcap-service。Service模塊其中設(shè)計(jì)原則是方便第三方服務(wù)提供商提供服務(wù)。在這方面CloudFoundry做得很成功,從Github上看,已經(jīng)有以下服務(wù)提供:a)MongoDB; b) mysql; c) neo4j; d) PostgreSql; e) RabbitMQ; f) Redis; g)vBlob?;惗际欠旁赽ase文件夾中。

#p#

第三方如果需要自己開發(fā)CloudFoundry的服務(wù),需要繼承改寫它里面的兩個(gè)基礎(chǔ)類:Node和Gateway;而里面一些操作,如:Provision,可以在base的provisioner.rb基礎(chǔ)上加入自己的邏輯,同樣的還有Service_Error和Service_Message等。關(guān)于如何寫自己的Service,ELC的博客會(huì)推出相應(yīng)文章詳細(xì)論述,并不在本文的討論范圍里面,從架構(gòu)了解上來說,只要知道服務(wù)間的關(guān)系,知道個(gè)服務(wù)與base間透過繼承關(guān)系來橫向擴(kuò)充,而CloudFoundry與apps調(diào)用Service是通過base來完成這一簡單的架構(gòu)方法即可。

6、NATS(Message bus): 從CloudFoundry的總架構(gòu)圖看,位于各模塊中心位置的是一個(gè)叫nats的組件。NATS是由CloudFoundry的架構(gòu)師Derek開發(fā)的一個(gè)輕量級的,支持發(fā)布、訂閱機(jī)制的消息系統(tǒng)。Github開源地址是:https://github.com/derekcollison/nats。其核心基于EventMachine開發(fā),代碼量不多,可以下載下來慢慢研究。

CloudFoundry是一個(gè)多模塊的分布式系統(tǒng),支持模塊自發(fā)現(xiàn),錯(cuò)誤自檢,且模塊間低耦合。其核心原理就是基于消息發(fā)布訂閱機(jī)制。每個(gè)臺服務(wù)器上的每個(gè)模塊會(huì)根據(jù)自己的消息類別,向MessageBus發(fā)布多個(gè)消息主題;而同時(shí)也向自己需要交互的模塊,按照需要的信息內(nèi)容的消息主題訂閱消息。譬如:一個(gè)DEA被加入CloudFoundry集群中,它需要向大家吼一下,以表明它已經(jīng)準(zhǔn)備好服務(wù)了,它會(huì)發(fā)布一個(gè)主題是”dea.start”的消息:

@ hello_message_json中包括DEA的UUID,ip, port, 版本信息等內(nèi)容。

再例如,CloudController需要啟動(dòng)一個(gè)Droplet的instance:

a)首先一個(gè)DEA在啟動(dòng)的時(shí)候,會(huì)首先會(huì)對自己UUID的消息主題進(jìn)行訂閱。

 

其他模塊需要通過’’dea.#{uuid}.start”這個(gè)主題發(fā)送消息來使它啟動(dòng),一旦這個(gè)DEA接收到消息,就會(huì)觸發(fā)process_dea_start(msg)這個(gè)方法來處理啟動(dòng)所需要的工作。

b)Cloud Controller或者其他模塊發(fā)送消息,讓UUID為xxx的DEA啟動(dòng)。

c)DEA模塊接收到消息后,就會(huì)觸發(fā)process_dea_start(msg)方法。msg是由其他模塊發(fā)送過來的消息內(nèi)容,包括:droplet_id,instance_index, service, runtime等內(nèi)容,process_dea_start會(huì)取得這些啟動(dòng)DEA必須的信息,然后進(jìn)行一系列操作,例如從NFS中取得Droplet,解壓,修改必要環(huán)境配置,運(yùn)行啟動(dòng)腳本等等。等一切都準(zhǔn)備好后,然后需要給Router發(fā)個(gè)消息,告訴它這個(gè)Droplet已經(jīng)隨時(shí)準(zhǔn)備好報(bào)效國家,以后有相應(yīng)的request記得讓它來處理。

 

 

d)Router模塊在啟動(dòng)時(shí)就已經(jīng)訂閱”router.register”消息主題。

 

 

收到前面DEA發(fā)出的信息后,會(huì)觸發(fā)register_droplet方法,去綁定Droplet。到此啟動(dòng)一個(gè)Droplet的instance工作完成。

#p#

我們可以看到整個(gè)CloudFoundry的核心就是一套消息系統(tǒng),如果想了解CloudFoundry的來龍去脈,去跟蹤它里面復(fù)雜的消息機(jī)制是非常好的方法。另一方面,CloudFoundry是一套基于消息的分布式系統(tǒng),面向消息的架構(gòu)是它節(jié)點(diǎn)橫向擴(kuò)展,組件自發(fā)現(xiàn)等云特性的基礎(chǔ)。

Cloud Foundry的架構(gòu)簡單介紹至此,其實(shí)作為第一款開源的PaaS,CloudFoundry架構(gòu)有很多可以學(xué)習(xí)借鑒的地方,很多細(xì)節(jié)上的處理是很精妙的,這些內(nèi)容如果有可能會(huì)在后續(xù)文章繼續(xù)探討,本文題雖為深入CloudFoundry,其實(shí)也只是淺嘗即止,把總體架構(gòu)介紹一下,目標(biāo)在于使我們有足夠的背景知識去用CloudFoundry搭建企業(yè)內(nèi)部的私有PaaS??偨Y(jié)一下,筆者從CloudFoundry的結(jié)構(gòu)中學(xué)到的東西:

1、基于消息的多組件架構(gòu)是實(shí)現(xiàn)集群的簡單、且有效方法。消息可以使集群節(jié)點(diǎn)間解耦,使自注冊,自發(fā)現(xiàn)這些在大規(guī)模數(shù)據(jù)中心中很重要的功能得到實(shí)現(xiàn);

2、適當(dāng)?shù)某橄髮?,模板模式的使用,方便第三方可以方便在CloudFoundry開發(fā)擴(kuò)展功能。CloudFoundry在DEA及Service層都做了抽象層處理,相對應(yīng)地使開發(fā)者可以容易地為CloudFoundry開發(fā)Runtime和Service。例如,在CloudFoundry剛推出的時(shí)候,只支持Node.js,Java, Ruby,但第三方提供商、開源社區(qū)快速跟進(jìn),為CloudFoundry添加了PHP,Python的支持。這得益于CloudFoundry精巧的DEA架構(gòu)設(shè)計(jì),如何開發(fā)新的Runtime支持,會(huì)在后續(xù)博文中有所論述.

二、源碼導(dǎo)讀

筆者一直覺得深入理解一個(gè)技術(shù)的最好方法就是讀它的源碼,而CloudFoundry是完全開源的PaaS平臺,而因?yàn)閯偘l(fā)展起來,代碼量不多,主要作者們的代碼功力也相當(dāng)不錯(cuò),讀起來很舒服,很適合研讀。而不得不再次表揚(yáng)一下它完全基于消息機(jī)制的架構(gòu)設(shè)計(jì),對組件擴(kuò)展性,第三方接入等方面做得很好,讀者可以從中學(xué)到不少思想性的東西。筆者很推薦大家去讀一下它的源代碼。你可以在Github上找到CloudFoundry的全部代碼:https://github.com/cloudfoundry,你會(huì)看到幾個(gè)不同的Repositories,它們分別是:

1、vcap: Cloud Foundry的Core,又或者稱作Kernel;

2、vcap-service: Cloud Foundry的Service組件。Cloud Foundry的service是作為插件提供的,這出于它方便第三方開發(fā)service而設(shè)計(jì)的;

3、vmc: VMware Cloud CLI. 是一個(gè)Ruby應(yīng)用,與Cloud Foundry的CLI交互。主要通過分析用戶輸入的CLI,向CloudFoundry發(fā)送Restful請求;

4、vcap-java: 如果你的app是用java開發(fā),且需要與Cloud Foundry交互,例如取得當(dāng)前serviceserver的ip地址等,你可能需要這個(gè)jar,里面對我們Java開發(fā)常用框架有所支持,它底層也是對CloudFoundry的Restful請求的包裝;

5、vcap-java-client: Cloud Foundry的Restful API的Java封裝,與上面的項(xiàng)目不一樣,它只是個(gè)簡單的讀取CloudFoundry信息,并放如JavaBean中;

6、vcap-test: Cloud Foundry的test cases;

7、vcap-test-assets: Cloud Foundry一些apps示例。

原文鏈接:http://qing.weibo.com/2294942122/88ca09aa330004r8.html

責(zé)任編輯:芳馨 來源: 博客
相關(guān)推薦

2024-03-14 08:33:13

kafka三高架構(gòu)Zookeeper

2021-11-01 17:17:13

Kafka 高并發(fā)場景

2014-11-06 09:49:22

CloudFoundrPaaS

2025-01-15 08:10:29

Java架構(gòu)代碼

2022-11-11 10:48:55

AQS源碼架構(gòu)

2025-06-27 09:24:38

MCP服務(wù)器系統(tǒng)

2025-04-15 04:00:00

2022-11-07 09:25:02

Kafka存儲架構(gòu)

2024-03-12 12:57:07

Redis主從架構(gòu)

2022-03-29 15:10:22

架構(gòu)設(shè)計(jì)模型

2009-12-07 18:43:29

WCF框架

2010-02-06 15:32:30

Android架構(gòu)

2013-05-27 10:58:28

Tumblr架構(gòu)設(shè)計(jì)雅虎收購

2023-05-12 08:06:46

Kubernetes多云架構(gòu)

2023-07-03 17:15:12

系統(tǒng)架構(gòu)設(shè)計(jì)

2021-07-07 10:00:03

深度學(xué)習(xí)系統(tǒng)機(jī)構(gòu)

2016-08-24 16:23:36

服務(wù)架構(gòu)

2015-06-02 04:17:44

架構(gòu)設(shè)計(jì)審架構(gòu)設(shè)計(jì)說明書

2023-07-05 08:00:52

MetrAuto系統(tǒng)架構(gòu)

2025-05-09 08:45:13

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號