架構設計:
一:如何分層。
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 降級:保護系統,保證使用者體驗,給到充足時間排查問題。
關閉接口并設定預設傳回,等同于隔離術。
降級邏輯,給到使用者一個友好的體驗響應。
随着架構的演進,可以看出分布式建構的繁雜體系,使得開發無法專注于業務本身,是以
雲原生架構才會應運而生叭。