国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
基于微服務(wù)的軟件架構(gòu)模式

今天閱讀了兩篇關(guān)于微服務(wù)的文章,總結(jié)一些筆記,簡單翻譯了一篇文章。說明:并沒有嚴(yán)格按照原文一字語句翻譯,有部分自己的理解,還有部分是意譯。

微服務(wù)(micro services)這個概念不是新概念,很多公司已經(jīng)在實(shí)踐了,例如亞馬遜、Google、FaceBook、Alibaba。微服務(wù)架構(gòu)模式(Microservices Architecture Pattern)的目的是將大型的、復(fù)雜的、長期運(yùn)行的應(yīng)用程序構(gòu)建為一組相互配合的服務(wù),每個服務(wù)都可以很容易得局部改良。 Micro這個詞意味著每個服務(wù)都應(yīng)該足夠小,但是,這里的小不能用代碼量來比較,而應(yīng)該是從業(yè)務(wù)邏輯上比較——符合SRP原則的才叫微服務(wù)。

暫且不討論大小問題,讀者朋友你首先要考慮的是如何解決目前技術(shù)團(tuán)隊(duì)遇到的開發(fā)問題、部署問題。正是在解決這些問題的過程中,才漸漸總結(jié)提煉出了微服務(wù)架構(gòu)模式的概念。

微服務(wù)跟SOA有什么區(qū)別呢,可以把微服務(wù)當(dāng)做去除了ESB的SOA。ESB是SOA架構(gòu)中的中心總線,設(shè)計圖形應(yīng)該是星形的,而微服務(wù)是去中心化的分布式軟件架構(gòu)。

接下來會討論以下幾個話題:

  1. 應(yīng)用微服務(wù)的動機(jī),跟傳統(tǒng)巨石應(yīng)用的比較

  2. 微服務(wù)的優(yōu)點(diǎn)與缺點(diǎn)

  3. 應(yīng)用微服務(wù)架構(gòu)設(shè)計時可能遇到的關(guān)鍵問題(內(nèi)部服務(wù)通信、分布式數(shù)據(jù)管理)

1
巨石(monolith)應(yīng)用

web應(yīng)用程序發(fā)展的早期,大部分web工程是將所有的功能模塊(service side)打包到一起并放在一個web容器中運(yùn)行,很多企業(yè)的Java應(yīng)用程序打包為war包。其他語言(Ruby、Python或者C++)寫的程序也有類似的問題。

假設(shè)你正在構(gòu)建一個在線商店系統(tǒng):客戶下訂單、核對清單和信用卡額度,并將貨物運(yùn)輸給客戶。很快,你們團(tuán)隊(duì)一定能構(gòu)造出如下圖所示的系統(tǒng)。


這種將所有功能都部署在一個web容器中運(yùn)行的系統(tǒng)就叫做巨石型應(yīng)用。巨石型應(yīng)用有很多好處:IDE都是為開發(fā)單個應(yīng)用設(shè)計的、容易測試——在本地就可以啟動完整的系統(tǒng)、容易部署——直接打包為一個完整的包,拷貝到web容器的某個目錄下即可運(yùn)行。

但是,上述的好處是有條件的:應(yīng)用不那么復(fù)雜。對于大規(guī)模的復(fù)雜應(yīng)用,巨石型應(yīng)用會顯得特別笨重:要修改一個地方就要將整個應(yīng)用全部部署(PS:在不同的場景下優(yōu)勢也變成了劣勢);編譯時間過長;回歸測試周期過長;開發(fā)效率降低等。另外,巨石應(yīng)用不利于更新技術(shù)框架,除非你愿意將系統(tǒng)全部重寫(代價太高你愿意老板也不愿意)。

2
巨石應(yīng)用的拆分

詳細(xì)一個網(wǎng)站在業(yè)務(wù)大規(guī)模爬升時會發(fā)生什么事情?并發(fā)度不夠?OK,加web服務(wù)器。數(shù)據(jù)庫壓力過大?OK,買更大更貴的數(shù)據(jù)庫。數(shù)據(jù)庫太貴了?將一個表的數(shù)據(jù)分開存儲,俗稱“分庫分表”。這些都沒有問題,good job。不過,老外的抽象能力比我們強(qiáng),看下圖Fig2。


這張圖從三個維度概括了一個系統(tǒng)的擴(kuò)展過程:(1)x軸,水平復(fù)制,即在負(fù)載均衡服務(wù)器后增加多個web服務(wù)器;(2)z軸擴(kuò)展,是對數(shù)據(jù)庫的擴(kuò)展,即分庫分表(分庫是將關(guān)系緊密的表放在一臺數(shù)據(jù)庫服務(wù)器上,分表是因?yàn)橐粡埍淼臄?shù)據(jù)太多,需要將一張表的數(shù)據(jù)通過hash放在不同的數(shù)據(jù)庫服務(wù)器上);(3)y軸擴(kuò)展,是功能分解,將不同職能的模塊分成不同的服務(wù)。從y軸這個方向擴(kuò)展,才能將巨型應(yīng)用分解為一組不同的服務(wù),例如訂單管理中心、客戶信息管理中心、商品管理中心等等。

將系統(tǒng)劃分為不同的服務(wù)有很多方法:(1)按照用例劃分,例如在線商店系統(tǒng)中會劃分出一個checkout UI服務(wù),這個服務(wù)實(shí)現(xiàn)了checkout這個用例;(2)按照資源劃分,例如可以劃分出一個catlog服務(wù)來存儲產(chǎn)品目錄。

服務(wù)劃分有兩個原則要遵循:(1)每個服務(wù)應(yīng)該盡可能符合單一職責(zé)原則——Single Responsible Principle,即每個服務(wù)只做一件事,并把這件事做好;(2)參考Unix命令行工具的設(shè)計,Unix提供了大量的簡單易用的工具,例如grep、cat和find。每個工具都小而美。

最后還要強(qiáng)調(diào):系統(tǒng)分解的目標(biāo)并不僅僅是搞出一堆很小的服務(wù),這不是目標(biāo);真正的目標(biāo)是解決巨石型應(yīng)用在業(yè)務(wù)急劇增長時遇到的問題。

對于上面的例子,按照功能和資源劃分后,就形成下面圖3的架構(gòu)圖。分解后的微服務(wù)架構(gòu)包含多個前端服務(wù)和后端服務(wù)。前端服務(wù)包括Catalog UI(用于商品搜索和瀏覽)、Checkout UI(用于實(shí)現(xiàn)購物車和下單操作);后端服務(wù)包括一些業(yè)務(wù)邏輯模塊,我們將在巨石應(yīng)用中的每個服務(wù)模塊重構(gòu)為一個單獨(dú)的服務(wù)。這么做有什么問題呢?



3
微服務(wù)架構(gòu)的優(yōu)點(diǎn)與缺點(diǎn)
1
優(yōu)點(diǎn)
  • 每個服務(wù)足夠內(nèi)聚,足夠小,代碼容易理解、開發(fā)效率提高;

  • 服務(wù)之間可以獨(dú)立部署,微服務(wù)架構(gòu)讓持續(xù)部署成為可能;

  • 每個服務(wù)可以各自進(jìn)行x擴(kuò)展和z擴(kuò)展,而且,每個服務(wù)可以根據(jù)自己的需要部署到合適的硬件服務(wù)器上;

  • 容易擴(kuò)大開發(fā)團(tuán)隊(duì),可以針對每個服務(wù)(service)組件開發(fā)團(tuán)隊(duì);

  • 提高容錯性(fault isolation),一個服務(wù)的內(nèi)存泄露并不會讓整個系統(tǒng)癱瘓;

  • 系統(tǒng)不會被長期限制在某個技術(shù)棧上。

2
缺點(diǎn)

《人月神話》中講到:沒有銀彈,意思是只靠一把錘子是蓋不起摩天大樓的,要根據(jù)業(yè)務(wù)場景選擇設(shè)計思路和實(shí)現(xiàn)工具。我們看下為了換回上面提到的好處,我們付出(trade)了什么?

  • 開發(fā)人員要處理分布式系統(tǒng)的復(fù)雜性;開發(fā)人員要設(shè)計服務(wù)之間的通信機(jī)制,對于需要多個后端服務(wù)的user case,要在沒有分布式事務(wù)的情況下實(shí)現(xiàn)代碼非常困難;涉及多個服務(wù)直接的自動化測試也具備相當(dāng)?shù)奶魬?zhàn)性;

  • 服務(wù)管理的復(fù)雜性,在生產(chǎn)環(huán)境中要管理多個不同的服務(wù)的實(shí)例,這意味著開發(fā)團(tuán)隊(duì)需要全局統(tǒng)籌(PS:現(xiàn)在docker的出現(xiàn)適合解決這個問題);

  • 應(yīng)用微服務(wù)架構(gòu)的時機(jī)如何把握?對于業(yè)務(wù)還沒有理清楚、業(yè)務(wù)數(shù)據(jù)和處理能力還沒有開始爆發(fā)式增長之前的創(chuàng)業(yè)公司,不需要考慮微服務(wù)架構(gòu)模式,這時候最重要的是快速開發(fā)、快速部署、快速試錯。

4
微服務(wù)架構(gòu)的關(guān)鍵問題
1
微服務(wù)架構(gòu)的通信機(jī)制

客戶端與服務(wù)器之間的通信

在巨石型架構(gòu)下,客戶端應(yīng)用程序(web或者app)通過向服務(wù)端發(fā)送HTTP請求;但是,在微服務(wù)架構(gòu)下,原來的巨石型服務(wù)器被一組微服務(wù)替代,這種情況下客戶端如何發(fā)起請求呢?

如圖4中所示,客戶端可以向micro service發(fā)起RESTful HTTP請求,但是會有這種情況發(fā)生:客戶端為了完成一個業(yè)務(wù)邏輯,需要發(fā)起多個HTTP請求,從而造成系統(tǒng)的吞吐率下降,再加上無線網(wǎng)絡(luò)的延遲高,會嚴(yán)重影響客戶端的用戶體驗(yàn)。


為了解決這個問題,一般會在服務(wù)器集群前面再加一個角色:API gateway,由它負(fù)責(zé)與客戶度對接,并將客戶端的請求轉(zhuǎn)化成對內(nèi)部服務(wù)的一系列調(diào)用。這樣做還有個好處是,服務(wù)升級不會影響到客戶端,只需要修改API gateway即可。加了API gateway之后的系統(tǒng)架構(gòu)圖如圖5所示。



內(nèi)部服務(wù)之間的通信

內(nèi)部服務(wù)之間的通信方式有兩種:基于HTTP協(xié)議的同步機(jī)制(REST、RPC);基于消息隊(duì)列的異步消息處理機(jī)制(AMQP-based message broker)。

Dubbo是阿里巴巴開源的分布式服務(wù)框架,屬于同步調(diào)用,當(dāng)一個系統(tǒng)的服務(wù)太多時,需要一個注冊中心來處理服務(wù)發(fā)現(xiàn)問題,例如使用ZooKeeper這類配置服務(wù)器進(jìn)行服務(wù)的地址管理:服務(wù)的發(fā)布者要向ZooKeeper發(fā)送請求,將自己的服務(wù)地址和函數(shù)名稱等信息記錄在案;服務(wù)的調(diào)用者要知道服務(wù)的相關(guān)信息,具體的機(jī)器地址在ZooKeeper查詢得到。這種同步的調(diào)用機(jī)制足夠直觀簡單,只是沒有“訂閱——推送”機(jī)制。

AMQP-based的代表系統(tǒng)是Kafka、RabbitMQ等。這類分布式消息處理系統(tǒng)將訂閱者和消費(fèi)者解耦合,消息的生產(chǎn)者不需要消費(fèi)者一直在線;消息的生產(chǎn)者只需要把消息發(fā)送給消息代理,因此也不需要服務(wù)發(fā)現(xiàn)機(jī)制。

兩種通信機(jī)制都有各自的優(yōu)點(diǎn)和缺點(diǎn),實(shí)際中的系統(tǒng)經(jīng)常包含兩種通信機(jī)制。例如,在分布式數(shù)據(jù)管理中,就需要同時用到同步HTTP機(jī)制和異步消息處理機(jī)制。

2
分布式數(shù)據(jù)管理

處理讀請求

在線商店的客戶賬戶有限額,當(dāng)客戶試圖下單時,系統(tǒng)必須判斷總的訂單金額是否超過他的信用卡額度。信用卡額度由CustomerService管理、下訂單的操作由OrderService負(fù)責(zé),因此Order Service要通過RPC調(diào)用向Customer Service請求數(shù)據(jù);這種方法能夠保證每次Order Service都獲取到準(zhǔn)確的額度,單缺點(diǎn)是多一次RPC調(diào)用、而且Customer Service必須保持在線。

還有一種處理方式是,在OrderService這邊存放一份信用卡額度的副本,這樣就不需要實(shí)時發(fā)起RPC請求,但是還需要一種機(jī)制保證——當(dāng)Customer Service擁有的信用卡額度發(fā)生變化時,要及時更新存放在Order Service這邊的副本。

處理更新請求

當(dāng)一份數(shù)據(jù)位于多個服務(wù)上時,必須保證數(shù)據(jù)的一致性。

分布式事務(wù)(Distributed transactions) 使用分布式事務(wù)非常直觀,即要更新Customer Service上的信用卡額度,就必須同時更新其他服務(wù)上的副本,這些操作要么全做要么全不做。使用分布式事務(wù)能夠保證數(shù)據(jù)的強(qiáng)一致,但是會降低系統(tǒng)的可用性——所有相關(guān)的服務(wù)必須始終在線;而且,很多現(xiàn)代的技術(shù)棧并不支持事務(wù),例如REST、NoSQL數(shù)據(jù)庫等。

基于事件的異步更新(Event-driven asynchronous updates) Customer Service中的信用卡額度改變時,它對外發(fā)布一個事件到“message broker(消息代理人)”;其他訂閱了這個事件的服務(wù)受到提示后就更新數(shù)據(jù)。事件流如圖6所示。


5
重構(gòu)巨石型應(yīng)用

在實(shí)際工作中,很少有機(jī)會參與一個全新的項(xiàng)目,需要處理的差不多都是存在這樣那樣問題的復(fù)雜、大型應(yīng)用。這時候如何在維護(hù)老服務(wù)的同時,將系統(tǒng)漸漸重構(gòu)為微服務(wù)架構(gòu)呢?

不要讓事情更壞,有新的需求過來時,如果可以獨(dú)立開發(fā)為一個服務(wù),就單獨(dú)開發(fā),然后為老服務(wù)和新服務(wù)直接編寫膠水代碼(Glue Code)——這個過程不容易,但這是分解巨型服務(wù)的第一步,如圖7所示;


識別巨石型應(yīng)用中的可以分離出來當(dāng)做單獨(dú)服務(wù)的模塊,一般適合分離的模塊具有如下特點(diǎn):兩個模塊對資源的需求是沖突的(一個是CPU密集型、一個是IO密集型);授權(quán)鑒定層也適合單獨(dú)分離出一個服務(wù)。每分離出一個服務(wù),就需要編寫對應(yīng)的膠水代碼來與剩下的服務(wù)通信,這樣,在逐漸演進(jìn)過程中,就完成了整個系統(tǒng)的架構(gòu)更新。
關(guān)于重構(gòu),有篇文章推薦大家閱讀——推倒重來的講究,關(guān)于重構(gòu)有很多可以寫的,希望我能快速進(jìn)步,多寫點(diǎn)總結(jié)與大家分享。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
大神告訴你如何理解微服務(wù)框架
自動駕駛軟件架構(gòu)之:中間件與SOA(二)
微服務(wù)架構(gòu)(Microservice Architecture)
Java學(xué)習(xí)路線:SpringCloud
架構(gòu)解密:從分布式到微服務(wù)
小講 云計算體系架構(gòu)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服