分佈式
分佈式就是把計算機通過網絡連接起來協同工作。由多臺計算機負責完成同一件事。
SOA全稱 Service-Oriented Architecture,面向服務架構,它可以根據需求通過網絡對鬆散耦合的粗粒度應用組件(服務)進行分佈式部署、組合、和使用。一個組件(服務)以獨立的形式存在於操作系統的進程中。
站在功能的角度上,把業務邏輯抽象成可複用、可組裝的服務,通過服務編排、組裝實現業務快速再生,把原先的固有業務轉變爲通用業務服務,實現業務邏輯的快速複用。
特點:分佈式、可複用、擴展靈活、松耦合。
當垂直應用越來越多時,應用之間的交互是不可避免的,將核心業務抽取出來,做成獨立的服務組件。逐漸形成穩定的服務中心,使得前端應用能夠更加快速響應市場多變的需求。
優點:
- 把公共功能抽取出來形成一個個可複用的服務。提高開發效率。
- 可以對不同的服務根據實際情況進行不同力度的集羣化部署,解決系統壓力。比如某個服務訪問量大,就集羣化力度大,某個服務訪問量較小,就集羣化力度比較小,實現比較靈活的性能擴展。
- 基於ESB總線或者Dubbo等框架,減小系統間的耦合。
缺點:
- 抽取服務的力度較大。
- 服務提供方與服務調用方的接口耦合度較高。
分佈式架構要解決的問題:
任務分解
如何把本身單體的系統架構拆分成一個個獨立部署的節點。可以通過領域模型進行拆分。
節點通信
各個節點之間進行通信,才能保證系統正常運行。可以通過RPC框架(Dubbo)或者消息中間件(ActiveMQ等)進行節點通信。
…
分佈式和集羣的關係
- 分佈式就是把一個業務拆分成多個子系統。部署在不同的服務器上。各個子系統之間通過網絡進行通信,協調完成業務。對外呈現出的是一個整體。
- 集羣是把同一子系統部署多個服務器上,通過負載均衡等方案對系統進行訪問。達到系統性能擴展和實現高可用。
系統架構的演變
以一個商城系統架構發展作爲例子。系統有用戶模塊,商品模塊,訂單模塊。
第一版
由於項目初期,用戶量少
使用到的架構:
容器:tomcat,jsp/servlet。
數據庫:mysql。
第二版
隨着用戶數增多,單機負載越來越大,將數據庫服務器與應用服務器分離。
第三版
隨着訪問量的繼續增多,一臺應用服務器不能處理達到瓶頸,就對應用服務器進行集羣部署。
這也引出了一些問題:比如Session共享等。可以使用 cookie、session集中存儲等方案解決。
第四版:
隨着訪問量的繼續增多,單臺數據庫達到了瓶頸,使用數據庫讀寫分離和數據同步。
這時又引出一些問題:
比如:
數據庫讀寫分離如何實現。mysql主從模式。
數據同步如何實現。mysql主從模式。
數據庫路由。mycat
…
第五版
商品搜索如何實現高效率,高相關檢索,就引入了搜索引擎,ES等。
又引入問題:
搜索引擎索引數據如果同步,實時增量同步還是定時全量同步。
第六版
訪問量持續增大,引入緩存機制。redis等。
第七版:
數據庫數據量過大,進行垂直/水平拆分。拆分成訂單數據庫。用戶數據庫,商品數據庫等。
第八版
訪問量,數據量,持續增大,對應用進行拆分成多個沒有關聯的應用,比如把原本一個應用拆分成三個應用,用戶系統、訂單系統。
這個與分佈式架構還是有點區別的,因爲拆分的應用都是沒有關係的,各自完成相應的功能,沒有進行通信。這種架構會存在冗餘的代碼,比如訂單系統會涉及商品跟用戶,所以訂單系統裏面就會有相應的關於用戶和商品相關的代碼。
第九版
訪問量,數據量,業務複雜度,持續增大,對各個模塊按照一定業務,一定粒度進行抽取成一個個服務/組件,各個服務之間通過網絡進行通信,完成相應業務,該架構就是分佈式架構。
此時每種業務都被抽取出來獨立運行,系統之間相互通信,比如訂單系統用到了用戶相關的,就通過與用戶服務組件進行通信進行調用,完成業務邏輯處理。