架構雜談《一》

来源:https://www.cnblogs.com/haoxiaozhang/archive/2019/07/09/11158203.html
-Advertisement-
Play Games

架構雜談《一》 從傳統單體架構到服務化架構的發展歷程 典型的單體架構分為三個層級,Web層、業務邏輯層和數據存儲層,每個層的指責分別如下: Web 層:負責與用戶交互或者對外提供介面 業務邏輯層:為了實現業務邏輯而設計的流程處理模塊 數據存儲層:將業務邏輯層處理的結果持久化 將不同的模塊化組件聚合後 ...


架構雜談《一》

 

從傳統單體架構到服務化架構的發展歷程

  典型的單體架構分為三個層級,Web層、業務邏輯層和數據存儲層,每個層的指責分別如下:

  • Web 層:負責與用戶交互或者對外提供介面
  • 業務邏輯層:為了實現業務邏輯而設計的流程處理模塊
  • 數據存儲層:將業務邏輯層處理的結果持久化
          

  將不同的模塊化組件聚合後運行在通用的應用伺服器上。

  單體架構已經對企業級應用的整體架構進行了邏輯分層,包括了上面提到的Web層、業務邏輯層和數據存儲層,不同的層級有自己的職責,並從功能類型上劃分層級,每個層級的職責單一。

  在這一時期,由於架構上把整體的單體系統分成具有不同指責的層級,對應的項目管理也傾向於把大的團隊分成不同的職能團隊(UI團隊、後臺業務邏輯處理團隊(程式員)和DBA團隊),每個團隊只對自己的職責負責。架構已經在一定程度上進行了邏輯的劃分。但是,每個層次的多個業務邏輯的實現會被放在同一應用項目中,並運行在同一個.Net CLR或者JVM中,儘管會使用規範來約束不同業務邏輯的隔離性來解耦,但隨著複雜業務邏輯的迭代增加及開發人員的不斷流動或者為了節省時間和趕進度,非法使用了其他組件的服務,業務組件之間、UI組件之間、數據存儲之間的耦合性必然會增加,最後導致組件與組件之間難以劃清界限,完全耦合在一起,將來新的功能迭代、增加和維護將會難上加難。

   在(JEE、ASP.Net WebForm)等開始流行但沒有奠定地位的時候,開源軟體Struts、Spring和Hibernate開始浮出水面了,很快成為了行業內企業開發的開源框架標配(SSH)(.Net 的 Asp.Net MVC),Web MVC 框架在用戶交互的UI層進一步劃分了前端的職責,將用戶交互層劃分為了視圖(View)、模型(Model)和控制器(Controller)三大塊(簡稱MVC架構),結構圖如下:

  

  在這個時代、Struts MVC和Asp.net MVC 模板幾乎服務於大多數企業服務的Web項目。後來,開源框架Spring的發佈,更加改變了一開始指定的戰略目標。Spring有兩大核心思想:IOC和AOP。(後單體架構)

  從單體架構後後單體架構,服務的特點仍然是單體化,服務的粒度抽象為模板化組件,所有的組件耦合在一個項目中。並且配置和運行在一個.Net CLR(JVM)進程中。如果某個模塊化需要升級上線,則會導致其他沒有變更的模塊化組件同樣上線,在嚴重情況下,對某個模塊化組件的變更,由於各種原因會導致其他模塊化組件出現問題。另外在互聯網的突飛發展下,傳統的單體架構和後單體架構無法滿足對大量用戶發起的高併發請求進行處理的需求,無法破解耦合在一起的模塊化組件的性能瓶頸,單一進程已經無法滿足需求,並且水平擴展的能力也是有限的。

  為瞭解決上述問題,SOA就應運而生了。SOA代錶面向服務的架構(服務化),SOA將應用程式的模塊化組件通過定義明確的介面和約定(契約)聯繫在一起,介面採用中立的方式進行定義,獨立於某種語言、硬體和OS(操作系統),通常通過網路通信來完成,但並局限於某種網路協議(可以是TCP/IP,也可以是HTTP,也可以是消息隊列,甚至可以是約定的某種資料庫存儲形式),這使得各種各樣系統中的模塊化組件可以以一種統一和通用的方式進行交互。

  通過對比各個時代架構下的模塊化組件,可以發現SOA將模塊化組件從單一進程中進一步拆分,形成了獨立的對外提供服務的網路化組件,每個網路化組件通過某種協議對外提供服務,這種架構有以下特點:

  • SOA定義了良好的對外介面,通過網路協議對外提供的服務,服務之間表現為松耦合性(松耦合性具有靈活的特點,可以對服務流程進行靈活組裝和編排,而不需要對服務本省做任何改變)
  • SOA可以讓企業最大化地使用內部和外部提供的公共服務
  • SOA的數據通信格式通常為XML(冗餘的標記會給性能帶來極大的影響,後來被JSON取代)
  • 組成整個業務流程的每個服務的內部結構和實現在發生改變時,不影響整個流程對外提供的服務(只要對外的介面不變,則改變服務內部的實現機制對外部來說是透明的)
  • SOA定義了標準的對外介面,可以讓底層通用服務進行下沉,供多個上層的使用方同時使用,增加了服務可重用性

  要徹底理解SOA服務化發展情況,必須要瞭解SOA的兩個主流實現方式:Web Service 和 ESB

  • Web Service

    Web Service 技術是SOA服務化的一種實現方式,它使得運行在不同的機器及OS(操作系統)上的服務的互通發現和調用成為可能,並且可以通過某種協議交換數據

  

    通過上圖可以看出,每個服務之間是平等的,並且互相解耦的,通過WSDL定義的服務發現介面進行訪問,並通過SOAP協議進行通信。SOAP協議通常是一種在HTTP或者HTTPS上傳輸XML數據來實現的協議,但是每個服務都要依賴中心Web Service來發現現存的服務。

     Web Service的工作原理如下:

      1、服務提供者通過UDDI協議將服務註冊到中心Web Service目錄中

      2、服務調用者通過UDDI協議從中心 Web Service目錄中查詢服務,並獲得服務的WSDL服務描述文件

      3、服務調用者通過WSDL語言遠程調用服務提供者提供的服務

    通過這個過程,要改造一個新的業務流程,可以從 Web Service 目 錄中發現現有的服務,並最大限度地重用現有的服務,經過服務流程的編排來服務新的業務  

  • ESB

   ESB 是企業服務匯流排的簡稱,是用於設計和實現網路化服務交互和通信的軟體模型,是SOA的另一種實現方式,主要用於企業信息化系統的集成服務場景中。
   在SOA服務化發展之前,企業對信息化系統進行了初步建設,在現有的服務系統上增加新的功能或者疊加新的服務化系統,這需要對這些現有的信息化系統和新增的系統進行組合(如果在現有的系統上使用新的開發、操作系統等等是不現實的,有可能現有的系統是採用異構技術棧實現的)。SOA的松耦合特點正好應用於這一場景。使得企業可以按照服務化的方式來添加新的服務或升級現有的服務,來解決新業務對流程編排的需要,甚至可以通過不同的渠道來獲得外部服務並與企業現有的應用進行組合。來提供新的業務場景所需要的信息化流程。

  ESB 也使用於事件處理、數據轉換和映射、消息和事件非同步隊列順序處理、安全和異常處理、協議轉換和保證通信服務的質量等場景。

  

   從上圖可以看出ESB沒有中心化的服務節點,每個服務提供者都是通過匯流排的模式接入系統,匯流排根據流程的編排負責將服務的輸出進行轉換併發送給流程要求的下一個服務
進行處理。

  匯流排根據流程的編排負責將服務的輸出進行轉換併發送給流程要求的下一個服務進行處理。 如下所述

  • 監控和控制服務之間的消息路由
  • 控制可插拔的服務化的功能和版本
  • 解析服務之間交互和通信的內容和格式
  • 通過組合服務、資源和消息處理器來統一編排業務需要的信息處理流程
  • 使用冗餘來提高服務的備份能力

  企業服務匯流排是 ESB 的核心要素,所有服務都可以在匯流排上插拔,通過匯流排的流程編排和協議轉接能力來組合實現業務處理能力。

  說明:

  1、文中的圖都來自於百度圖片

  2、參考書籍:《分散式服務架構:原理、設計與實戰》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如何隱藏滾動條,同時仍然可以在任何元素上滾動? 首先,如果需要隱藏滾動條併在內容溢出時顯示滾動條,只需要設置overflow:auto樣式即可。想要完全隱藏滾動條只需設置overflow:hidden即可,但是這樣一來將導致元素內容不可滾動。時至今日,還沒有任何一條CSS規則可以使元素可以隱藏滾動... ...
  • 刪衝突插件,jquery作為基礎庫,當然是沒有理由被刪了。這個方法最直接了。 (2)將jquery的$方法改名,具體改名方法如下: ...
  • 事件 事件綁定方式 常用事件 事件冒泡 阻止後續事件發生 事件委托 頁面載入和window.onload ...
  • 近幾年來,隨著 HTML5、JS 的流行,前端這個職業火熱了起來!不少人發出疑惑,前端以後還會更有前途嗎? 我只能告訴你:前端不滅 現在都明白了用戶體驗至上,還要用著舒服 後端提供床,前端提供顏值高的妹,你說重要嗎? 我來簡單的介紹下web前端開發的3個疑問 {“ web前端開發 ”是什麼? } { ...
  • 1、如果想保持容器能夠滾動,同時不想看到醜陋的滾動條,chrome、firefox和移動端上不考慮相容性直接 element::-webkit-scrollbar{ display:none } 2、移動端卡頓,加一個屬性就能解決了 element{ -webkit-overflow-scrolli ...
  • 1.核心功能 此組件功能包含: 圖片裁剪(裁剪框拖動,裁剪框改變大小); 圖片馬賽克(繪製馬賽克,清除馬賽克); 圖片預覽、圖片還原(返回原圖、返回處理圖); 圖片上傳(獲取簽名、上傳圖片)。 2.核心邏輯 2.1圖片裁剪 獲取裁剪框(矩形)相對於畫布的位置(左上)和裁剪框的height、width ...
  • 工廠模式是使用頻率很高的一種設計模式,在面試中也經常問到,今天我們就來學習它。 為什麼要用工廠模式? 解答這個問題前,我們先來瞭解什麼是工廠模式。 工廠模式其實也稱創建模式,是用於創建對象的一種方式。本質上就是用工廠方法來代替new實例化對象。 舉個例子:我們在編寫代碼的時候,在一個A類中通過new ...
  • SpringCloud系列教程 | 第十篇:服務網關Zuul高級篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 上一篇我們主要聊到了Zuul的使用方式,以及自動轉發機制,其實Zuul還有更多的使用姿 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...