...模塊化、集中式、分布式、服務化、面向服務的架構、微服務架構

2021-01-06 CIO時代網

  最近最火的詞是什麼?那大概就是微服務(Microservice)了。最近也火的一踏糊塗的Docker、AppOps也都是圍繞著微服務領域的。在微服務領域還有很多相關名詞。這些名詞有一個共同的特點那就是晦澀難懂。他們就像中國古代的道、氣、八卦等詞一樣,一解釋就懂,一問就不知,一討論就打架。

  本文主要來介紹幾個和微服務相關的概念。這些概念的都是博主在瀏覽了大量資料之後總結出的個人見解,如有偏頗,請指正,共勉之。

 

  組件化與模塊化
 

  首先來談兩個前端和移動端比較常見的詞:組件化和模塊化(後面我會說到為什麼要先介紹組件化和模塊化)。

  首先,可以肯定的是,組件化和模塊化的中心思想都是分而治之。目的都是將一個龐大的系統拆分成多個組件或者說是模塊。

 

  組件化

 

  首先來看維基百科中關於組件化(Component-based software engineering)的介紹:

 

  Component-based software engineering (CBSE), also known as component-based development (CBD), is a branch of software engineering that emphasizes the separation of concerns in respect of the wide-ranging functionality available throughout a given software system. It is a reuse-based approach to defining, implementing and composing loosely coupled independent components into systems. This practice aims to bring about an equally wide-ranging degree of benefits in both the short-term and the long-term for the software itself and for organizations that sponsor such software.

 

  大概意思就是:組件化就是基於可重用的目的,將一個大的軟體系統按照分離關注點的形式,拆分成多個獨立的組件,主要目的就是減少耦合。

 

  一個獨立的組件可以是一個軟體包、web服務、web資源或者是封裝了一些函數的模塊。這樣,獨立出來的組件可以單獨維護和升級而不會影響到其他的組件。

 

  模塊化

 

  維基百科中對模塊化Modular Programming的定義如下:

 

  Modular programming is a software design technique that emphasizes separating the functionality of a program into independent, interchangeable modules, such that each contains everything necessary to execute only one aspect of the desired functionality.

 

  With modular programming, concerns are separated such that modules perform logically discrete functions, interacting through well-defined interfaces.

 

  模塊化的目的在於將一個程序按照其功能做拆分,分成相互獨立的模塊,以便於每個模塊只包含與其功能相關的內容,模塊之間通過接口調用。將一個大的系統模塊化之後,每個模塊都可以被高度復用。

 

  模塊化和組件化的區別

 

  從上面的定義中可以看出,組件化和模塊化的意思差不多,主要思想都是分而治之。只是一個把拆分之後的每個片段叫做組件、另一個把拆分之後的片段叫做模塊。那麼這兩種拆分在拆分方式上是不是有什麼不同的?

 

  關於組件化和模塊化的區別,我在網上看了好多資料,也沒有人能給出準確的回答。其實沒有準確回答的原因也比較明顯,那就是大多數時候我們真的不需要嚴格的區分這兩個名字。我們要學習的是其中的解耦和分治的思想和目的。

 

  從另外一個角度來講,如果真的要區分一下組件化和模塊化的話,那麼可以認為這兩種分而治之的目的稍有區別:

 

  模塊化的目的是為了重用,模塊化後可以方便重複使用和插撥到不同的平臺,不同的業務邏輯過程中。

 

  組件化的目的是為了解耦,把系統拆分成多個組件,分離組件邊界和責任,便於獨立升級和維護。

 

  集中式與分布式

 

  要談微服務,那麼必須建立在分布式的基礎上,對於一個集中式系統也無需談微服務。在我的另外一篇文章初識分布式系統中介紹過集中式系統和分布式系統的區別,這裡再簡單回顧一下:

  集中式

 

  集中式系統用一句話概括就是:一個主機帶多個終端。終端沒有數據處理能力,僅負責數據的錄入和輸出。而運算、存儲等全部在主機上進行。

 

  集中式系統的最大的特點就是部署結構非常簡單,底層一般採用從IBM、HP等廠商購買到的昂貴的大型主機。因此無需考慮如何對服務進行多節點的部署,也就不用考慮各節點之間的分布式協作問題。但是,由於採用單機部署。很可能帶來系統大而複雜、難於維護、發生單點故障(單個點發生故障的時候會波及到整個系統或者網絡,從而導致整個系統或者網絡的癱瘓)、擴展性差等問題。

 

  分布式

 

  分布式就是一群獨立計算機集合共同對外提供服務,但是對於系統的用戶來說,就像是一臺計算機在提供服務一樣。分布式意味著可以採用更多的普通計算機(相對於昂貴的大型機)組成分布式集群對外提供服務。計算機越多,CPU、內存、存儲資源等也就越多,能夠處理的並發訪問量也就越大。

 

  拿電商網站來說,我們一般把一個電商網站橫向拆分成商品模塊、訂單模塊、購物車模塊、消息模塊、支付模塊等。然後我們把不同的模塊部署到不同的機器上,各個模塊之間通過遠程服務調用(RPC)等方式進行通信。以一個分布式的系統對外提供服務。

 

  服務化

 

  提到分布式,一個不得不提的詞就是服務化,服務化架構使搭建分布式系統成為了可能。

 

  傳統的軟體開發面臨著很多的問題,比如: 代碼重複率高、代碼龐大難以維護、無法快速迭代、測試成本高、可伸縮性差、可靠性差、模塊間高度依賴。為了解決上面這些問題,我們一般採用拆分、解耦、分層、獨立等方式來解決。有了服務化架構,我們就可以在很大程度上解決這些問題。

 

  服務化是一種粗粒度、鬆耦合的以服務為中心的架構,服務之間通過定義明確的協議和接口進行通信。

 

  這裡說到的「服務」,本質上來說,就是指「RPC」。單純的RPC功能實現,其實很簡單,無非就是client發起調用,中間某個組件(甚至就是client本身)攔截調用信息,序列化後將信息傳輸到server端,server端收到調用請求後反序列化,根據請求詳細發起實際調用後返迴響應傳輸回給client端。這樣的RPC很常見,比如常見的存儲過程調用就是一例。但是在一個複雜的業務環境,如何管理和協同這些大量的RPC才是最麻煩的事情。所以,一般提到的「服務化」更多指的是對RPC的管理。服務化一般關注服務註冊,服務協調,服務可用性,服務通訊協議和內容交換等。

 

  面向服務的架構

 

  面向服務架構(Service-Oriented Architecture,SOA)又稱「面向服務的體系結構」,是Gartner於2O世紀9O年代中期提出的面向服務架構的概念。

 

  面向服務架構,從語義上說,它與面向過程、面向對象、面向組件一樣,是一種軟體組建及開發的方式。與以往的軟體開發、架構模式一樣,SOA只是一種體系、一種思想,而不是某種具體的軟體產品。

  這裡,我們通過一個例子來解釋一下到底什麼是SOA?如何做到SOA?

 

  什麼是SOA

 

  SOA也可以說是一種是設計原則(模式),那麼它包含哪些內容呢?事實上,這方面並沒有最標準的答案,多數是遵從著名SOA專家Thomas Erl的歸納:

 

  標準化的服務契約 Standardized service contract

  服務的鬆耦合 Service loose coupling

  服務的抽象 Service abstraction

  服務的可重用性 Service reusability

  服務的自治性 Service autonomy

  服務的無狀態性 Service statelessness

  服務的可發現性 Service discoverability

  服務的可組合性 Service composability

 

  這些原則總的來說要達到的目的是:提高軟體的重用性,減少開發和維護的成本,最終增加一個公司業務的敏捷度。

 

  既然是面向服務的架構,那麼我們就先來定義一個服務,
 

 

  上面這段代碼相信有過JavaWeb開發經驗的人都不會陌生。就是定義了一個服務的接口和實現。

 

  那麼,定義了服務,我們就做到了SOA了麼?

 

  我們用Thomas Erl定義的原則來對比一下,用鬆耦合和可重用這幾個原則來嘗試分析一下上面Echo示例:

 

  Echo的服務契約是用Java接口定義,而不是一種與平臺和語言無關的標準化協議,如WSDL,CORBA IDL。當然可以抬槓,Java也是行業標準,甚至全國牙防組一致認定的東西也是行業標準。

 

  Java接口大大加重了與Service客戶端的耦合度,即要求客戶端必須也是Java,或者JVM上的動態語言(如Groovy、Jython)等等……

 

  同時,Echo是一個Java的本地接口,就要求調用者最好在同一個JVM進程之內……

 

  Echo的業務邏輯雖然簡單獨立,但以上技術方面的局限就導致它無法以後在其他場合被輕易重用,比如分布式環境,異構平臺等等 ESB是SCA思想實現的基礎設施。ESB主要作用是集中註冊發布服務,為服務與傳輸協議之間解耦。並不是所有的SOA架構都需要ESB,ESB是SCA特有的。當然任何符合ESB特徵的解決方式都可以稱之為ESB,也不僅僅是SCA內部的。

 

  因此,我們可以認為Echo並不太符合SOA的基本設計原則。

 

  實現SOA

 

  修改一下上面的Echo,添加Java EE的@WebServices註解

 

  現在將Echo發布為Java WebServices,並由底層框架自動生成WSDL來作為標準化的服務契約,這樣就能與遠程的各種語言和平臺互操作了,較好的解決了上面提到的鬆耦合和可重用的問題。按照一般的理解,Echo似乎就成為比較理想的SOA service了。

 

  使用WebServices只是一種相對簡單的方案,SOA的最常見的解決方案是SCA,其次還有JBI,BPEL等。ESB是SCA思想實現的基礎設施。ESB主要作用是集中註冊發布服務,為服務與傳輸協議之間解耦。關於SCA和ESB並不是本文的重點,感興趣的朋友可以從網絡上獲取更多資料。(可以從上圖中看到ESB在整個SOA架構中所扮演的角色)

 

  面向對象和面向服務的對比

 

  面向對象(OO)和面向服務(SO)在基礎理念上有大量共通之處,比如都儘可能追求抽象、封裝和低耦合。

 

  但SO相對於OO,又有非常不同的典型應用場景,比如:

 

  多數OO接口(interface)都只被有限的人使用(比如團隊和部門內),而SO接口(或者叫契約)一般來說都不應該對使用者的範圍作出太多的限定和假設(可以是不同部門,不同企業,不同國家)。還記得貝佐斯原則嗎?「團隊必須做好規劃與設計,以便未來把接口開放給全世界的程式設計師,沒有任何例外」。

 

  多數OO接口都只在進程內被訪問,而SO接口通常都是被遠程調用。

 

  簡單講,就是SO接口使用範圍比一般OO接口可能廣泛得多。我們用網站打個比方:一個大型網站的web界面就是它整個系統入口點和邊界,可能要面對全世界的訪問者(所以經常會做國際化之類的工作),而系統內部傳統的OO接口和程序則被隱藏在web界面之後,只被內部較小範圍使用。而理想的SO接口和web界面一樣,也是變成系統入口和邊界,可能要對全世界開發者開放,因此SO在設計開發之中與OO相比其實會有很多不同。(微觀SOA:服務設計原則及其實踐方式(上篇))

 

  微服務架構

 

  微服務架構(MicroService)是一種服務化架構風格,通過將功能分散到各個離散的服務中以實現對解決方案的解耦。微服務架構強調的第一個重點就是業務系統需要徹底的組件化和服務化(這也是我們為什麼要先介紹組件化和服務化的原因)。微服務的誕生並非偶然。它是網際網路高速發展,敏捷、精益、持續交付方法論的深入人心,虛擬化技術與DevOps文化的快速發展以及傳統單塊架構無法適應快速變化等多重因素的推動下所誕生的產物。

  微服務的流行,Martin功不可沒,先看看他是如何定義微服務的:

 

  The microservice architectural style is an approach to developing a single application asa suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services , which may be written in different programming languages and use different data storage technologies.

 

  總結起來大概以下四點:

 

  一些列的獨立的服務共同組成系統

  單獨部署,跑在自己的進程裡

  每個服務為獨立的業務開發

  分布式的管理

 

  Martin自己也說了,每個人對微服務都可以有自己的理解,不過大概的標準還是有一些的。

 

  分布式服務組成的系統

  按照業務而不是技術來劃分組織

  做有生命的產品而不是項目

  Smart endpoints and dumb pipes(我的理解是強服務個體和弱通信)

  自動化運維(DevOps)

  容錯

  快速演化

  SOA和微服務

 

  看了SOA和微服務,很多人會認為這不就是一回事兒麼。其實SOA和微服務就是差不多的。

 

  如果一句話來談SOA和微服務的區別,即微服務不再強調傳統SOA架構裡面比較重的ESB企業服務總線。微服務把所有的「思考」邏輯包括路由、消息解析等放在服務內部,去掉一個大一統的ESB,服務間輕通信,是比SOA更徹底的拆分。(微服務(Microservice)那點事)

 

  關於微服務這裡只是做一個簡單的介紹,要想真正的了解微服務還有很多路要走,比如康威定律(我後面會專門寫一篇文章介紹康威定律)、服務間通信、服務的註冊與發現、服務治理與服務編排等。。。

 

  總結

 

  本文主要介紹了組件化、模塊化、集中式、分布式、服務化、面向服務的架構、微服務架構等概念。但是,正所謂實踐出真知。還是要在日常工作中實際運用才能真正的掌握。

第三十二屆CIO班招生 法國布雷斯特商學院碩士班招生 北達軟EXIN網絡空間與IT安全基礎認證培訓 北達軟EXIN DevOps Professional認證培訓

責編:pingxiaoli

相關焦點

  • 微服務架構一直火,為什麼服務化要搞懂?
    微服務架構,這 5 年左右一直被認可,是軟體架構的未來方向。需要大家理解的是,為什麼需要服務化。比如微服務架構對企業來說,帶來什麼價值?有啥弊端?這裡淺談一下微服務架構,主要還是在理解 Why :為什麼需要服務化?
  • IBM高級架構師結合多線程和Socket,深入實戰微服務架構
    要明確的是,面向服務的架構中的「服務」雖然也包括系統對外提供的服務,但更多的是指系統內部的各個「模塊」或「組件」的「服務化」,以及模塊(服務)之間的相互調用與協同。它是「分布式」與「服務化」兩個技術發展趨勢合流的產物。分布式系統所謂的「分布式」是相對於「集中式」的一種應用系統內部組織結構。
  • IBM高級架構師結合Java多線程和Socket,帶你實戰微服務架構
    要明確的是,面向服務的架構中的「服務」雖然也包括系統對外提供的服務,但更多的是指系統內部的各個「模塊」或「組件」的「服務化」,以及模塊(服務)之間的相互調用與協同。它是「分布式」與「服務化」兩個技術發展趨勢合流的產物。分布式系統所謂的「分布式」是相對於「集中式」的一種應用系統內部組織結構。
  • 集中式架構和分布式架構哪種更好?
    集中式與分布式之爭事實上,關於集中式架構和分布式架構哪種更好的討論已經在業界延續了很長時間,每次出現類似的話題,似乎都要選出一個對錯,那麼我們可以從集中式和分布式架構出現的背景談起,看看這兩種不同的架構究竟有什麼異同。
  • 面向領域的微服務架構
    在過去的兩年裡,Uber一直在試圖降低微服務的複雜性的同時仍然保持著微服務架構的優勢。我們希望通過這篇博文介紹我們對微服務架構的通用方法,我們稱之為 "面向領域的微服務架構"(DOMA)。由於這些缺點,近年來也有一些批評微服務架構的聲音,但是卻很少有人主張徹底拒絕微服務架構。運營收益太重要了,而且似乎沒有有效的替代方案。
  • 分布式微服務架構設計原理
    一、單體服務架構1、JEE架構:UI、EJB邏輯層、資料庫>二、服務化架構 SOA2、去中心化服務治理微服務架構倡導去中心化的服務管理和治理,儘量不要設置中心化的管理服務,最差在中心化管理服務癱瘓時有替代方案和設計。
  • WEB單體應用 VS SOA架構 VS 微服務架構
    主要的內容如下:單體架構到分布式架構的演變;ORM、MVC、分布式、RPC、微服務等技術關鍵字介紹;MVC、RPC、SOA、微服務架構的區別;單體架構、SOA架構、微服務架構內部服務的組織;WEB單體應用介紹&單體應用會遇到的問題;SOA架構的演變介紹&SOA架構的的實現&
  • SpringCloud:分布式微服務架構
    概念微服務是一種架構風格,它是一種將一個單一應用程式開發為一組小型服務的方法,每個服務運行在自己的進程中,服務間通信採用輕量級通信機制(通常採用http)。這些服務圍繞業務能力構建並且可通過全自動部署機制獨立部署,這些服務共用一個最小型的集中式的管理,服務可用不同的語言開發,使用不同的數據存儲技術。特徵每個微服務可獨立運行在自己的進程中。一系列獨立運行的微服務共同構建起整個系統。
  • JAVA微服務架構改造的思路與分布式事務問題的難點分析
    分布式系統架構中,分布式事務是一個繞不過去的挑戰!微服務架構本質上就是分布式服務化架構,微服務架構的流行,讓分布式事務問題日益突出!尤其是在訂單業務、資金業務等系統核心業務流程中,一定要有可靠的分布式事務解決方案來保證業務數據的可靠性和準確性。
  • JAVA後時代, 微服務的興起, 架構師不得不了解的模塊化體系
    是的,模塊化與組件化開發將會是未來開發的主要潮流,無論是作為開發人員還是架構師都必須掌握的一種開發方式。spring cloud微服務正是在這種條件下誕生的,簡單的說微服務不是一種編碼技術或者是設計模式,它是一種系統架構上的設計風格。它存在的主要意義就是將一個獨立的系統拆分成多個小型服務,這些服務運行在自己獨立的進程中,互補幹擾。
  • 資料庫從集中式架構到分布式架構發生了哪些改變?
    不過相比於傳統資料庫,為了應對業務複雜性和快速迭代所帶來的挑戰,關係型資料庫也在一直演變,在架構層面從集中式逐步走向分布式。架構之變:從集中式到分布式90年代到本世紀初是關係型資料庫的大發展時期,由IOE構建起了封閉的集中式架構體系,以Oracle資料庫、SQL Server、DB2為主的商用關係型資料庫牢牢佔據著企業級資料庫市場。
  • 微服務架構:介紹、分布式集群、架構四要素、設計模式、架構說明
    分布式與集群分布式分布式就是把一個系統拆分成多個服務節點,每個節點部署在不同的伺服器上,可以理解為串聯模式(多個電池串聯起來電壓增加電池容量不變)先分布式:例如12306,會把分成登錄、查票、訂單、支付等多個服務。
  • 程式設計師必備的15種微服務架構框架
    2019年有一個統計說,兩千家企業裡,45%在使用微服務,16%在實驗開發和測試微服務架構,24%在學習微服務準備轉型,只有剩下的15%的企業沒有使用微服務。 微服務到底有什麼好呢?微服務在2013年才被提出,短短幾年就有這麼快速的發展。
  • 程式設計師必備的15種微服務架構框架
    2019年有一個統計說,兩千家企業裡,45%在使用微服務,16%在實驗開發和測試微服務架構,24%在學習微服務準備轉型,只有剩下的15%的企業沒有使用微服務。微服務到底有什麼好呢?微服務在2013年才被提出,短短幾年就有這麼快速的發展。
  • 不愧是阿里資深架構師,一本「分布式架構筆記」都能寫得如此透徹
    所以我們一般都會在運行時架構設計之初,就考慮如何能利用多個CPU、多臺伺服器來分擔負載,這就是所謂分布的策略。分布式的伺服器概念很簡單,但是實現起來卻比較複雜。因為我們寫的程序,往往都是以一個CPU,一塊內存為基礎來設計的,所以要讓多個程序同時運行,並且協調運作,這需要更多的底層工作。
  • 什麼是微服務架構,如何做服務拆分?
    譯文:微服務架構風格是一種將一個單一應用程式開發為一組小型服務的方法,每個服務運行在自己的進程中,服務間通信採用輕量級通信機制這些服務圍繞業務能力構建並且可通過全自動部署機制獨立部署,這些服務公用一個最小型的集中式的管理,服務可用不同的語言開發,使用不同的數據存儲技術
  • 不愧是阿里資深架構師,這本「分布式架構筆記」竟能寫得如此透徹
    所以我們一般都會在運行時架構設計之初,就考慮如何能利用多個CPU、多臺伺服器來分擔負載,這就是所謂分布的策略。分布式的伺服器概念很簡單,但是實現起來卻比較複雜。因為我們寫的程序,往往都是以一個CPU,一塊內存為基礎來設計的,所以要讓多個程序同時運行,並且協調運作,這需要更多的底層工作。
  • Java開發網站架構演變過程-從單體應用到微服務架構詳解
    Java開發網站架構演變過程,到目前為止,大致分為5個階段,分別為單體架構、集群架構、分布式架構、SOA架構和微服務架構。下面玄武老師來給大家詳細介紹下這5種架構模式的發展背景、各自優缺點以及涉及到的一些技術,並且教會你如何區分它們。
  • 分布式系統架構與雲原生—阿里雲《雲原生架構白皮書》導讀
    2 雲原生主要架構原則和技術分析  2.1 微服務和小系統服務  微服務架構,從宏觀上來看,無非就是細化了服務拆分過程中的粒度,粒度越細,業務耦合越小,容錯性就越好,並且後期擴展也會越容易。  因此《雲原生架構白皮書》在微服務相關章節中又提到了小系統服務的概念,即是一個顆粒度的中間狀態,其實核心就是一個服務拆分顆粒度的問題,白皮書中的第3章中有專門章節對於雲原生微服務特別是微服務設計過程中的約束做了詳細介紹,根本目的就是使微服務的發展處於一個受約束的狀態,而不是因為有了微服務的理念就是服務拆分的顆粒度越細越好。
  • 八年架構師講述Dubbo和Spring Cloud微服務架構
    微服務架構是網際網路很熱門的話題,是網際網路技術發展的必然結果。它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。雖然微服務架構沒有公認的技術標準和規範或者草案,但業界已經有一些很有影響力的開源微服務架構框架提供了微服務的關鍵思路,例如Dubbo和Spring Cloud。各大網際網路公司也有自研的微服務框架,但其模式都於這二者相差不大。