'作為首席架構師,我是如何選擇並落地架構方案的?'

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

2、優缺點

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

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

SOA落地方式

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

1、面向外部SOA

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

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

SOA落地方式

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

1、面向外部SOA

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

作為首席架構師,我是如何選擇並落地架構方案的?

每個公司把自己的優勢資源通過web service發佈,如圖中天氣服務/機票服務/酒店預訂服務來自不同公司,其他企業可以直接調用服務或整合多個服務,實現企業間資源共享。

2、面向應用SOA

面向應用SOA把原單體應用裡的業務邏輯層剝離出來,作為單獨的服務對外提供。

舉一個電商的例子,這裡有兩個應用,顧客使用的商品詳情頁,展示商品的信息、商品庫存,商品價格;內部客服人員使用的客服系統,根據顧客來電要求,修改訂單,同時也需要獲取商品的基本信息、價格信息等。

經過SOA改造後,應用架構如下圖所示:

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

SOA落地方式

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

1、面向外部SOA

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

作為首席架構師,我是如何選擇並落地架構方案的?

每個公司把自己的優勢資源通過web service發佈,如圖中天氣服務/機票服務/酒店預訂服務來自不同公司,其他企業可以直接調用服務或整合多個服務,實現企業間資源共享。

2、面向應用SOA

面向應用SOA把原單體應用裡的業務邏輯層剝離出來,作為單獨的服務對外提供。

舉一個電商的例子,這裡有兩個應用,顧客使用的商品詳情頁,展示商品的信息、商品庫存,商品價格;內部客服人員使用的客服系統,根據顧客來電要求,修改訂單,同時也需要獲取商品的基本信息、價格信息等。

經過SOA改造後,應用架構如下圖所示:

作為首席架構師,我是如何選擇並落地架構方案的?

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

但每個service是原系統業務邏輯的封裝,接口設計面向原應用的業務case,如果其它應用的需求有差異,則自己創建service訪問底層數據。如此導致service職責不夠聚焦,類似的接口分散化,同時底層數據表被多方訪問,數據模型修改困難,數據一致性難以保障。

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

3、微內核SOA

每個企業都有自己的核心數據,比如對於電商系統來說,用戶/商品/訂單/庫存/價格都是核心數據,稱之為主數據。微內核SOA聚焦各類主數據,封裝相關表的所有訪問,架構示意如下:

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

SOA落地方式

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

1、面向外部SOA

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

作為首席架構師,我是如何選擇並落地架構方案的?

每個公司把自己的優勢資源通過web service發佈,如圖中天氣服務/機票服務/酒店預訂服務來自不同公司,其他企業可以直接調用服務或整合多個服務,實現企業間資源共享。

2、面向應用SOA

面向應用SOA把原單體應用裡的業務邏輯層剝離出來,作為單獨的服務對外提供。

舉一個電商的例子,這裡有兩個應用,顧客使用的商品詳情頁,展示商品的信息、商品庫存,商品價格;內部客服人員使用的客服系統,根據顧客來電要求,修改訂單,同時也需要獲取商品的基本信息、價格信息等。

經過SOA改造後,應用架構如下圖所示:

作為首席架構師,我是如何選擇並落地架構方案的?

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

但每個service是原系統業務邏輯的封裝,接口設計面向原應用的業務case,如果其它應用的需求有差異,則自己創建service訪問底層數據。如此導致service職責不夠聚焦,類似的接口分散化,同時底層數據表被多方訪問,數據模型修改困難,數據一致性難以保障。

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

3、微內核SOA

每個企業都有自己的核心數據,比如對於電商系統來說,用戶/商品/訂單/庫存/價格都是核心數據,稱之為主數據。微內核SOA聚焦各類主數據,封裝相關表的所有訪問,架構示意如下:

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

4、方式比較

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

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

SOA落地方式

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

1、面向外部SOA

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

作為首席架構師,我是如何選擇並落地架構方案的?

每個公司把自己的優勢資源通過web service發佈,如圖中天氣服務/機票服務/酒店預訂服務來自不同公司,其他企業可以直接調用服務或整合多個服務,實現企業間資源共享。

2、面向應用SOA

面向應用SOA把原單體應用裡的業務邏輯層剝離出來,作為單獨的服務對外提供。

舉一個電商的例子,這裡有兩個應用,顧客使用的商品詳情頁,展示商品的信息、商品庫存,商品價格;內部客服人員使用的客服系統,根據顧客來電要求,修改訂單,同時也需要獲取商品的基本信息、價格信息等。

經過SOA改造後,應用架構如下圖所示:

作為首席架構師,我是如何選擇並落地架構方案的?

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

但每個service是原系統業務邏輯的封裝,接口設計面向原應用的業務case,如果其它應用的需求有差異,則自己創建service訪問底層數據。如此導致service職責不夠聚焦,類似的接口分散化,同時底層數據表被多方訪問,數據模型修改困難,數據一致性難以保障。

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

3、微內核SOA

每個企業都有自己的核心數據,比如對於電商系統來說,用戶/商品/訂單/庫存/價格都是核心數據,稱之為主數據。微內核SOA聚焦各類主數據,封裝相關表的所有訪問,架構示意如下:

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

4、方式比較

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

在面向應用的服務設計下,數據表的訪問入口是發散的,來自多個應用,這帶來一系列弊端:

1)數據模型碎片化

每個應用都會基於自己的需求,往表裡加字段,很多電商的商品表/訂單表有多達200個字段,都是野蠻增長,缺少控制的結果。

2)數據模型修改困難

類似的訪問需求散佈在多個服務,缺乏整合,同時表schema修改會影響很多服務和應用。

3)連接資源利用率低

多個服務直連數據庫,並且每個服務會盡可能多地配置連接數,在應用數量多,業務併發量大的情況下,往往導致數據庫連接數不夠。

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

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

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

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

值得注意的是,在提供基礎服務同時,每個應用也可以創建自己需要的服務(但主數據的訪問必須通過基礎服務),所以微內核的服務和麵嚮應用的服務可以有機結合在一起,當業務應用變得很多,並且不斷增長,可以考慮逐步往基礎服務過渡,整合特定主數據有關的業務邏輯。

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

應用架構的進化

軟件是人類活動的虛擬,業務架構是生產活動的體現,應用架構是具體分工合作關係的體現。

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

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

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

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

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

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

同時不管是企業內部用戶,還是外部顧客所需要的功能,都由很多細分的應用提供支持,需要提供portal,集成相關應用,為不同用戶提供統一視圖,頂層變成一個AOA的架構(application orientated architecture)。

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

"

前言

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

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

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

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

應用架構本質

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

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

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

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

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

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

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

單體式應用

1、架構模型

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

但單體應用對系統的切分不徹底,只有水平切分,並且是邏輯上,因此適合業務比較單一,但深度上比較複雜的系統,比如TCP/IP網絡通訊,從應用層/傳輸層/網絡層/鏈路層,層層推進,類似這樣的系統可以方便地增加水平層次去適配。

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

單體式應用的優點明顯:

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

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

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

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

分佈式架構應用

作為首席架構師,我是如何選擇並落地架構方案的?

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

2、優缺點

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

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

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

SOA架構

1、架構模型

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

2、優缺點

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

SOA落地方式

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

1、面向外部SOA

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

作為首席架構師,我是如何選擇並落地架構方案的?

每個公司把自己的優勢資源通過web service發佈,如圖中天氣服務/機票服務/酒店預訂服務來自不同公司,其他企業可以直接調用服務或整合多個服務,實現企業間資源共享。

2、面向應用SOA

面向應用SOA把原單體應用裡的業務邏輯層剝離出來,作為單獨的服務對外提供。

舉一個電商的例子,這裡有兩個應用,顧客使用的商品詳情頁,展示商品的信息、商品庫存,商品價格;內部客服人員使用的客服系統,根據顧客來電要求,修改訂單,同時也需要獲取商品的基本信息、價格信息等。

經過SOA改造後,應用架構如下圖所示:

作為首席架構師,我是如何選擇並落地架構方案的?

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

但每個service是原系統業務邏輯的封裝,接口設計面向原應用的業務case,如果其它應用的需求有差異,則自己創建service訪問底層數據。如此導致service職責不夠聚焦,類似的接口分散化,同時底層數據表被多方訪問,數據模型修改困難,數據一致性難以保障。

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

3、微內核SOA

每個企業都有自己的核心數據,比如對於電商系統來說,用戶/商品/訂單/庫存/價格都是核心數據,稱之為主數據。微內核SOA聚焦各類主數據,封裝相關表的所有訪問,架構示意如下:

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

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

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

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

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

4、方式比較

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

在面向應用的服務設計下,數據表的訪問入口是發散的,來自多個應用,這帶來一系列弊端:

1)數據模型碎片化

每個應用都會基於自己的需求,往表裡加字段,很多電商的商品表/訂單表有多達200個字段,都是野蠻增長,缺少控制的結果。

2)數據模型修改困難

類似的訪問需求散佈在多個服務,缺乏整合,同時表schema修改會影響很多服務和應用。

3)連接資源利用率低

多個服務直連數據庫,並且每個服務會盡可能多地配置連接數,在應用數量多,業務併發量大的情況下,往往導致數據庫連接數不夠。

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

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

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

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

值得注意的是,在提供基礎服務同時,每個應用也可以創建自己需要的服務(但主數據的訪問必須通過基礎服務),所以微內核的服務和麵嚮應用的服務可以有機結合在一起,當業務應用變得很多,並且不斷增長,可以考慮逐步往基礎服務過渡,整合特定主數據有關的業務邏輯。

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

應用架構的進化

軟件是人類活動的虛擬,業務架構是生產活動的體現,應用架構是具體分工合作關係的體現。

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

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

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

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

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

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

同時不管是企業內部用戶,還是外部顧客所需要的功能,都由很多細分的應用提供支持,需要提供portal,集成相關應用,為不同用戶提供統一視圖,頂層變成一個AOA的架構(application orientated architecture)。

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

作為首席架構師,我是如何選擇並落地架構方案的?

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

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

老司機介紹

作者:王慶友,前1號店首席架構師,先後就職於eBay、騰訊、1號店等公司,精通電商業務,擅長複雜系統業務建模和架構分析,同時在構建大規模的分佈式系統方面有豐富實踐,尤其在大型系統的SOA改造方面有很深入的理論和實踐。

"

相關推薦

推薦中...