微服務已經成為現(xiàn)代軟件開發(fā)的新寵,盡管它們已有十多年的歷史。但是,盡管有好處,但這種范式很容易出錯。那么讓我們來探討一下微服務是什么,更重要的是,它們不是什么。
什么是微服務?
微服務架構是一種軟件設計方法,它將應用程序分解為通過定義明確的 API 進行通信的小型獨立服務。由于每個服務都可以由自治團隊開發(fā)和維護,因此它是最具可擴展性的軟件開發(fā)方法。
微服務與單體
微服務設計與單體開發(fā)截然相反。單體是一個實現(xiàn)所有功能的大型代碼庫(“廚房水槽”)。一切都在一個地方,沒有一個組件可以孤立地工作。這意味著應用程序必須作為一個整體進行測試。
從好的方面來說,單體應用很容易啟動和運行。由于單體架構不同部分之間的關系是透明的,因此進行廣泛的更改很容易。
然而,隨著公司的發(fā)展和團隊規(guī)模的擴大,單體開發(fā)變得更加困難。很快,系統(tǒng)就不能再裝在一個頭上了——移動部件太多了,所以事情變慢了。
微服務使公司能夠保持團隊規(guī)模小而敏捷。這個想法是將應用程序分解為可以由緊密結合的團隊自主開發(fā)和部署的小型服務。
微服務的好處
可擴展性
公司采用微服務的主要原因是可擴展性。服務可以獨立開發(fā)和發(fā)布,無需在組織內安排大規(guī)模的協(xié)調工作。
誤隔離
擁有分布式系統(tǒng)的一個好處是能夠避免單個故障點。您可以使用支持云的技術在不同的可用區(qū)部署微服務,確保您的用戶永遠不會遇到中斷。
較小的團隊
使用微服務,開發(fā)團隊可以保持小而有凝聚力。小組越小,溝通開銷越少,協(xié)作越好。
亞馬遜通過他們的兩個披薩團隊將團隊規(guī)模發(fā)揮到了極致。這意味著一個團隊應該足夠小,可以吃兩個比薩餅。
選擇技術堆棧的自由
對于單體應用,語言和技術堆棧選項幾乎從一開始就設置好了。新開發(fā)人員必須適應過去做出的任何選擇。
相比之下,每個微服務都可以使用最適合解決手頭任務的技術堆棧。因此,團隊可以為工作和他們的技能選擇最佳工具。例如,您可以使用 Go 或 C 實現(xiàn)高性能服務,并使用 Erlang 或 Elixir 實現(xiàn)高容錯微服務。
更頻繁的發(fā)布
隨著小團隊迭代速度更快,開發(fā)和測試周期更短。而且,由于他們還可以隨時部署更新,微服務的部署頻率比單體應用要高得多。
微服務設計挑戰(zhàn)
有這么多好處,似乎為新項目選擇微服務是一件輕而易舉的事。但是微服務設計也帶來了一些嚴峻的挑戰(zhàn):
- Small:適用于團隊規(guī)模和代碼庫。微服務必須小到足以被一個人完全理解。如果從頭開始重寫它需要超過 sprint 的時間,那么你的微服務就太大了。
- 專注于一件事:服務必須專注于問題的一個方面或只執(zhí)行一項任務。
- 自治:自治允許團隊選擇最合適的語言堆棧和數據模型。這通常意味著每個微服務都有自己的數據庫或持久層,不與其他服務共享。
- 與有界上下文一致:在軟件中,我們創(chuàng)建模型來表示我們想要解決的問題。有界上下文表示給定模型的限制。上下文是服務的自然邊界,因此找到它們是設計良好微服務架構的一部分。
- 松耦合:雖然微服務可以依賴于其他微服務,但我們必須注意它們的通信方式。每次跨越有界上下文時,都需要某種程度的抽象和翻譯,以防止一個服務中的行為更改影響其他服務。
- 可獨立部署:由于是自治且松耦合的,團隊可以在幾乎沒有外部協(xié)調或集成測試的情況下部署他們的微服務。微服務應該通過定義明確的 API 進行通信,并使用翻譯層來防止一項服務中的行為更改影響其他服務。
當微服務不是微服務時
你怎么知道你是否在做正確的微服務設計?如果您的團隊可以在不與其他團隊協(xié)調的情況下隨時部署更新,并且如果其他團隊可以類似地部署他們的更改而不影響您,那么恭喜您,您掌握了微服務的訣竅。
失去微服務提供的好處的最可靠方法是不遵守解耦規(guī)則。如果我們仔細觀察,我們會發(fā)現(xiàn)微服務都是關于自治的。當這種自主權喪失時,團隊必須在開發(fā)和部署期間進行協(xié)調。需要完美的集成測試來確保所有微服務協(xié)同工作。
即便如此,詳盡的測試也無法捕捉到所有問題。當出現(xiàn)問題時,耦合服務是很難調試的。當問題被發(fā)現(xiàn)時,修復它并不總是像回滾更新那么容易。
緊密的服務依賴關系創(chuàng)建團隊依賴關系。
這些都是分布式計算帶來的問題。如果您曾經使用過云服務,您就會知道將服務或機器分布在多個地理位置與在同一站點上運行所有內容不同。分布式系統(tǒng)具有更高的延遲,可能存在同步問題,并且更難管理和調試。這種高度耦合的服務架構實際上是一個分布式單體架構,具有兩全其美的優(yōu)點,也沒有微服務應該帶來的任何好處。
如果您在不與其他團隊協(xié)調或依賴其他微服務的特定版本來部署您的微服務的情況下無法進行部署,那么您只是在分發(fā)您的單體應用。
當微服務不是最佳選擇時
微服務并沒有取代單體。兩者都是有效的方法。事實上,當團隊仍在探索他們正在構建的東西時,單體應用可能是最佳選擇。
單體應用就像是項目的自然起點,因為它易于開發(fā)、快速迭代、快速部署、易于調試,并且更能容忍設計錯誤。在可擴展性成為問題之前,單體應用可以讓您走得更遠。
微服務適合您嗎?
微服務是我們開發(fā)軟件的最具可擴展性的方式。但它們不是免費的午餐。如果您不小心,它們會帶來一些很容易發(fā)生沖突的風險。當團隊正在成長并且您需要保持快速和敏捷時,它們非常有用。但是你需要對要解決的問題有一個很好的理解,否則你最終會得到一個分布式的單體。
歡迎關注我的抖音號:
喜歡的朋友記得給個關注~