架構一直以來都被認爲是高階技術人員的代名詞,但什麼是架構,什麼樣的架構人員才稱得上一個好的架構師,這是很難評判的。可是,要提升架構能力, 只寄但願於代碼層級是遠遠不夠的, 代碼只能幫助咱們解決執行力的問題,但架構的高度更多的是依賴戰略(業務洞察力)以及戰術問題(技術視野)來解決問題。html
但架構的高度究竟是在一個什麼層面上呢?架構的高度(既架構戰略和架構技術,也就是架構格局)。java
在設計一個架構的時候,一般都須要完整的解決方案去解決實際問題,這些問題包括根據具體業務場景選擇合適的系統架構形態;針對所選擇的架構形態應該如何去設計實現;在這之中若是有困難如何去折中處理;系統的架構若是在線上運行中出現問題該如何解決...等等一系列問題都是在架構設計之初都須要考慮到的問題。這就很須要架構師的架構格局來作支撐。其實在架構的背後,更多的是思考,思考爲何這麼設計,爲何其它方案不優雅不合適等等一系列的爲何。mysql
因此若是要作好一個架構,須要有絕對的理論支撐,實際的項目架構落地實踐。拒絕忽悠,拒絕空理論、空概念。nginx
架構完整解決方案redis
架構背後哲學思考sql
架構的實踐mongodb
在互聯網的發展之路上,正在經歷這3個階段,過去的PC互聯網,如今的移動互聯網,將來的物聯網。數據庫
在PC互聯網時代,咱們暫且稱之爲互動1.0時代。在這個階段,之內容在線爲主要核心,但資源之間的互動方式沒有發生太多的變化,仍是一箇中心對多點的廣播模式,好比過去的三大門戶網站(百度,搜狐,網易)。在PC互聯網後期,移動互聯網時代早期,也就是互動2.0時代。這個階段以互動爲核心,比較有表明性的產品有微博,Twitter。這些產品有了「關注」,由於「關注」產生了互動,產生了網絡效應,說的人越多,看的人也越多,反之亦然。這讓網絡由於「關注」這個機制有了自成長的一個可能性,一個契機。緩存
在移動互聯網後期,暫稱互動3.0時代,由於「關注」把一對一的關係變成了更普遍的多對多關係,造成了真正的交互網絡形態,人和信息都在線了。網越織越密,纔有了用更高效的方式實現原來很難實現的功能,網絡文明再一次進步。服務器
將來物聯網將帶來更廣闊的天空,更難以想象的生活方式。
在這過程當中,互聯網發展的特色也愈來愈明顯,好比:
單一架構通常都是一個普通的java war文件,其內部的java代碼目錄層次結構單一。一個單體架構系統的架構圖大體如圖所示:
單體架構的優勢若是單體架構承載不了更高的壓力怎麼辦?單體架構的擴張就是使用nginx作反向代理,基於不一樣負載均衡策略把請求壓力發送到其它單體應用上。單體架構的應用是一個war包部署在Tomcat上,擴展只須要再搞一臺機器使用Tomcat部署war包就能夠了,如圖所示:
單體架構適用場景說完了單體架構的一些優勢,其實單體架構也存在一些缺點:
隨着系統的使用愈來愈久,公司發展成長愈來愈迅速。系統的數據量及訪問量也愈來愈大,針對這種情況若是應對解決呢?
水平分層架構是把系統向水平方向物理分紅多個進程來運行,每層都有本身的邏輯,實現邏輯解耦。好比:網關層、業務邏輯層、數據訪問層、數據存儲層。下圖是一個水平分層的系統架構圖:
水平分層架構拆分的設計原則在根據水平分層架構設計的時候,也會遇到一些技術選項的問題,下圖展現一個網關層技術選項對比維度圖,其它的技術選項對比維度圖也相似如此:
業務邏輯層應該具有的基本功能
數據訪問層應該具有的基本功能
水平分層架構雖然解決了一些問題,但其終究仍是同步架構的一種,爲了讓水平架構的處理能力更上一個臺階,能夠將其改形成一個異步架構的水平分層架構,以下圖所示:
經過引入MQ消息中間件實現分層的異步處理,提高系統吞吐量。設計過多
設計過少
設計合理適中
即使使用了水平分層架構,也仍是存在缺點的,這樣的分層方式仍是粒度過粗,咱們看看最後水平分層架構的全貌圖
App客戶端先訪問DNS域名解析服務器得到服務器IP;而後經過靜態資源服務器獲取CSS、JS等靜態資源;最後調用服務器動態接口獲取數據展現。參考 SOA(Service-Oriented Architecture)面向服務的分佈式架構詳解
參考 微服務架構設計
微服務架構有利也有弊,很差的設計會出現一些問題。由於微服務中業務關注服務局「通訊」,業務迭代須要多方業務支持,致使業務迭代速度慢;基礎設施組件升級困難,影響交付能力和交付速度;多語言通訊之間的問題,業務服務每種語言一套基礎設施、成本大。
下圖是關於上述問題的圖示:
應用程序A部署在一臺機器上,一樣的sidecarA也一樣部署在這樣機器上,sidecarA是基礎設施組件,其實現了服務發現,配置管理,熔斷限流,各類服務治理的功能,這使得應用程序不用再關注服務治理的相關編碼實現,只須要注重業務編碼的實現,關注點拆分(而在微服務架構中是須要同時兼顧考慮的)。打個比方須要修重試策略,修改註冊中心,修改服務調用路由規則,這些在微服務架構中須要修改應用編碼從新部署才能生效,而在服務網格架構中只須要修改技術設施組件,在不影響業務功能代碼的狀況下進行修改發佈升級。
下圖是一個服務網格架構圖:
Service Mesh的技術框架
框架 | 開發語言 | 開發公司 |
---|---|---|
Linkerd | Scala | Buoyant |
Conduit | Rust | Buoyant |
Envoy | C++ | Lyft |
Nginmesh | Go | Nginx |
Istio | Go/C++ | Goole,IBM,Lyft |
因爲Istio是集大成這於一身,因此這裏介紹一下Istio,更多詳細的內容能夠參考 Istio官方文檔
這個章節從真實案例入手講解架構的演進之路,給予同窗們更多的思考。
「百度空間」維護的推送系統用於展示好友動態,且服務於百度衆多的產品線(好比百度空間、知道、經驗、旅遊、ting、IM等等),80、90後應該對下面這張圖比較熟悉,這就是那個時候的百度空間。
咱們假設它的系統性能吞吐量爲 100000 QPS, 平均響應延遲: 100ms若是要設計這樣的系統,它的設計難點會是什麼?
下面簡單的看一張整體架構圖:
該架構選取了Pull方式減輕系統壓力與異步方式提高系統處理能力。在這個場景下,消息內容並不須要全部關注者都及時看到最新消息,能夠在用戶上線後再去拉去被關注者新發布的內容,以此來減輕瞬時大數據量發送的問題,微博就相似如此。若是不少人都在同時發佈內容,服務器處理須要時間,但爲了讓用戶避免過長等待,能夠先把內容保存至消息隊列中,以後將內容緩存在用戶客戶端上告知處理成功。在這中間下游業務服務器會從消息隊列中取出內容繼續處理,若是處理失敗能夠通知客戶端失敗,成功則不做通知用戶的操做。以此來提高用戶體驗與系統處理能力。
換個例子,好比58同城中的IM聊天功能,用於知足用戶與商戶溝通,獲取信息,系統如圖所示:
咱們假設該系統包含模塊 30+個,使用了多種開發語言,好比Java/Go。日請求在10億(IM)和30億(非IM),同時在線用戶數突破 100w+。若是要設計這樣的系統,它的設計難點會是什麼?
下面簡單的看一張整體架構圖:
由於IM設計爲異步過於複雜,考慮IM聊天實時性,採用同步水平分層架構;那如何保持百萬/千萬鏈接數,後面的內容會繼續介紹。
下面簡單的看一張整體架構圖:
對於上圖的架構,仍是存在着一些問題,好比:那麼對於這些問題能夠如何解決呢?能夠考慮使用垂直拆分(業務維度)來進行進一步的系統結構優化。看案例四
結合上述微服務架構的案例三,把業務邏輯層按照垂直拆分的概念拆分出來了多個獨立維度的業務邏輯層服務,各自使用不一樣的物理進程,如圖所示:
但對於該架構仍是存在某些問題,好比:那麼對於這些問題能夠如何解決呢?能夠採用組件化依賴jar包方式,對業務邏輯層再深度優化,抽取公共部分下沉爲獨立服務,提供兼容接口,使用水平拆分(功能維度)策略。
最後能夠看到拆分出來的公共邏輯層也造成了一個服務進程,下沉在業務邏輯層和數據訪問層之間,這樣既能夠減小業務邏輯層同級之間互相調用循環依賴的問題,也能夠更好的抽離冗餘代碼。最後再結合Service Mesh的架構設計理念,就將成爲一個更強大更高效的軟件系統架構。
下圖是一張簡單的整體架構圖:
針對本文內容,思考本身公司所在的業務線若是優雅實施微服務架構,要求以下: