華為架構師談如何理解運用模塊與微服務

模塊化還是微服務?

我們的業務由一個大型應用轉向微服務的時候,除了很好展示漂亮的PPT,提升KPI之外,實際操作時將整個業務切成微型服務似乎也不費吹灰之力。但這種方法真的是我們的最佳選擇嗎?確實,維護凌亂的單片應用程序有許多缺點。但是有一個令人信服的替代方案經常被忽視:模塊化應用程序開發。 在本文中,我們將探討這種替代方案的含義,并展示它與構建微服務的關系。

什么是微服務?

微服務現在越來越火爆,但是到底什么是微服務?Sam Newman在《構建微服務》中提供了對微服務的簡潔定義是:“微服務是一種小型,自主的服務,且相互之間可以協同工作。”

在《微服務架構》這本書中,作者Mike Amundsen,Irakli Nadareishvili,Ronnie Mitra和Matt McLarty通過概述微服務應用程序共享的特征說明微服務的細節:

  • 體積小
  • 啟用消息
  • 以上下文為界
  • 自主開發
  • 可獨立部署
  • 分散
  • 使用自動化流程構建和發布

一、模塊化的微服務

“通過微服務,我們最終可以讓團隊獨立工作”,或者“我們的應用太復雜,這讓我們放慢腳步”。這些表達只是導致開發團隊走上微服務道路的眾多原因中的一小部分。另一個問題是需要可擴展性和彈性。開發人員似乎總是渴望的是系統設計和開發的模塊化方法。

軟件開發中的模塊化可以歸結為三個指導原則:

1.1,強大的封裝

隱藏組件內部的實現細節,導致不同部件之間的低耦合。團隊可以在系統的分離部分上獨立工作。

1.2,定義良好的接口

您無法隱藏所有內容(否則您的系統不會做任何有意義的事情),因此組件之間定義良好且穩定的API是必須的。組件可以由符合接口規范的任何實現替換。

1.3,顯式依賴

擁有模塊化系統意味著不同的組件必須協同工作。你最好有一種表達(和驗證)他們關系的好方法。

上述原則可以通過微服務實現。而微服務可以用任何方式實現,只要它為其他服務公開定義良好的接口(通常是REST API)即可。其實施細節是服務的內部細節,可以在沒有全系統影響或協調的情況下進行更改。但微服務之間的依賴關系在開發時通常不是很明確,導致運行時可能的服務編排失敗。

因此,微服務實現了重要的模塊化原則,從而帶來了實實在在的好處:

  • 團隊可以獨立工作和擴展。
  • 微服務規模小,重點突出,降低了復雜性。
  • 服務可在內部更改或替換,而不會產生全局影響。

當我們從一個(雖然有點臃腫)應用程序轉變為分布式微服務系統,這其實帶來了大量的操作復雜性。突然間,您需要不斷部署許多不同的(可能是容器化的)服務。出現了新的問題:服務發現,分布式日志記錄,跟蹤等。現在更容易出現分布式計算下的錯誤了。接口和配置管理的版本控制也會成為一個主要問題。而且問題清單會一直增長下去。

事實證明,微服務之間的連接與所有單個微服務的組合業務邏輯一樣復雜。雖然整體代碼庫中的“意大利面條代碼”存在問題,但在這兩者之間存在網絡邊界會使這些糾纏問題升級為徹頭徹尾的痛苦。

ps:意大利面條代碼是非結構化和難以維護的源代碼的貶義詞。可能由多種因素引起,例如易變的項目要求,缺乏編程風格規則以及能力或經驗不足。

二、模塊化替代方案

這是否意味著我們要么被降級為凌亂的大型應用,還是必須淹沒在微服務瘋狂的復雜性中?模塊化也可以通過其他方式實現。重要的是我們可以在開發過程中有效地繪制和強制執行邊界。但我們也可以通過創建一個結構良好的大型應用來實現這一目標。當然,這意味著我們往往會從編程語言和開發工具中獲得幫助,以實施模塊化原則。

例如,在Java中,有幾個模塊系統可以幫助構建應用程序。 OSGi是最著名的一個,但隨著Java 9的發布,Java平臺本身就添加了一個本機模塊系統。模塊這種特性作為一流的結構現在是語言和平臺的一部分。 Java模塊可以表達對其他模塊的依賴關系,并在強大地封裝實現類的同時公開導出接口。甚至Java平臺本身(一個龐大的代碼庫)也使用新的Java模塊系統進行了模塊化。

其他語言提供類似的機制。例如,JavaScript從ES2015開始獲得了一個模塊系統。在此之前,Node.js已經為JavaScript后端提供了一個非標準的模塊系統。但是,作為一種動態語言,JavaScript對實施接口(類型)和模塊之間的封裝的支持較弱。可以考慮在JavaScript之上使用TypeScript再次獲得此優勢。微軟的.Net Framework確實具有類似Java的強類型,但它在強大的封裝和程序集之間的顯式依賴性方面沒有直接等同于Java即將推出的模塊系統。盡管如此,通過使用在.Net Core中標準化的Inversion-of-Control模式以及通過創建邏輯相關的程序集,可以實現良好的模塊化體系結構。甚至C ++也在考慮在未來的版本中增加一個模塊系統。許多語言對模塊化越來越感興趣,模塊化本身就是一個引人注目的發展。

當我們有意識地使用開發平臺的模塊化功能時,您可以實現我們之前歸因于微服務的相同模塊化優勢。從本質上講,模塊系統越好,在開發過程中獲得的幫助就越多。不同的團隊可以在不同的部分上工作,其中只有明確定義的接口才是團隊之間的接觸點。但是,在部署時,模塊在一個部署單元中聚集在一起。這樣,您可以防止與遷移到微服務開發和管理相關的實質復雜性和成本。當然,這意味著無法在不同的技術棧上構建每個模塊,不過對大多數公司和開發團隊而言,真的能掌控好多個技術棧?

三、設計模塊

創建好的模塊需要與創建良好的微服務相同的設計要求。模塊應該模擬業務域的單個有界上下文。選擇微服務邊界是一項架構上重要的決策,如果做錯了,會產生代價高昂的后果。而模塊化應用程序中的模塊邊界更容易更改。類型系統和編譯器通常支持跨模塊的重構。重新劃分微服務邊界需要進行大量的人際交流,以免在運行時爆炸。

在許多方面,靜態類型語言中的模塊為定義良好的接口提供了更好的結構。通過另一個模塊公開的類型化接口調用方法對于更改比在另一個微服務上調用REST端點要強大得多。 REST + JSON無處不在,但在沒有(編譯器檢查的)模式的情況下,它不是良好類型的互操作性的標志。更重要的是,許多模塊系統允許表達對其他模塊的依賴性,當違反這些依賴項時,模塊系統會禁止這樣做,至少會有個明確的提示,但微服務之間的依賴關系僅在運行時實現,導致難以調試的系統。

模塊也是代碼所有權的自然單位。團隊可以負責系統中的一個或多個模塊。與其他團隊共享的唯一事情是其模塊的公共API。在運行時,與微服務相比,模塊之間的隔離更少。畢竟,一切仍然在同一個進程中運行。

沒有理由為什么單塊中的模塊不能像一個好的微服務那樣擁有它的數據。然后,模塊化應用程序內的共享可以通過模塊之間定義良好的接口或消息進行,而不是通過共享數據存儲區。微服務的最大區別在于一切都在進行中。不應低估最終的一致性問題。通過模塊,最終的一致性可以是一個深思熟慮的戰略選擇,而不是無法避免的選擇。對于微服務,沒有選擇:只能選擇最終的一致性。

四、微服務什么時候適合您的組織?

那么什么時候應該轉向微服務?到目前為止,我們主要專注于通過模塊化來解決復雜性問題。為此,微服務和模塊化應用程序都可以。但除了迄今為止提出的挑戰之外,還有不同的挑戰。

  • 當公司有Google或Netflix的規模時,完全有理由接受微服務。這意味著,有能力構建自己的平臺和工具包,并且工程師的數量也已經足夠。但是大多數組織并沒有以這種規模運作。哪怕是公司有一天會成為價值10億美元的獨角獸,從模塊化的大型應用開始也不會造成什么問題。

  • 啟動單獨的微服務的另一個好理由是,不同的服務本質上更適合于不同的技術棧。也就是鎖,必須擁有足夠的規模來吸引這些不同的技術棧中的人才,并保持這些平臺的正常運行。

  • 微服務還可以獨立部署系統的不同部分,這在大多數模塊化平臺中很難(甚至不可能)。隔離部署增加了系統的彈性和容錯能力。此外,縮放特性對于每個微服務可以是不同的。可以將不同的微服務部署到匹配的硬件上。模塊化的整體也可以水平縮放,但是更細微的就很困難。但是在一般實踐中,模塊化這種方式可以支持很久的業務發展。

五、結論

如何選擇?其實取決于環境,組織和應用程序本身。我們可以從模塊化應用程序開始,然后隨時選擇轉移到微服務,還可以使用模塊在內部構建微服務。

如果我們追求模塊化的好處,請確保我們不要落入只能使用微服務的思維模式。盡可能的在最喜歡或者最擅長的技術棧使用內置的模塊化功能或框架。

作者:享學課堂Mark

轉載請注明出處。

持續關注我,分享更多干貨。

轉載于:https://juejin.im/post/5d0b55dc6fb9a07efe2dc316

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274924.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node.js 可以和 Web 實現 HTTP 請求的跨平臺兼容了!

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列大家好…

zeplin加載 不出圖片_為什么Zeplin不能解決您的所有問題

zeplin加載 不出圖片Design handover involves communicating the visual styles and behaviours of your design so they can be translated into code.設計移交涉及傳達設計的視覺樣式和行為,以便可以將它們轉換為代碼。 Back in the Dark Ages of digital desig…

POJ 基礎數學

數學 組合數學 POJ3252,poj1850,poj1019,poj1942 數論 poj2635, poj3292,poj1845,poj2115 計算方法(二分) poj3273,poj3258,poj1905,poj3122 組合數學 poj 3252 題意:如果一個數是round number,則它的二進制表示中&#xff…

使用uwsgi和gunicorn部署Django項目

https://uwsgi-docs.readthedocs.io/en/latest/Management.html https://uwsgi-docs.readthedocs.io/en/latest/Management.html 先了解下相關殺進程命令 ps -ef|grep uwsgi|grep -v grep|awk {print $2}|xargs kill -9//查看uwsgi相關接口 ps -ef|grep uwsgi #查看相關端口 ne…

推薦2022前端必看的新書 《Vue.js設計與實現》

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列這本新…

漢堡菜單_漢堡菜單-可訪問性和用戶體驗設計原則的挑戰?

漢堡菜單重點 (Top highlight)I was recently designing a hamburger menu for a client and before I knew it, I had embarked on this journey where I was reading article after article about the accessibility issues which accompany a hamburger icon. Turns out, th…

Server2012R2 ADFS3.0 The same client browser session has made '6' requests in the last '13'seconds

本問題是在windows server2012R2系統ADFS3.0環境下遇到的,CRM2013部署ADFS后運行一段時間(大概有一兩個月)后在IE瀏覽器中訪問登陸界面點擊登陸后就報以下錯誤 “Microsoft.IdentityServer.Web.InvalidRequestException: MSIS7042: The same client browser session…

(原創)RHEL/CentOS 5.x使用yum快速安裝MySQL 5.5.x

PS:MySQL 5.5系列成為穩定版已經有一段時間了,但據我調查了解,在生產環境中還是以5.1系列為主。在國內的大公司里,只確定金山在使用5.5了。 公司的其中幾臺廣告統計服務器,之前的運維直接用了自帶安裝的MySQL 5.0系列。…

又一個基于 Esbuild 的神器!esno

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan02 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列esno我…

c# ui 滾動 分頁_UI備忘單:分頁,無限滾動和“加載更多”按鈕

c# ui 滾動 分頁重點 (Top highlight)When you have a lot of content, you have to rely on one of these three patterns to load it. So, which is best? What will your users like? What do most platforms use? These are the questions we will explore today.當內容…

1.20(設計模式)模板模式

模板模式,定義了一個模板,模板內容通過子類實現模板的抽象方法去添加。 就類似學校需要建一個新校區,新校區有多棟宿舍,找了多個施工方,每個施工方負責一棟宿舍樓。 各個施工方都有自己的想法,建造的宿舍樓…

少年,看你異于常人,有空花2小時來參加有3000人的源碼共讀嘛~

大家好,我是若川。按照從易到難的順序,前面幾期(比如:validate-npm-package-name、axios工具函數)很多都只需要花2-3小時就能看完,并寫好筆記。但收獲確實很大。開闊視野、查漏補缺、升職加薪。已經有400筆…

HDU 3488 KM

http://acm.hdu.edu.cn/showproblem.php?pid3488 依然KM, 可以最小費用流 與HDU1853 差不多,但是1853要判斷是否滿足回路的的條件,KM還不會判回路,所以做1853時學了最小費用流做的,說是學最小費用流 只是皮毛了。。…

Java 面向對象的程序設計(二)

編寫一個java程序,設計一個汽車類Vehicle,包含的屬性有車輪的個數wheels和車重weight。小汽車類Car是Vehicle的子類,包含的屬性有載人數loader。卡車類Truck是Car類的子類,其中包含的屬性有載重量payload。每個類都有構造方法和輸…

16位調色板和32位調色板_使調色板可訪問

16位調色板和32位調色板Accessibility has always been a tough sell. Admittedly, less so than in the ‘nineties, when no prospective client was interested. But even today — more enlightened times — the majority of companies I encounter still prefer to make …

從零開始發布自己的NPM包

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan02 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列在Ver…

flash不能訪問本地文件

flash出現"不能訪問本地資源";解決方案 linux下,如果沒有文件夾自行創建 在/home/{user}/.macromedia/Flash_Player/#Security/FlashPlayerTrust下面,隨便建個文本文件,比如1.txt 然后寫入路徑,最省事的辦法直接來個/ 兇…

Jest + React Testing Library 單測總結

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan02 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列1、背…

不怕神一樣的對手就怕豬一樣的隊友

“不怕神一樣的對手就怕豬一樣的隊友”這句話現在廣為流傳,實際上說的就是團隊重要性,一個好的團隊是可以克服很多你想象不大的困難, 做出你覺得不可能成績。 但是很多時候我們面臨的不是神一樣的對手,而是豬一樣的隊友&#xff0…

著迷英語900句_字體令人著迷

著迷英語900句I’m crazy about fonts. My favorite part of any text editing software is the drop down menu for picking fonts. When I look at any text, I try to identify the font. Roboto is my favorite font.我為字體瘋狂。 在任何文本編輯軟件中,我最喜…