工作中使用了微服務架構,接下來的一段時間里,,我會寫一系列的文章來介紹微服務架構,,同時我也會在github上寫一個microservices的應用框架(地址會在后續(xù)文章給出)。
這篇文章主要講述了部署一個微服務架構的應用有哪些可選方案,。
翻譯和整理自:
- http:///patterns/deployment/single-service-per-host.html
- http:///patterns/deployment/multiple-services-per-host.html
- http:///patterns/deployment/service-per-vm.html
- http:///patterns/deployment/service-per-container.html
- http:///patterns/deployment/service-deployment-platform.html
- http:///patterns/deployment/serverless-deployment.html
一,、單主機單服務
這種方法的優(yōu)點包括:
- service實例互相分離
- 沒有資源請求沖突或者依賴版本沖突的風險
- 一個service實例只能消耗最多一臺主機的資源
- 很容易監(jiān)控,、管理,、重新部署
缺點:
- 資源利用率可能不如單主機多服務高
二、單主機多個服務
在一臺主機(物理機或者虛擬機)上運行多個不同服務的實例,。
有幾種不同的方法來把一個服務部署在一臺共享的主機上,,包括:
- 把每個service實例部署成JVM實例,。
- 把多個service實例部署在同一個JVM里。
這種模式的優(yōu)點:
- 比單主機單服務有更好的資源利用
這種模式的缺點:
- 有資源需求沖突的風險
- 有依賴版本沖突的風險
- 難以限制一個service實例的資源使用
- 難以監(jiān)控每個服務的資源使用情況
三,、單虛擬機單服務
這種模式的優(yōu)點:
- 可以直接通過提高虛擬機個數(shù)的方式來做scale,,Amazon Autoscaling Groups(譯者注: 不了解的可以去看看AWS的一些基礎知識)甚至可以根據負載做自動化的調節(jié)
- VM包含了構建這個service的所有技術細節(jié),,所有的service都用同樣的方法來開始和停止
- 每個service實例是分離的
- VM會限制一個service實例所消耗的CPU和內存資源
- 例如AWS這樣的IaaS解決方案提供了一個成熟的、有很多特性的基礎設置來部署和管理虛擬機,,比如說,,Elastic Load Balancer、Autoscaling Groups
這種模式的缺點:
- 構建一個VM的Image比較花時間
四,、每個容器一個Service
這種模式的優(yōu)點:
- 可以直接通過改變容器實例的方式來做scale
- 容器包含了構建這個service的所有技術細節(jié),,所有的service都用同樣的方法來開始和停止
- 每個service實例是分離的
- 容器會限制一個service實例所消耗的CPU和內存資源
- Container構建和啟動很快。
這種模式的缺點:
- 部署容器的基礎設置不如部署VM的基礎設置豐富,。
五,、Serverless架構的方式
這個部署的基礎設施由公有云提供商來操作,。它一般使用容器或者虛擬機的方式來分離服務,,但是這些細節(jié)你并不需要知道,。你不需要負責管理操作系統(tǒng)等等?,F(xiàn)在有一些不同的serverless部署的環(huán)境: AWS Lambda,、Google Cloud Functions,、 Azure Functions,, 他們提供了類似的功能,,但是AWS有最豐富的功能,。
一個AWS Lambda function是一個無狀態(tài)的組件,,它被調用去處理事件。 要創(chuàng)建一個AWS Lambda function,, 你需要把你的代碼打包成一個ZIP文件,然后上傳到AWS Lambda,。你同時還要指定這個處理事件的function的名字以及它的資源使用限制,。
當事件產生的時候,,AWS Lambda找到你的function的空閑實例,,然后調用處理的function,。
有四種方法來調用一個Lambda function。
一種選擇是你配置你的Lambda function,,使它對別的AWS service(比如S3, DynamoDB)所產生的事件(比如S3 bucket上創(chuàng)建了一個新的object,、DynamoDB上有條數(shù)據被刪除等等)進行響應。
另一種方法是配置AWS Lambda Gateway,,把HTTP 請求路由到lambda function上。 AWS Gateway把一個HTTP請求轉化成一個事件對象,, 然后調用lambda function,,然后根據lambda function的返回值生成HTTP響應,。
你也可以通過AWS Lambda Web Service API明確調用Lambda function,。你調用Lambda function的應用提供一個JSON對象,,傳給Lambda function,, web service會把結果返回給你,。
第四種方法是使用CRON的方式周期性調用。比如說,,你可以告訴AWS每5分鐘調用一次你的Lambda function,。
這種模式的優(yōu)點:
- 不需要關心底層架構,只要關注代碼
- 非常有彈性,,根據負載自動scale
- 只要為請求數(shù)付錢,, 便宜
這種模式的缺點:
- 這種架構比VM或者容器有更多的限制。比如說,,AWS只支持很少幾種語言,,只適用于部署響應請求的無狀態(tài)應用,,你不能部署一個長期運行的有狀態(tài)的應用如數(shù)據庫,、消息代理
- 輸入源有限制。比如說AWS Lambda不能訂閱一個像RabbitMQ那樣的消息代理
- 應用必須快速啟動,。Serverless 架構不適用于花很多時間啟動的service
- 高延遲的風險,。基礎設施在為你的function啟動一個instance,、function 初始化的時間可能比較長,。當突發(fā)的、大量請求進來的時候,,一開始會比較緩慢,。