天天看點

架構演進之路

架構設計:

一:如何分層。

1 為什麼要分層:分而治之,各施其職,有條不紊。

常見的分層 計算機osi七層,mvc模型分層,領域模型分層。

2 單系統分層模型演進

浏覽器-->servlrt-->javabean-->db-->渲染jsp

浏覽器-->web層-->業務層-->持久層-->db-->渲染vue(ssh,ssm,springboot)

3 分布式分層:水準擴充,負載均衡,高可用,資料一緻性。

3.1 web概念層:

用戶端:pc,app

通路層:lvs(ip層進行分發,比ng快),上遊nginx,應用nginx

接口層:websocket,http/https,tcp/udp,api網關。

3.2 業務概念層:

服務通信,業務服務子產品,服務管理,任務排程,

基礎服務(redis,mq,隔離管理,裝置管理),監控。

3.3 資料通路及存儲層:

存儲接入層:mycat,redis proxy,shardingjdbc

存儲層:mysql,redis

二 通路層架構知識。

1 lvs:通過dns網絡找到公網ip,然後通過lvs ip層進行分發,比ng快

架構演進之路

2 ng性能之是以快:

2.1 master-worker程序模型 

2.2 協程機制

協程和程序的差別:

架構演進之路

ng的作用:反向代理,動靜分離,負載均衡。緩存結果。

三 api網關層架構知識。

1 分布式會話管理

1.1 cookie:并非安全,被劫持機率高,xss,csrf安全攻擊等。有跨域問題

1.2 token:憑證被劫持,僞造請求。有跨域問題

1.3 session: 依賴服務端,分布式則存儲在中央管理機制中。

解決方案L:https請求防洩露,風控主動失效及過期機制。

2 接入層控制

需要實作的邏輯,身份驗證,流量控制,路由服務,記錄調試,或統計資訊。

使用filter.

3 服務調用和聚合

重接入:srpingmvc+dubbo,由網關服務通過controller去接收響應結果,統一響應體。

輕接入:springcloud+zuul,交給業務服務處理。專注于網關,沒有好與壞。

四 核心服務層架構知識。

1 微服務:服務治理(服務通信,健康管理,限流熔斷),資料一緻性,調用性能,

研發流程,測試,部署。

2 dubbo:輕量級rpc架構,遠端方法調用,智能容錯,負載均衡,自動服務注冊和發現。

服務治理:

2.1 服務注冊和發現,

2.2 服務消費擷取服務,并通過負載均衡政策選擇服務提供者。

(服務優雅的下線,消費端通過監聽機制是可以感覺的。zk通過鈎子機制也是可以感覺的)

2.3 動态增減服務提供者和服務消費者。

2.4 服務監控,服務限流,服務降級,高容錯,定制化開發

3 異步化消息服務

削峰,解耦,異步。

4 任務排程

5 池化技術,通過對象池和連接配接池,減少系統消耗,提升系統性能。

5.1 java線程池(對象池):ThreadPoolExecutor

核心線程數-->隊列-->最大線程-->拒絕政策-->idle等待時間

線程池狀态:空閑 繁忙

5.2 資料庫連接配接池:HTTP client連接配接池:redis連接配接池:(屬于服務端的連接配接池)

核心連接配接數:  

最大連接配接數: 

連接配接等待時間:(服務之間的連接配接超過例如100ms,則連接配接中斷)

資料讀取時間:(讀取之後響應資料的時間) 

等待釋放時間(等待多久才會釋放最大連接配接)

validate:各種網絡原因等,在使用的時候會對連接配接validate一下,確定連接配接是正常釋放的

連接配接池狀态:init connect busy close

tomcat連接配接池:

5.3 tomcat連接配接池:每個請求進來,會建立維護一個client socket,放在連接配接池中。

屬于維護用戶端的連接配接池,并且client socket是沒有辦法處理讀寫請求的,則維護了一個io線程池。

tomcat io線程池:selector epoll,根據多路複用機制,感覺到client socket有資料了,就會主動

去擷取連接配接池socket的資料,然後擷取的資料可以組成完整的http資料包時,就會把資料發給worker

線程池。(傳回的工作線程可能是同一個,也可能不是同一個)

tomcat 工作線程池:工作線程,處理完資料之後又會将對應處理的結果,傳回給空閑的io線程,然後

再傳回給socket。傳回的socket連接配接必定是同一個)

5.4 dubbo連接配接池:和tomcat機制一樣,差別是一個發送的是http請求,一個是dubbo請求。

五 資料存儲及接入層知識。

1 緩存分類:cdn緩存,反向代理緩存,分布式redis緩存,本地應用緩存(GUAVA)。

2 如何緩存:修改時實時寫入,修改時異步寫入,讀取時實時寫入,讀取時異步寫入。

3 多級緩存:

cdn緩存(僅靜态資源)--> ng接入層緩存proxy cache緩存-->

ng應用層緩存(nginx lua shared dic)-->ng應用層緩存(通過應用層ng的lua redis腳本請求)

-->tomcat本地記憶體-->tomcat redis-->db

4 會涉及到緩存不一緻問題,看業務是否容忍和接受。(在緩存周期内,通過異步更新)

5 隔離術:

硬體隔離(虛拟機):實體層面隔離,浪費資源

作業系統隔離(容器虛拟化):實體層面隔離,docker

程序隔離(系統拆分):微服務,按業務區分

線程隔離(線程池獨立):服務之間的調用,也就是級聯,

調用不同的服務使用不同的線程池,調用失敗的則采取熔斷降級等操作。

可以確定服務調用失敗之後,不影響到該服務調用其他服務。

讀寫隔離(讀寫分離):主從模式

動靜隔離(動态資源和靜态資源隔離):在cdn取靜态資源,在應用程式取動态資源。

熱點隔離(熱點賬号,熱點資料):走熱點賬号資料庫,普通賬号資料庫。

6 隊列術:異步,解耦,削峰

削峰:排隊有時候比并發效率更高(不需要涉及到cpu去競争搶占鎖資源),

排隊可以控制并發流量湧入。如redis就是單線程的排隊機制,效率高。

常用的方案是使用線程池,通過設定核心線程數,最大線程數都為1,來實作簡單的隊列術。

六 資料存儲及接入層架構設計

1 資料存儲。結構化資料,非結構化資料(音頻,視訊),半結構化資料(使用者履歷,檔案)

常見的資料庫存儲中間件

nas:網絡檔案系統,基底層裝置,提供檔案磁盤。(伺服器基于挂載的形成操作nas路徑)

阿裡oos:想象成無限大的網盤,阿裡雲oss網絡檔案存儲。

sql關系型資料庫:mysql,db2,slqlite等

非關系型資料庫:mongdb,hbase。

緩存型資料庫:H2,Redis。

2 關系型與非關系型。

3 代理通路。反向代理,資料庫代理,redis代理。

為什麼要代理:收口邏輯,負載均衡,路由政策,故障轉移,緩存政策,減少後端被代理對象壓力。

代理後端應用伺服器:nginx

沒有後端代理伺服器:需多個公網ip支援多伺服器,負載均衡隻能通過dns尋址,

每個後端各自緩存熱點資料

有後端代理伺服器:僅需要一個公網ip綁定到代理伺服器,可故障轉移,可負載,可緩存熱點

代理資料庫伺服器:mycat

沒有資料庫代理:應用層需要處理分庫分表邏輯,應用層需要處理主從切換,應用層需要

各個資料庫都維護連接配接池,資料連接配接池不夠。

有資料庫代理:可支援分庫分表路由政策邏輯,可支援主從切換,可支援連接配接池管理。

代理緩存伺服器:Twemproxy。(通常生産環境redis無需代理,自身支援)

沒有代理緩存伺服器:應用層需要處理分key分片邏輯,應用層需要處理主從切換,應用層需要

各個緩存都維護連接配接池,緩存連接配接數量不夠。

有代理緩存伺服器:可支援分key分片路由政策邏輯,可支援主從切換,可支援連接配接池管理。

七 監控,限流,降級知識。

1 監控:

為什麼要監控:

線上釋出了服務,怎麼知道它一切正常

某個核心服務挂了,導緻各級系統大量報錯,如何确定問題在哪

系統上線後不知道業務進來多少,不知道伺服器是否夠用

業務搞大促,請求量激增,我們居然是最後一個知道的人

監控什麼:通過cat監控軟體名額,通過zabbix監控硬體名額。

硬體名額:cpu idle time,free memory,io wait,network free 可以使用zabbix等

軟體名額:cpu load average,parNewCount,parNewTime,old gc count,old gc time

可以使用cat heart beat監控

接口名額:url請求,保證95線,即99.999%成功率。可以使用cat transaction監控。

異常名額:可以使用cat execption監控,會列印堆棧資訊。

大盤名額:基線成功率,基線失敗率,總統響應時間名額。cat 大盤監控。

2 限流:

為什麼要限流:流量遠比并發處理能力大,永遠不知道對方怎麼樣,永遠不知道自己怎麼樣。

是以需要有保護自己的決心。

限流的次元一:url的限流,dubbo接口限流,sql操作數。

限流的次元二:限制TPS/QPS,限制并發數,限制總數。

限流算法:

限制并發數(通過每個url計數器),

令牌桶算法,(通過固定時間重置桶中的令牌,每次請求取一個)

漏桶算法。往桶中湧入tps,不能超過桶的剩餘量,桶會勻速下發請求過來的tps,

可以處理突發流量

如果是叢集限流,對應所有操作都要加入中間體(如redis)

單機限流,不能保證絕對意義的均衡限流,通常建議使用單機限流。

可以使用guava包中的RateLimter類

limit = RateLimter.create(2),即每秒允許請求2個limit令牌,limit.acquire()擷取令牌。

3 降級:保護系統,保證使用者體驗,給到充足時間排查問題。

關閉接口并設定預設傳回,等同于隔離術。

降級邏輯,給到使用者一個友好的體驗響應。

随着架構的演進,可以看出分布式建構的繁雜體系,使得開發無法專注于業務本身,是以

雲原生架構才會應運而生叭。