網路架構及其演變過程總結

引自網路
最近讀了韓路彪老師寫的“網路架構及其演變過程”的文章,在這裡做了一個記錄,分享給大家!
軟體的三大型別
首先我們說下軟體的三大型別是如何演變過來的:
從一開是我們使用的單機軟體,所謂的單機軟體,就是所有的處理邏輯全部都pc電腦的程式上,並不需要聯網就可以使用的,後來人們在使用的過程中,想要一個程式能夠統一的去管理我們的軟體,每個人電腦上的軟體都能夠連到這個程式,統一去的去處理我們的請求,這就衍生出來了客戶機/伺服器的軟體型別,我們習慣的成為CS;由於人們在一個東西用久了之後,就會再想著有沒有一種更簡潔的辦法去使用呢,因為最近他已經被頻繁的更新系統弄煩了,而且換了電腦之後,又得重新安裝一下那個程式才能使用,所以B/S就出現了,每個系統裝完之後都會自帶一個瀏覽器。我們現在可以把瀏覽器作為我們的程式客戶端,通過他去請求服務,使用者也不需要手動去更新軟體和安裝軟體,只需要開啟瀏覽器就可以享受服務。兩種軟體架構圖如下所示。

引自《看透springMvc原始碼分析與實踐》

引自《看透springMvc原始碼分析與實踐》
對比兩張圖可以看出,從C/S向B/S演進的過程中,就是我們的客戶端被瀏覽器取代了。
基礎的架構B/S是如何演變今天這種複雜的架構呢?
傳統的BS架構雖然很簡單,但是他底層的實現機制確實很複雜,因為他必須要解決網路資料傳輸的問題,在網路通訊中,使用最多的協議族就是TCP/IP通訊,至於是怎麼演變成今天這樣一個完整的架構體系呢?
由於當一個企業剛開始使用系統的時候,這種傳統的BS還是能滿足的,傳統的BS架構上,應用程式和資料庫程式是放在同一個伺服器上,到過資料累計到一定量的時候,就得使用更多的解決方案去處理它,首先我們想到的肯定是將資料庫和應用程式進行分離,這個確實能解決暫時的問題,但是隨著資料量的不斷積累,所帶來的問題不斷增多,所以就衍生出了接下來的幾種方案:
海量資料的解決方案
1.快取和頁面靜態化
對於資料量大的問題,我們可以使用快取,我們現在的系統中,在系統啟動的時候,都會從資料庫中將資料放到快取中,後面所有關於該資料的請求,都會直接到快取中去取,如果程式修改了該段快取在資料庫中的資料,則也會相應的去更新快取。
頁面靜態化:可以使用一些模板引擎去渲染我們的動態資料,生成靜態頁面,還可以使用nginx伺服器將我們上次請求的頁面快取到代理伺服器中,下次就可以直接訪問快取中的頁面
2.資料庫優化
資料庫優化又分為sql語句優化,分割槽,分表,儲存過程,索引優化 。sql語句優化 就通過修改我們的業務邏輯處理的過程進行改造我們的sql語句,可以通過分析slq語句的查詢時間,來進行優化。當一張表中資料兩非常大,我們可能會想到使用 分割槽 去處理這些資料,通過對一堆的資料進行分割槽過後,我們在查詢的資料的時候,可以只對某一個分割槽進行過濾,就不需要對整張表進行操作,對比效果肯定是明顯的。 分表 操作主要是用來對一張表中固定不變的型別進行分表,系統查詢的時候可以去指定型別的表中去獲取資料。新增 索引 有利於我們的查詢速度,通過索引可以快速定位到滿足條件的資料所在的指標位置,根據指標就可以快速定位,但是使用索引的同時也會給我們對資料庫的增刪改操作帶來了效率問題,每次更新資料的時候都需要更新相應的索引,但是隻要我們合理的使用索引,肯定會給程式帶來一定的效率的提升。當我們的sql語句書寫的非常複雜的時候,我們不妨使用儲存過程去代替sql語句。 儲存過程 可以解決一些複雜的邏輯問題,可以隨意呼叫sql的函式,減少我們重複操作資料庫的次數,提升效率。
3.分離活躍資料
當我們的表中有百分之20的資料修改的頻率比較高,其餘的基本不會更新的時候,但是又不能刪除。我們不妨採用資料分離的操作。因為如果將這些資料放一起的話,每次去操作那些百分之20的資料都會關聯到整張表,這個被佔用的資源是可以解除的,我們可以將剩下的百分之80的資料定期移到另外一張表,請求查詢的時候優先查詢預設的表。預設的表中沒有資料再去另外一張表中去查。
4.批量讀取和延遲修改
合併多次請求,去查詢資料庫。
5.讀寫分離(資料庫叢集)
讀寫分離的實質是為資料庫搭建一個叢集。叢集中有一臺伺服器專門去處理使用者的寫操作,其他伺服器專門用來響應使用者的讀操作,當用戶往專門處理寫資料的伺服器中寫資料之後,寫伺服器會將資料同步到其他的伺服器中,後面演進成寫伺服器先將資料同步到器中幾臺讀伺服器,然後被同步的讀伺服器去同步這些資料到剩下的讀伺服器中。

引自《看透springMvc原始碼分析與實踐》
6.分散式資料庫
分散式資料庫就是將不同的表存放到不同的資料庫中然後再放到不同的服務其上,然後資料請求的時候通過一個系統將這個請求分到不同的節點上去查尋對應的表,然後再啟動一個程式把資料整合後返回給使用者。分散式資料庫和資料庫叢集的區別:資料庫叢集是將使用者的不同請求分配給不同伺服器去處理,而分散式資料庫則是將使用者的單次請求去分配給不同的節點伺服器去處理,然後整合結果返回。

引自《看透springMvc原始碼分析與實踐》
7.Nosql和hadoop
nosql指的是無結構化的資料庫,與之對應的就是我們日常使用關係型資料庫,使用nosql時我們無需提前定義欄位,及內容格式,他的儲存方式非常靈活,效能也高。 hadoop 是專門處理大資料的一套框架,hadoop對資料儲存提供了一套解決方案,將一個表中的資料拆分成不同的資料塊,資料庫會放在不同的節點上,每個節點上都會放兩道三塊的資料,這個要看hadoop具體怎麼配置,這樣一來每塊資料都有多個節點來儲存,保證資料的可恢復性和穩定性。

引自《看透springMvc原始碼分析與實踐》
高併發的解決方案
1.應用和靜態資源分離
剛開始的時候,系統中既包含了應用處理程式又包含了前端靜態資原始檔,當併發量達到一定的程度時就需要將應用和靜態資源分離,因為前端資源沒有狀態。所以分離比較簡單。只需要將靜態資源放到其他伺服器中,應用程式通過域名去訪問

引自《看透springMvc原始碼分析與實踐》
2.頁面快取
利用相應的服務如nginx自身帶的頁面快取機制實現頁面快取,使用者再次訪問就不需要再次去生成頁面。也可以使用專門做快取頁面的伺服器Squid,對於經常變的頁面,我們可以使用ajax請求動態的去請求伺服器。,修改資料
3.叢集與分散式
叢集是每臺機器處理相同的事情,主要用來做分流,而分散式是處理一件事中的某一小部分,需要協同其他節點共同處理。叢集分為兩種方式:靜態資源叢集和應用程式叢集,上面說過靜態資源叢集時沒有狀態的,所以實現簡單,但是應用程式實現叢集會出現很多問題,因為他有會話機制,我們必須要同步這些會話資料,才能保證訪問的一致性,對於java,可以使用tomcat的自帶的配置實現session共享,也可以將這個session交給第三方管理,實現同步共享,例如redis,還有一種辦法就是當用戶訪問的時候第一次被輪到的伺服器,接下來會一直被這個使用者使用,這樣就不存在會話失效的問題。nginx就可以通過改變負載均很的輪詢演算法實現這個功能。
4.反向代理
反向代理指的時使用者根本不知道是哪臺伺服器為他提供服務。因為他請求的時中間的代理,代理通過一定的機制找到適合當前使用者的目標伺服器去處理使用者的請求,與之不同的是代理伺服器。代理伺服器是使用者主動發起的,使用者知道目標,但是想要去與這個目標通訊,必須要通過這個代理。
5.CDN
cdn在百度百科中是這麼定義的
CDN的全稱是Content Delivery Network,即 ofollow,noindex">內容分發網路 。CDN是構建在網路之上的內容分發網路,依靠部署在各地的邊緣伺服器,通過中心平臺的負載均衡、內容分發、排程等功能模組,使使用者就近獲取所需內容,降低網路擁塞,提高使用者訪問響應速度和命中率。CDN的關鍵技術主要有內容儲存和分發技術。
他會根據使用者的請求,去分配給使用者最合適的目標去處理使用者的請求,主要是由CDN的自帶的dns解析器工作。

引自《看透springMvc原始碼分析與實踐》
歡迎關注我的微信公眾號

樂哉碼農