本文將介紹微服務架構和相關的元件,介紹他們是什麼以及為什麼要使用微服務架構和這些元件。本文側重於簡明地表達微服務架構的全域性圖景,因此不會涉及具體如何使用元件等細節。
要理解微服務,首先要先理解不是微服務的那些。通常跟微服務相對的是單體應用,即將所有功能都打包成在乙個獨立單元的應用程式。從單體應用到微服務並不是一蹴而就的,這是乙個逐漸演變的過程。本文將以乙個網上超市應用為例來說明這一過程。
幾年前,小明和小皮一起創業做網上超市。小明負責程式開發,小皮負責其他事宜。當時網際網路還不發達,網上超市還是藍海。只要功能實現了就能隨便賺錢。所以他們的需求很簡單,只需要乙個**掛在公網,使用者能夠在這個**上瀏覽商品、購買商品;另外還需乙個管理後台,可以管理商品、使用者、以及訂單資料。
管理後台
小明揮一揮手,找了家雲服務部署上去,**就上線了。上線後好評如潮,深受各類肥宅喜愛。小明小皮美滋滋地開始躺著收錢。
好景不長,沒過幾天,各類網上超市緊跟著拔地而起,對小明小皮造成了強烈的衝擊。
在競爭的壓力下,小明小皮決定開展一些營銷手段:
這些活動都需要程式開發的支援。小明拉了同學小紅加入團隊。小紅負責資料分析以及移動端相關開發。小明負責**活動相關功能的開發。
這一階段存在很多不合理的地方:
儘管有著諸多問題,但也不能否認這一階段的成果:快速地根據業務變化建設了系統。不過緊迫且繁重的任務容易使人陷入區域性、短淺的思維方式,從而做出妥協式的決策。在這種架構中,每個人都只關注在自己的一畝三分地,缺乏全域性的、長遠的設計。長此以往,系統建設將會越來越困難,甚至陷入不斷推翻、重建的迴圈。
幸好小明和小紅是有追求有理想的好青年。意識到問題後,小明和小紅從瑣碎的業務需求中騰出了一部分精力,開始梳理整體架構,針對問題準備著手改造。
要做改造,首先你需要有足夠的精力和資源。如果你的需求方(業務人員、專案經理、上司等)很強勢地一心追求需求進度,以致於你無法挪出額外的精力和資源的話,那麼你可能無法做任何事……各個應用後台只需從這些服務獲取所需的資料,從而刪去了大量冗餘的**,就剩個輕薄的控制層和前端。這一階段的架構如下:
這個階段只是將服務分開了,資料庫依然是共用的,所以一些煙囪式系統的缺點仍然存在:
資料庫成為效能瓶頸,並且有單點故障的風險。
資料管理趨向混亂。即使一開始有良好的模組化設計,隨著時間推移,總會有乙個服務直接從資料庫取另乙個服務的資料的現象。
資料庫表結構可能被多個服務依賴,牽一髮而動全身,很難調整。
如果一直保持共用資料庫的模式,則整個架構會越來越僵化,失去了微服務架構的意義。因此小明和小紅一鼓作氣,把資料庫也拆分了。所有持久化層相互隔離,由各個服務自己負責。另外,為了提高系統的實時性,加入了訊息佇列機制。架構如下:
完全拆分後各個服務可以採用異構的技術。比如資料分析服務可以使用資料倉儲作為持久化層,以便於高效地做一些統計計算;商品服務和**服務訪問頻率比較大,因此加入了快取機制等。
還有一種抽象出公共邏輯的方法是把這些公共邏輯做成公共的框架庫。這種方法可以減少服務呼叫的效能損耗。但是這種方法的管理成本非常高昂,很難保證所有應用版本的一致性。
資料庫拆分也有一些問題和挑戰:比如說跨庫級聯的需求,通過服務查詢資料顆粒度的粗細問題等。但是這些問題可以通過合理的設計來解決。總體來說,資料庫拆分是乙個利大於弊的。微服務架構還有乙個技術外的好處,它使整個系統的分工更加明確,責任更加清晰,每個人專心負責為其他人提供更好的服務。在單體應用的時代,公共的業務功能經常沒有明確的歸屬。最後要麼各做各的,每個人都重新實現了一遍;要麼是隨機乙個人(一般是能力比較強或者比較熱心的人)做到他負責的應用裡面。在後者的情況下,這個人在負責自己應用之外,還要額外負責給別人提供這些公共的功能——而這個功能本來是無人負責的,僅僅因為他能力較強 / 比較熱心,就莫名地背鍋(這種情況還被美其名曰能者多勞)。結果最後大家都不願意提供公共的功能。長此以往,團隊裡的人漸漸變得各自為政,不再關心全域性的架構設計。
從這個角度上看,使用微服務架構同時也需要組織結構做相應的調整。所以說做微服務改造需要管理者的支援。
改造完成後,小明和小紅分清楚各自的鍋。兩人十分滿意,一切就像是麥克斯韋方程組一樣漂亮完美。
然而……
「不積跬步,無以至千里」,希望未來的你能:有夢為馬 隨處可棲!加油,少年!
一文詳解TCP協議
osi層 功能tcp ip協議 應用層文字傳輸,電子郵件,檔案服務,虛擬終端 ftp,http,snmp,dns等 表示層 資料格式化,轉換,資料加密 沒有協議 會話層 解除或建立與其他節點的聯絡 沒有協議 傳輸層提供端對端的介面 tcp,udp 網路層為資料報選擇路由 ip,icmp,rip,os...
一文詳解 I O 優化
在沒有 dma 技術之前,i o過程是這樣的 cpu 發出對應的指令給磁碟控制器,飯後返回。磁碟控制器收到指令後,於是就開始準備資料,會把資料放入到磁碟控制器的內部緩衝區中,然後產生乙個中斷。cpu 收到中斷訊號後,停下手頭的工作,接著把磁碟控制器的緩衝區的資料一次乙個位元組地讀進自己的暫存器,然後...
一文詳解scp命令
加密的方式在本地主機和遠端主機之間複製檔案 scp命令用於在linux下進行遠端拷貝檔案的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為唯讀read only system時,用scp可以幫你把檔案移出來。另外,...