網站服務器架構部署方案發展

任何一個大型網站均是根據用戶的積累以及隨之而來的用戶數量增加,從一臺服務器到多臺服務器逐步架構支撐起最終的大型網站數據、用戶和頁面請求等業務的。任何的大型網站的系統架構並非一開始設計時就已經徹底的考慮了與其業務高度吻合的高性能、高可用、安全等特性的。因爲隨着用戶量增長,業務功能通常會逐步細化甚至發生較大的業務方向轉變,因此通常在開發迭代過程當中,總會發生大的開發模式、技術架構甚至設計思想的變化。最終,隨着業務穩定的擴展和肯定,成熟的系統架構纔會出現,並符合其業務特徵。例如,一樣是web,淘寶要解決精準的商品信息搜索、下單、支付以及促銷活動時的併發處理;騰訊則首先考慮同一時間完成數億用戶的消息實時精準傳輸;百度則持續高併發處理數億人同時的海量搜索請求。不一樣的業務,因爲側重點不一樣,系統架構則會有差別。可是也有共性。例如,美國常見的創業案例,一兩臺電腦開始服務器,最終發展成如今的谷歌、Facebook等。本文將講述網站服務器從一兩臺電腦到集羣服務器的一些部署方案演化過程。html

一、一臺電腦的網站服務器架構

最初的架構就像咱們每一個人在學習時,將web應用程序、數據庫、靜態文件均部署在同一臺服務器(例如我的電腦)上。前端

一臺服務器

二、應用程序、文件、數據庫三者分離

隨着用戶量增長,業務發展,一臺服務器沒法知足要求,須要分解壓力。通常此時最常規的作法就是根據功能將相應的模塊放置在不一樣服務器上——根據模塊功能選擇合適的硬件,而後將應用程序、文件和數據庫三者分離部署在獨立的服務器上來提高性能。python

三者分離示意圖

三、利用緩存改善網站性能

​ 除了硬件上的優化,軟件設計確定也有辦法改善網站服務器性能。咱們都知道,訪問靜態頁面要比動態頁面快地多。爲何呢?通常不少動態頁面都須要應用程序服務器去後臺數據庫服務器訪問並查詢數據結果,而後根據返回結果調用文件服務器或者自身應用服務器上的模板來生成動態頁面而後返回給瀏覽器或者客戶端。git

​ 假如咱們將大多數用戶常常訪問的首頁等一些訪問量大但變更小的頁面在動態生成後的頁面緩存在應用程序服務器或者保存爲靜態頁面供用戶索取,那數據庫的訪問頻次將大幅降低,網站性能獲得提高,用戶體驗獲得優化。常見的像微博通常將熱點數據(熱點話題)保存在redis中供用戶快速訪問。github

兩種常見的軟件層次改善網站性能方式:web

一、利用緩存redis

二、動態轉靜態數據庫

​ 大多數網站設計時,都遵循訪問28原則——80%的訪問請求最終落在20%的數據上。這樣能夠減小數據庫查詢操做,提高用戶體驗,改善網站性能。swift

​ 緩存實現的常見方式有本地緩存、分佈式緩存。除此以外還有CDN、反向代理等。後端

  • 本地緩存是指將數據緩存在應用服務器本地的內存或者文件中,它的特色是訪問速度快,缺點是本地空間有限,僅能緩存部分數據。OSCache就是經常使用的本地緩存組件。
  • 分佈式緩存是指創建分佈式緩存存儲來解決本地空間有限的問題。它能夠緩存海量的數據,且易擴展,但速度較本地緩存稍慢。常見的分佈式緩存有Memcached、Redis。

利用服務器緩存

四、利用集羣改善應用服務器性能——負載均衡服務器

儘管在後臺咱們分離了不一樣模塊並部署獨立的服務器,而後採用緩存的措施改善網站性能,可是隨着用戶數量達到一個級別,全部用戶都去訪問同一臺應用程序服務器是不現實的,它會崩潰的。那怎麼作呢?最直接的想法就是分解用戶的訪問。既然一臺不行,咱們搞N臺來分擔用戶請求——即創建應用程序服務器集羣來共同承擔大量請求。那如何有效合適的將用戶請求分擔給不一樣的應用程序服務器呢,畢竟它們功能都同樣?常見的作法是在應用程序服務器前面(即在用戶請求和應用程序服務器之間)部署一個負載均衡服務器來調度用戶請求,讓它根據分發策略將用戶請求合理的分發到應用程序服務器節點。

常見的負載均衡技術提供有:

  • 硬件上:
    • F5
    • A10
    • 深信服等
  • 軟件上:
    • LVS
    • Nginx
    • HAProxy等

負載均衡概念普及

三大主流軟件負載均衡器對比(LVS、Nginx、HAproxy)

負載均衡服務器示例

五、數據庫讀寫分離

​ 進一步隨着用戶數量的增長,數據庫中的數據愈來愈龐大,網站性能天然而然的瓶頸即是數據庫。咱們知道,通常在大多數用戶業務中,數據庫中80%的操做都是在查詢數據——讀數據。那麼改善性能的方向就一目瞭然——將數據庫分離,一些數據庫專門進行讀數據業務,一些數據庫專門進行寫數據業務,而後經過主備功能實現各數據庫同步。

數據庫讀寫分離

六、數據庫分庫分表

除了數據庫在硬件上的讀寫分離可以改善web服務器性能外,隨着用戶量的增長,咱們也經常採用分庫分表來提升服務器的操做效率。

常見的分庫分表有:

  • 水平切分
    • 是指對數據庫中的特大表根據必定的方式進行行切分。
      • 例如,幾億的用戶信息表若是在一個數據庫中的一個數據表中,若是查詢起來,會很是慢(就算採用數據庫的索引功能——而且它自己就下降了數據的性能)。此時咱們能夠採用水平切分——根據用戶註冊時間進行水平切分,增長數據表數量,但單個數據錶行數減小,能夠提升查詢速度。
  • 垂直切分
    • 是指根據業務模塊來分別創建數據庫及服務器,根據業務來切換查詢。
      • 例如,一個大型電商網站,能夠將用戶業務相關的表創建數據庫放在一個數據庫服務器上;訂單業務相關的表創建數據庫放在一個數據庫服務器上;商品業務相關的表創建數據庫放在一個數據庫服務器上。這樣能夠實現查詢分離,其餘模塊也能夠直接調用這些基礎模塊的數據庫。

數據庫分庫分表

七、利用CDN和反向代理提升網站性能

試想一下,若是咱們的服務器部署在貴州,對於哈爾濱的用戶來講,要通過不少網關路由轉發才能夠獲取信息。而對於貴州本地用戶則很快。那咱們的業務在哈爾濱拓展起來會很是困難,畢竟網站體驗太差了。怎麼辦呢?常見的方式是CDN和網站自建反向代理。二者本質上均是在用戶請求到達應用程序服務器以前作一些網絡路徑優化的事情——如有緩存數據則直接返回給用戶,減短網絡請求路徑,下降應用程序服務器訪問頻次。

CDN與反向代理

**CDN:**CDN的全稱是Content Delivery Network,即內容分發網絡。將一些緩存放在運營商的機房,這樣用戶訪問時先從最近的運營商機房獲取數據,若不存在,再訪問咱們的web服務器。這種方式能夠大大減小網絡訪問路徑,畢竟每一個地區的用戶總有一些共性習慣,他們常常訪問的那些內容能夠經過CDN緩存在他們所在地區運營商的機房,提升訪問速度。這和本地緩存是一個道理,只不過是寄存到運營商那裏。常見的CDN運營商有:網宿、阿里雲、騰訊雲、白山雲、視界雲。這些適合沒有能力在各地創建本地服務器機房的網站。

目前CDN技術按照其側重點可分爲穩定派、全能派、性能派等「三大門派」:

穩定派:

CDN服務應保持內容分發的穩定性,在一體化技術、弱網加速技術、服務質量性能波動監測、智能故障診斷等強化技術積累,而非刻意追求最新的功能特效,好比客戶有防盜鏈更新時能夠第一時間告知客戶,並下降故障影響,對於賽事、演唱會等直播及短視頻場景中較有吸引力,主要表明廠商是網宿

全能派:

提供直播、點播的端到端的完整解決方案,除了CDN服務之外,還包括域名註冊、網站開發、IDC、雲通訊、移動服務、雲安全、監控與管理等綜合化一站式服務,主要表明廠家就是阿里雲、騰訊雲等。

性能派:

即經過自研核心、優化節點選擇和網絡部署,達到提高性能的目標,同時穩定性兼顧

實際上,哪怕網速總體提高0.1秒,就須要在提高核心Cache的響應速度、提高調度系統的響應速度、下降網絡節點的延遲、提高下載速度、縮小網絡節點距離用戶的距離等方面進行研發和投入;而單一環節的性能提高能夠知足直播和短視頻平臺對於CDN的苛刻需求,這方面的典型廠商是白山雲、視界雲。

**反向代理:**反向代理則是在自建機房裏部署反向代理服務器(網站自身有能力建設本地化服務器機房等同於CDN)。在用戶訪問時,首先訪問反向代理服務器,若請求數據有緩存數據,則直接將緩存數據返回給用戶;若請求數據沒有緩存數據,再去訪問應用程序服務器。這樣既加快了訪問速度,也分擔了應用程序服務器的訪問壓力。常見的反向代理有:Squid、Nginx等。

軟件名稱 性能 功能 過濾規則配置
Squid 不能多核是硬傷;磁盤緩存容量有優點;性能中等 多;支持ACL角色控制;支持ICP緩存協議 支持外部文件讀取及熱加載;支持熱啓動
Varnish 多核支持;內存緩存;性能強 夠用;支持集羣,但不支持ICP集羣;支持後端存活檢查 不支持外部文件讀取;須要轉義;支持熱啓動
Nginx 多核支持;支持代理插件;性能較強 多;支持集羣,但不支持ICP集羣;支持後端存活檢查;經過插件能夠充當多角色服務器 不支持外部文件讀取;須要轉義;支持熱啓動
Apache TS 多核支持;磁盤/內存緩存;性能強 夠用;支持後端存活檢查;支持ICP協議,Cluster不穩定;支持插件開發; 支持外部規則文件讀取及熱加載;支持熱啓動
HAProxy 多核支持;無緩存;支持HTTP頭部解析;性能強 少,只專一HTTP頭部解析和轉發功能;支持ACL角色控制;支持後端存活檢查 支持外部規則文件讀取及熱加載;支持熱啓動;支持會話粘滯和長鏈接
  • HTTP防護性能:HAProxy在應對大流量CC攻擊時,作正則匹配及頭部過濾時,CPU消耗只佔10%~20%。其它軟件均狂佔CPU資源約90%以上,容易成瓶頸致使整個系統無響應。
  • 反向代理性能:單純轉發效率之內存緩存型的Varnish性能最強,ATS和Nginx次之,考慮大容量緩存因素,ATS也是個不錯的選擇。Nginx是專門針對C10K的產物,性能不錯,配合本身編寫插件,業務可塑性很強。
  • 過濾規則的可配置性:HAProxy,ATS,Squid均支持規則文件讀取、ACL定製和熱加載、熱啓動。Nginx則不支持外部文件正則匹配,略差一點,但可塑性強。

八、使用分佈式存儲系統

隨着用戶數量的增長,像微信等這類網站,用戶天天都在發朋友圈,上傳大量的照片,產生的文件愈來愈多。單臺服務器確定存儲空間不足且性能會崩潰的。那怎麼辦呢?思路是同樣的,分解壓力,創建分佈式文件系統。常見的分佈式文件系統有:FastDFS、HDFS(hadoop)、NFS等。

技術 優勢 缺點 總結
HDFS 一、大數據批量讀寫,吞吐量高;二、一次寫入,屢次讀取,順序讀寫; 一、交互式應用,低延遲很難知足;二、不支持多用戶併發寫相同文件。 若是是不少小文件,nameNode壓力大
googleFs 一、成本低,運行在廉價的普通硬件上 一、不開源 不開源,使用困難
Tfs 一、淘寶開源 一、小於1M的文件 二、TFS內部是沒有任何數據的內存緩衝的 適合單個文件比較小的系統
Lustre 一、開源 二、 支持POSIX 三、 文件被分割成若干的Chunk,每一個chunk是通常爲1MB-4MB    
Ceph 一、支持POSIX 二、開源   一、 在Linux主流內核中找到ceph 二、不成熟,處於測試推廣階段
MogileFs 一、開源   比FastDFS 差
FastDFS 一、 開源 二、 適合以文件爲載體的在線服務三、 FastDFS沒有對文件作分塊存儲四、 不須要二次開發便可直接使用五、 比mogileFS更易維護和使用六、 直接使用socket通訊方式,相對於MogileFS的HTTP方式,效率更高。 一、文件訪問方式使用專有API,不支持POSIX  
swiftfs     基於HDFS
NFS 一、用戶和程序能夠象訪問本地文件同樣訪問遠端系統上的文件    

分佈式存儲

九、使用搜索引擎和NoSql

此時,咱們已解決了用戶上傳的海量文件的存儲。那咱們還須要解決海量文件的查詢。若是查詢太慢,朋友圈刷不出來豈不是很尷尬。目前常見的方式是採用NoSql數據庫加上搜索引擎來提升查詢性能。通常將文件存放在分佈式存儲系統和服務器,而創建非關係型數據庫來存儲相應的一些路徑等其餘信息,而後再使用搜索引擎創建數據庫的本地索引,這樣能夠極大的提升文件查詢性能。常見的NoSQL有Mongodb和Redis,搜索引擎有lucene、whoosh等。

關係型數據庫查詢也須要搜索引擎提高查詢性能

搜索引擎

十、應用程序服務業務拆分

在第四節,咱們經過多個相同的應用程序服務器來分擔請求壓力,這本質上是以硬件換性能的方式。爲了提升請求處理效率,咱們也能夠像數據庫讀寫分離那樣,經過業務拆分來分擔不一樣的應用請求。例如百度、騰訊將業務拆分爲新聞、網頁、圖片、貼吧等,每一個業務應用負責相對獨立的業務運做,而後各業務之間能夠進行通訊或者數據庫共享來實現總體的應用程序服務。

應用業務拆分

十一、搭建分佈式服務

除了業務拆分,就像代碼複用同樣,咱們也能夠將各業務都須要使用的基本業務服務抽取,以供全部應用來使用。這邊是分佈式服務。例如網站常見的用戶服務、訂單服務、支付服務、安全服務等服務經常是各業務應用的基本組成,咱們即可以抽取搭建分佈式服務;阿里的Dubbo分佈式服務框架即是這樣。

分佈式服務

最後,隨着業務繼續增加,服務器根據各地業務特點,能夠基於以上措施創建合適的本地服務器,最終由網站統一協調調度全球的服務器資源實現資源最大化利用。

本文參考了:

大型網站架構改進歷程

Web網站架構設計與部署

大型網站架構演化發展歷程

在首席架構師手裏,應用架構如此設計

在上一章主要從硬件組成上介紹了服務器架構部署,接下來轉載前1號店首席架構師王慶友的一篇博文來說述應用架構的發展。

在首席架構師手裏,應用架構如此設計

無架構,不繫統,架構是大型系統的關鍵。從形上看,架構是系統的骨架,支撐和連接各個部分;從神上看,架構是系統的靈魂,深入體現業務本質。

架構可細分爲業務架構、應用架構、技術架構,業務架構是戰略,應用架構是戰術,技術架構是裝備。其中應用架構承上啓下,一方面承接業務架構的落地,另外一方面影響技術選型。

如何針對當前需求,選擇合適的應用架構,如何面向將來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都須要深刻思考的問題。本文基於做者在大型互聯網系統的實踐和思考,和你們一塊兒探討應用架構的選型。

本文主要內容包括:

  • 應用架構本質
  • 單體式
  • 分佈式
  • SOA架構
  • SOA落地方式
  • 應用架構進化

應用架構本質

應用做爲獨立可部署的單元,爲系統劃分了明確的邊界,深入影響系統功能組織、代碼開發、部署和運維等各方面,應用架構定義系統有哪些應用、以及應用之間如何分工和合做。

分有兩種方式,一種是水平分,按照功能處理順序劃分應用,好比把系統分爲web前端/中間服務/後臺任務,這是面向業務深度的劃分。另外一種是垂直分,按照不一樣的業務類型劃分應用,好比進銷存系統能夠劃分爲三個獨立的應用,這是面向業務廣度的劃分。

應用的合反映應用之間如何協做,共同完成複雜的業務case,主要體如今應用之間的通信機制和數據格式,通信機制能夠是同步調用/異步消息/共享DB訪問等,數據格式能夠是文本/XML/JSON/二進制等。

應用的分偏向於業務,反映業務架構,應用的合偏向於技術,影響技術架構。分下降了業務複雜度,系統更有序,合增長了技術複雜度,系統更無序。

應用架構的本質是經過系統拆分,平衡業務和技術複雜性,保證系統形散神不散。

系統採用什麼樣的應用架構,受業務複雜性影響,包括企業發展階段和業務特色;同時受技術複雜性影響,包括IT技術發展階段和內部技術人員水平。業務複雜性(包括業務量大)必然帶來技術複雜性,應用架構目標是解決業務複雜性的同時,避免技術太複雜,確保業務架構落地。

常見的應用架構有多種,下面根據系統拆分方式,以及如何平衡業務與技術的角度進行分析,討論各自的適用性,給企業應用架構選型提供參考。

單體式應用

  1. 架構模型

系統只有一個應用,相應地,代碼放在一個工程裏管理;打包成一個應用;部署在一臺機器;在一個DB裏存儲數據。單體式應用的架構以下圖所示:

單體式應用架構示意

單體式應用採用分層架構,按照調用順序,從上到下通常爲表示層、業務層、數據訪問層、DB層,表示層負責用戶體驗,業務層負責業務邏輯,數據訪問層負責DB層的數據存取。

單體應用在水平方向上,上下層之間職責劃分清晰;但垂直方向上缺少清晰的邊界,上下層模塊之間是多對多的依賴關係,好比業務模塊1 (圖中BO1)可能調用數據層全部模塊DAO13, DAO1也可能被業務層全部模塊BO13調用。

單體應用經過水平分層,下降了業務複雜性;同時模塊之間是進程內部調用,技術實現簡單。

但單體應用對系統的切分不完全,只有水平切分,而且是邏輯上,所以適合業務比較單一,但深度上比較複雜的系統,好比TCP/IP網絡通信,從應用層/傳輸層/網絡層/鏈路層,層層推動,相似這樣的系統能夠方便地增長水平層次去適配。

對於廣度上覆雜的業務,因爲缺少垂直切分,強行把不一樣業務綁定在一塊兒,整個系統神散形不散,帶來一系列問題。好比OTA網站包含機票/酒店/旅遊等多個垂直業務板塊,每塊都比較獨立,就不適合放在一塊兒開發維護。

  1. 優缺點

單體式應用的優勢和缺點都很鮮明,以下圖所示。

單體式應用優缺點

單體式應用的優勢明顯:

  • 現有IDE都是集成開發環境,很是適合單體式應用,開發、編譯、調試一站式搞定。 一個應用包含全部功能,容易測試和部署。
  • 運行在一個物理節點,環境單一,運行穩定,故障恢復簡單。

單體式應用的缺點也明顯:

  • 業務邊界模糊,模塊職責不清晰,當系統逐漸變大,代碼依賴複雜,難以維護。
  • 全部人同時在一個工程上開發,容易發生代碼修改衝突,依賴複雜致使項目協調困難,而且局部修改影響不可知,須要全覆蓋測試,須要從新部署,難以支持大團隊並行開發。
  • 當系統很大時,編譯和部署耗時。
  • 應用水平擴展難,一方面狀態在應用內部管理,沒法透明路由;另外一方面,不一樣模塊對資源需求差別大,當業務量增大時,一視同仁地爲全部模塊增長機器致使硬件浪費。

做者以前曾在一家大型電商公司工做,當時整個網站是一個單體應用,有數百萬行代碼,有專門的團隊負責代碼合併,有專門的團隊負責編譯腳本開發,有一套複雜的火車模型協調不一樣團隊,整套流程體系很精密很複雜,但這未嘗不是單體應用的無奈和代價。

分佈式架構應用

  1. 架構模型

分佈式架構模型示意

在分佈式應用架構中,應用相互獨立,每一個應用代碼獨立開發,獨立部署,應用經過有限的API接口互相關聯。API接口屬於應用一部分,通常和表示層處於同一層次,二者共享業務邏輯層,API和表示層採用一樣的web端技術,通信協議通常使用HTTP,數據格式是JSON,應用集成方式比較簡化。

分佈式架構首先對系統按照業務進行垂直切分,對廣度上覆雜的業務實現物理解耦,應用內部仍是水平切分,對深度上覆雜的業務實現邏輯解耦。分佈式架構也能夠解決業務量大的問題,對於某些高併發/大流量系統,把系統切分爲不一樣應用,針對資源需求特色(好比CPU/IO/存儲密集型),經過增強硬件配置知足不一樣應用的需求,避免一刀切方式帶來的資源浪費。

技術上,API採用標準的HTTP/JSON進行通信,調用雙方實現難度都不大,可是API 通常是「裸奔」的,在系統層面,調用依賴關係不透明,調用可靠性缺少保障,所以只適用應用之間依賴鏈路少,調用量不大的系統,即應用之間耦合確實夠鬆的系統。

  1. 優缺點

分佈式架構每一個應用內部高內聚,獨立開發、測試和部署,支持開發敏捷;同時應用之間鬆耦合,業務邊界清晰,業務依賴明確,支持大項目並行開發,實現業務敏捷。

在分佈式架構中,應用的表示層和API沒有物理分離,須要同時知足自身業務需求和關聯業務需求,相互影響,好比API接口會隨着外部應用的需求常常變化,這會致使整個應用從新部署。

運行時,API以HTTP/REST方式經過網絡對外提供接口,其通訊可靠性和數據的封裝性相對於進程內調用比較差,若是沒有一些可靠的技術機制,如路由保障/失敗重試/監控等, 裸奔的API方式將嚴重影響系統總體可用性。

SOA架構

  1. 架構模型

SOA架構示意

廣義上,SOA也是分佈式應用架構一種,但內涵不一樣。

這裏有兩種類型「應用」,應用1N是前端應用,面向用戶,服務1N是service,只提供業務邏輯和數據。這些應用都是獨立部署,前端應用再也不經過API直接關聯,而是經過後端服務共享業務邏輯。

此外相對於「裸奔」的API,SOA架構提供配套的服務治理,包括服務註冊、服務路由、服務受權、服務降級、服務監控等等。這些功能經過專門的中間件支持,有中心化和去中心化兩種方式,具體技術實現機制和適用場景,網上有不少專門介紹,這裏就不展開了。

SOA架構在分佈式架構垂直切分的基礎上,進一步把原來單體應用的業務邏輯層獨立成service,作到物理上的完全分離。

每一個service專一於特定職責,實現系統核心業務邏輯,service之間經過互相調用,能夠完成複雜業務邏輯,解決業務深度上的問題;同時service面向衆多的應用,以共享的方式支持邏輯複用。因此,SOA架構既體現業務的分,又體現業務的合,更多地從業務總體上考慮系統拆分。

相比分佈式應用架構,基於SOA的系統有大量的service應用,整個系統基於服務調用,因此對服務依賴的透明性和服務調用的可靠性提出很高要求,須要專門的SOA框架支持,還須要配套的監控體系和自動化的運維繫統支持,技術複雜性高,SOA架構能夠集中體現一個企業的IT技術能力。

  1. 優缺點

SOA架構優缺點以下圖所示:

SOA架構優缺點

相比較普通API方式,SOA架構更進一步:

1)每一個service都是濃縮的精華,聚焦某方面核心業務,同時以複用的方式供整個系統共享。 2)服務做爲獨立的應用,獨立部署,接口清晰,很容易作自動化測試和部署。 3)服務是無狀態的,很容易作水平擴展;經過容器虛擬化技術,實現故障隔離和資源高效利用,業務量大的時候,加機器便可。 4)基於SOA的系統能夠根據服務運行狀況,靈活調控服務資源,包括服務上下架、服務升降級等,使系統真正具有可運營的能力。

固然天下沒有免費的午飯,SOA也帶來了額外複雜性和弊端:

1)系統依賴複雜,給開發/測試/部署帶來一系列挑戰。 2)端到端的調用鏈路長,可靠性下降,依賴網絡情況、服務框架及具體service的質量。 3)分佈式數據一致性和分佈式事務支持困難,通常經過最終一致性簡化解決。 4)端到端的測試和排障複雜,SOA對運維提出更高要求。

SOA落地方式

在實踐中,SOA架構不斷深刻發展,具體落地形式也多種多樣。

1)面向外部SOA

SOA的前身是web service,web service初衷是企業之間經過Internet進行互聯,以下圖所示:

面向外部SOA

每一個公司把本身的優點資源經過web service發佈,如圖中天氣服務/機票服務/酒店預訂服務來自不一樣公司,其餘企業能夠直接調用服務或整合多個服務,實現企業間資源共享。

2)面向應用SOA

面向應用SOA把原單體應用裏的業務邏輯層剝離出來,做爲單獨的服務對外提供。 舉一個電商的例子,這裏有兩個應用,顧客使用的商品詳情頁,展現商品的信息、商品庫存,商品價格;內部客服人員使用的客服系統,根據顧客來電要求,修改訂單,同時也須要獲取商品的基本信息、價格信息等。

通過SOA改造後,應用架構以下圖所示:

面向應用SOA

這裏的service實現底層數據對於前端頁面的透明化,表示層和業務邏輯各自獨立維護,同時所有業務邏輯對其餘應用開放,新應用能夠自由整合來自多個服務的接口,快速支持業務創新。

面向應用的SOA架構對系統進行物理上的水平切分,結果是表示層單飛,邏輯層對外全開放。但每一個service是原系統業務邏輯的封裝,接口設計面向原應用的業務case,若是其它應用的需求有差別,則本身建立service訪問底層數據。如此致使service職責不夠聚焦,相似的接口分散化,同時底層數據表被多方訪問,數據模型修改困難,數據一致性難以保障。

最終系統總體依賴複雜,容易造成網狀結構,修改時,每每牽一髮動全身。

3)微內核SOA 每一個企業都有本身的核心數據,好比對於電商系統來講,用戶/商品/訂單/庫存/價格都是核心數據,稱之爲主數據。微內核SOA聚焦各種主數據,封裝相關表的全部訪問,架構示意以下:

微內核SOA

每一個服務獨佔式地封裝對應主數據表的訪問,這些服務構成系統的基礎服務,一塊兒組成系統的微內核,供全部上層應用共享。

微內核服務是原子服務,接口粒度比較細,能夠在其上構造聚合服務,爲上層應用提供粗粒度服務。能夠是信息聚合,好比圖中商品聚合服務整合商品的基本信息/庫存/價格;也能夠是流程聚合,好比下單接口,調用來自多個服務的接口,共同完成複雜的下單操做。

這裏服務是分層次的,聚合服務是上層,基礎服務是底層,依賴規則以下:

  • 上層服務能夠調用同層服務和基礎服務
  • 基礎服務是原子服務,不可相互調用
  • 前端應用可調用聚合服務和跨層調用基礎服務

微內核的微表示服務數量有限,接口粒度細;內核表示這些基礎服務處於調用底層,負責核心數據和業務,這和操做系統的內核概念上相似,主數據至關於核心的硬件,如cpu/內存/外存等,微內核的各個基礎服務分別負責這些核心資源的管理,屏蔽底層的複雜性,對上層應用提供統一入口和透明化訪問。

最近微服務很火,其特徵是職責單1、接口粒度細、輕量級通信協議等,微內核SOA架構有微服務的形,同時有業務內核的神,是架構形散神不散思想的很好體現,這個在淘寶、京東、一號店等大型電商系統都已有豐富實踐。

4)方式比較

面向企業外部SOA,業務場景有特殊性,不深刻分析,這裏主要比較面向應用SOA和微內核SOA的區別,一個大型B2C電商系統,應用和主數據是多對多依賴關係,以下圖所示:

SOA比較

面向應用的服務從特定應用出發,整合應用對相關數據的訪問需求;微內核服務從特定主數據爲中心,收斂各個業務對數據的訪問需求。

在面向應用的服務設計下,數據表的訪問入口是發散的,來自多個應用,這帶來一系列弊端: 1)數據模型碎片化 每一個應用都會基於本身的需求,往表裏加字段,不少電商的商品表/訂單表有多達200個字段,都是野蠻增加,缺乏控制的結果。 2)數據模型修改困難 相似的訪問需求散佈在多個服務,缺少整合,同時表schema修改會影響不少服務和應用。 3)鏈接資源利用率低 多個服務直連數據庫,而且每一個服務會盡量多地配置鏈接數,在應用數量多,業務併發量大的狀況下,每每致使數據庫鏈接數不夠。

微內核SOA經過收斂對主數據的訪問,保證數據模型一致性、優化接口和有效利用數據庫鏈接資源。同時經過服務分層,簡化系統依賴關係。更爲重要的是,微內核服務保證了業務模型的一致性,好比電商系統的商品體系,包含單品/系列商品/組合商品/搭售商品/虛擬商品等一系列複雜概念,這些複雜邏輯在基礎商品服務裏處理,對上層業務透明一致。

若是業務模式簡單,應用數量少,特定主數據的訪問絕大多數(好比說80%)來自某個應用,則服務設計以應用爲中心是能夠的,不利影響比較小。

對於大型互聯網系統,業務廣度和深度都複雜,但不管多複雜的系統,主數據類型都是有限的,能夠經過聚焦有限的基礎業務,以此支持無限的應用業務,結果是底層業務模型穩定,上層業務能夠靈活擴展。

面向應用的服務設計是SOA初級階段,從具體業務着手,自底向上,難度小;微內核服務設計是SOA高級階段,從全局着手,對業務和數據模型高度抽象,自頂向下,難度大。

值得注意的是,在提供基礎服務同時,每一個應用也能夠建立本身須要的服務(但主數據的訪問必須經過基礎服務),因此微內核的服務和麪嚮應用的服務能夠有機結合在一塊兒,當業務應用變得不少,而且不斷增加,能夠考慮逐步往基礎服務過渡,整合特定主數據有關的業務邏輯。

順便提一下,應用架構會影響組織架構,若是採用面向應用的服務設計,具體service通常由相關應用的團隊負責;若是是微內核的服務設計,通常由單獨的共享服務部門負責全部基礎服務開發,和各個業務研發部門並列,保證設計的中立性和需求響應的及時性。

應用架構的進化

軟件是人類活動的虛擬,業務架構是生產活動的體現,應用架構是具體分工合做關係的體現。 單體應用相似原始氏族時代,氏族內部有簡單分工,氏族之間沒有聯繫;分佈式架構相似封建社會,每一個家庭自給自足,家庭之間有少許交換關係;SOA架構相似工業時代,企業提供各類成品服務,我爲人人,人人爲我,相互依賴。微內核的SOA架構相似後工業時代,有些企業聚焦提供水電煤等基礎設施服務,其餘企業在之上提供生活服務,依賴有層次。

業務架構是生產力,應用架構是生產關係,技術架構是生產工具。業務架構決定應用架構,應用架構須要適配業務架構,並隨着業務架構不斷進化,同時應用架構依託技術架構最終落地。

企業一開始業務比較簡單,好比進銷存,此時面向內部用戶,提供簡單的信息管理系統(MIS),支持數據增刪改查便可,單體應用能夠知足要求。

隨着業務深刻,進銷存每塊業務都變複雜,同時新增客戶關係管理,以更好支持營銷,業務的深度和廣度都增長,這時須要對系統按照業務拆分,變成一個分佈式系統。

更進一步,企業轉向互聯網+戰略,拓展在線交易,線上系統和內部系統業務相似,不必重作一套,此時把內部系統的邏輯作服務化改造,同時供線上線下系統使用,變成一個簡單的SOA架構。

緊接着業務模式愈來愈複雜,訂單、商品、庫存、價格每塊玩法都很深刻,好比價格區分會員等級,訪問渠道(無線仍是PC),銷售方式(團購仍是普通)等,還有大量的價格促銷,這些規則很複雜,容易相互衝突,須要把分散到各個業務的價格邏輯進行統一管理,以基礎價格服務的方式透明地提供給上層應用,變成一個微內核的SOA架構。

同時無論是企業內部用戶,仍是外部顧客所須要的功能,都由不少細分的應用提供支持,須要提供portal,集成相關應用,爲不一樣用戶提供統一視圖,頂層變成一個AOA的架構(application orientated architecture)。

隨着業務和系統不斷進化,最後一個比較完善的大型互聯網應用架構以下圖所示:

大型互聯網應用架構

最終整個系統化整爲零,形神兼備,支持積木式拼裝,支持開發敏捷和業務敏捷。

應用架構,須要站在業務和技術中間,在正確的時間點作正確的架構選擇,保證系統有序進化。

相關文章
相關標籤/搜索