1. 程式人生 > >淺談SOA、微服務、分散式、叢集之間的聯絡

淺談SOA、微服務、分散式、叢集之間的聯絡

SOA

        SOA(Service Oriented Architecture)“面向服務的架構”。SOA是一種設計方法,包含多個服務,而多個服務之間通過互相依賴最終提供一系列的功能;每一個服務通常是以獨立的形式存在於作業系統的程序中,各個服務通過網路來呼叫。簡而言之:業務系統分解為多個元件,讓每個元件都獨立提供離散,自治,可複用的服務能力,通過服務的組合和編排來實現上層的業務流程 。

        SOA架構開發中的作用及優點:

        簡化維護

        業務服務提供者和業務服務使用者的鬆散耦合關係及對開放標準的採用確保了該特性的實現。建立在以 SOA基礎上的資訊系統,當需求發生變化的時候,不需要修改提供業務服務的介面,只需要調整業務服務流程或者修改操作即可,整個應用系統也更容易被維護。

         系統整合:站在系統的角度,解決企業系統間的通訊問 題,把原先散亂、無規劃的系統間的網狀結構,梳理成 規整、可治理的系統間星形結構,這一步往往需要引入 一些產品,比如 ESB、以及技術規範、服務管理規範; 這一步解決的核心問題是【有序】。

        高可用性

        該特點是在於服務提供者和服務使用者的鬆散耦合關係上得以發揮與體現。使用者無須瞭解提供者的具休實現細節。

        系統的服務化:站在功能的角度,把業務邏輯抽象成 可複用、可組裝的服務,通過服務的編排實現業務的 快速再生。目的:把原先固有的業務功能轉變為通用 的業務服務,實現業務邏輯的快速複用;這一步解決 的核心問題是【複用】

        靈活的伸縮性

        依靠業務服務設計、開發和部署等所採用的架構模型實現伸縮性。使得服務提供者可以互相彼此獨立地進行調整,以滿足新的服務需求。

        業務的服務化:站在企業的角度,把企業職能抽象成 可複用、可組裝的服務;把原先職能化的企業架構轉變為服務化的企業架構,進一步提升企業的對外服務能力;“前面兩步都是從技術層面來解決系統呼叫、系統功能複用的問題”。第三步,則是以業務驅動把一個業務單元封裝成一項服務。這一步解決的核心問題是【高效】

        ESB(企業服務匯流排)

         ESB 就像是一根管道,用來連線各個服務節點。為了集 成不同系統,不同協議的服務,ESB 做了訊息的轉化解釋和路由工作,讓不同的服務互聯互通,如下圖所示:

                                  

微服務

       微服務(Microservices Architecture)是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每個微服務僅關注於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。

      微服務架構:其實和 SOA 架構類似,微服務是在 SOA 上做的昇華,微服務架構強調的一個重點是“業務需要徹底的元件化和服務化”,原有的單個業務系統會拆分為多個可以獨立開發、設計、執行的小應用。這些小應用之間通過服務完成互動和整合。

      架構設計概念,各服務間隔離(分散式也是隔離),自治(分散式依賴整體組合)其它特性(單一職責,邊界,非同步通訊,獨立部署)是分散式概念更嚴格執行SOA到微服務架構的演進過程 。

       微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務執行在自己的程序中,開發和釋出都沒有依賴。不同服務通過一些輕量級互動機制來通訊,例如 RPC、HTTP 等,服務可獨立擴充套件伸縮,每個服務定義了明確的邊界,不同的服務甚至可以採用不同的程式語言來實現,由獨立的團隊來維護。簡單的來說,一個系統的不同模組轉變成不同的服務!而且服務可以使用不同的技術加以實現!

      Soa的開發方法一般主要有開源的dubbo、dubbox、mule、wrs、axis、xfire、wso2、cxf,以及付費的oracle soa、ibm soa等。現在rest正在取代soa。

那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:

  1. 職責單一原則(Single Responsibility Principle):把某一個微服務的功能聚焦在特定業務或者有限的範圍內會有助於敏捷開發和服務的釋出。
  2. 設計階段就需要把業務範圍進行界定。
  3. 需要關心微服務的業務範圍,而不是服務的數量和規模儘量小。數量和規模需要依照業務功能而定。
  4. 於SOA不同,某個微服務的功能、操作和訊息協議儘量簡單。
  5. 專案初期把服務的範圍制定相對寬泛,隨著深入,進一步重構服務,細分微服務是個很好的做法。

關於為服務的一些取捨:

  1. 在合適的專案,合適的團隊,採用微服務架構收益會大於成本。
  2. 微服務架構有很多吸引人的地方,但在擁抱微服務之前,也需要認清它所帶來的挑戰。
  3. 需要避免為了“微服務”而“微服務”。
  4. 微服務架構引入策略 – 對傳統企業而言,開始時可以考慮引入部分合適的微服務架構原則對已有系統進行改造或新建微服務應用,逐步探索及積累微服務架構經驗,而非全盤實施微服務架構。

      微服務架構的作用及特點:

     作用:各服務可獨立應用,組合服務也可系統應用。

     1. 通過服務實現元件化

  • 開發者不再需要協調其它服務部署對本服務的影響。

     2. 按業務能力來劃分服務和開發團隊

  • 開發者可以自由選擇開發技術,提供 API 服務

     3. 去中心化

  • 每個微服務有自己私有的資料庫持久化業務資料
  • 每個微服務只能訪問自己的資料庫,而不能訪問其它服務的資料庫
  • 某些業務場景下,需要在一個事務中更新多個數據庫。這種情況也不能直接訪問其它微服務的資料庫,而是通過對於微服務進行操作。
  • 資料的去中心化,進一步降低了微服務之間的耦合度,不同服務可以採用不同的資料庫技術(SQL、NoSQL等)。在複雜的業務場景下,如果包含多個微服務,通常在客戶端或者中間層(閘道器)處理。

      4. 基礎設施自動化(devops、自動化部署)

  • Java EE部署架構,通過展現層打包WARs,業務層劃分到JARs最後部署為EAR一個大包,而微服務則打開了這個黑盒子,把應用拆分成為一個一個的單個服務,應用Docker技術,不依賴任何伺服器和資料模型,是一個全棧應用,可以通過自動化方式獨立部署,每個服務執行在自己的程序中,通過輕量的通訊機制聯絡,經常是基於HTTP資源API,這些服務基於業務能力構建,能實現集中化管理。因為服務太多,不集中管理就無法DevOps。

       微服務API閘道器

       API閘道器是一個伺服器,是系統的唯一入口。從面向物件設計的角度看,它與外觀模式類似。API閘道器封裝了系統內部架構,為每個客戶端提供一個定製的API。它可能還具有其它職責,如身份驗證、監控、負載均衡、快取、請求分片與管理、靜態響應處理。API閘道器方式的核心要點是,所有的客戶端和消費端都通過統一的閘道器接入微服務,在閘道器層處理所有的非業務功能。通常,閘道器也是提供REST/HTTP的訪問API。服務端通過API-GW註冊和管理服務。

                    

                       

       SOA與微服務之間的主要區別:

功能

SOA

微服務

元件大小

大塊業務邏輯

單獨任務或小塊業務邏輯

耦合

通常鬆耦合

總是鬆耦合

公司架構

任何型別

小型、專注於功能交叉團隊

管理

著重中央管理

著重分散管理

目標

確保應用能夠互動操作

執行新功能、快速拓展開發團隊

   Dubbo服務的最佳實踐

分包

  1. 服務介面、請求服務模型、異常資訊都放在api裡面,符合重用釋出等價原則,共同重用原則
  2. api裡面放入spring 的引用配置。 也可以放在模組的包目錄下。

粒度

  1. 儘可能把介面設定成粗粒度,每個服務方法代表一個獨立的功能,而不是某個功能的步驟。否則就會涉及到分散式事務
  2. 服務介面建議以業務場景為單位劃分。並對相近業務做抽象,防止介面暴增
  3. 不建議使用過於抽象的通用介面  T T<泛型>,介面沒有明確的語義,帶來後期的維護

版本

  1. 每個介面都應該定義版本,為後續的相容性提供前瞻性的考慮 version (maven -snapshot)
  2. 建議使用兩位版本號,因為第三位版本號表示的相容性升級,只有不相容時才需要變更服務版本
  3. 當介面做到不相容升級的時候,先升級一半或者一臺提供者為新版本,再將消費全部升級新版本,然後再將剩下的一半提供者升級新版本

預釋出環境

推薦用法

  1. 在provider端儘可能配置consumer端的屬性
  2. 比如timeout、retires、執行緒池大小、LoadBalance

 配置管理員資訊

  1. application上面配置的owner 、 owner建議配置2個人以上。因為owner都能夠在監控中心看到

配置dubbo快取檔案

  1. 註冊中心的列表
  2. 服務提供者列表

分散式與叢集

         分散式:一個業務分拆多個子業務,部署在不同的伺服器上。

         叢集:同一個業務,部署在多個伺服器上

分散式和叢集都是為了解決兩個問題:

  • 高吞吐量(throughput):通過負載均衡演算法(通常是藉助一致性Hash和虛擬節點),我們把Client的請求均勻分配到三臺Memcached伺服器上,不至於只讓一臺Memcached疲於處理全部請求。
  • 高可用(availability):一旦一臺Memcached節點掛了,比如說Memcached1,那借助一致性Hash演算法和它的虛擬節點機制,我們可以將原本發給Client的Memcached1的請求均勻分配到Memcached2和3上,快取功能依舊可用。

以上內容大部分引用以下兩篇博主的部落格內容:

https://blog.csdn.net/heatdeath/article/details/79038795

https://blog.csdn.net/zpoison/article/details/80729052

其他學習參考資料:

1. 架構設計漫步:從單體架構、SOA到微服務

http://www.uml.org.cn/zjjs/201708083.asp

2. SOA和微服務架構的區別

https://www.zhihu.com/question/37808426

3. 分散式與叢集的區別是什麼

https://www.zhihu.com/question/20004877

4. 分散式服務架構與微服務架構概念的區別與聯絡是怎樣的

https://www.zhihu.com/question/28253777

5. Dubbo架構原理

https://zhuanlan.zhihu.com/p/39535319