架构知识整理
為什么80%的碼農都做不了架構師?>>> ??
架構概念
一套系統的軟件架構就是這個系統所需的結構體的集合,包括:軟件元素,軟件元素之間的關系,以及二者的屬性。
從視角不同一般分為:
- 邏輯架構
關注于各個組件之間的關系,如:用戶界面、數據庫、外部系統接口
如流行的N層架構:表現層,業務邏輯層,數據層
- 物理架構
關注于如何將軟件元素放到物理設備上,如:代理服務器、Web服務器,緩存服務器、數據庫服務器、NoSQL服務器、隊列服務器、搜索服務器。
- 系統架構
性能、可擴展性、伸縮性、可用性、安全性
有關軟件整體結構與組件的抽象描述,用于指導大型軟件系統各個方面的設計。
在平衡性能、擴展性、伸縮性、可用性、安全性這5個系統架構要素下,實現系統功能需求。
架構模式
為了應對高并發訪問、海量數據處理、高可靠運行等一系列問題,大型互聯網公司在實戰提了許多解決方案,以實現網站的高性能、高可用、易伸縮、可擴展、安全等各種技術架構目標,這些解決方案可以被重復使用,從而被抽煉成為大型網站的架構模式
分層
應用層 - 服務層 - 數據層
應用層:視圖層 業務邏輯層
服務層:數據接口層 邏輯處理層
分層是邏輯上的,物理布署上根據規模決定
從一開始就要分層,因為分層對網站日后向分布式方向發展至關重要
分割
也就是縱切,把不同功能的服務分割開,包裝成高內聚低偶合的模塊單元,一方面有助于軟件的開發和維護,一方面,便于不同模塊的分布式布署。 分割粒度根據網站規模來決定,如:用戶,搜索,反作弊,消息
分布式
將不同的模塊布署到不同的服務器上,服務器越多,CPU,內存,存儲空間資源就越多 分布式遇到的問題:
- 性能:通過網絡
- 可用性:服務器多,宕機
- 一致性:多臺機器數據保持同步,分布式事務
- 可維護性:機器多,網絡依賴復雜
分布式分類:
- 分布式應用和服務 將分層和分割后的模塊布署到不同的服務器上。
- 分布式靜態資源 將JS、CSS、圖片獨立分布式布署
- 分布式數據和存儲 將產生和處理的海量數據存放到多臺機器上面,MySQL,NoSQL
- 分布式計算 后臺業務,如:搜索引擎的索引構建,數據倉庫的計算,Hadoop、Mapreduce
- 分布式配置、分布式鎖、分布式文件系統。。。。
集群
** 將多臺服務器布署相同的應用,這一堆服務器叫集群。** 使用集群的目的:
- 高可用
- 高性能
緩存
將數據放到離計算最近的位置,可以提高訪問速度,緩存后端的計算壓力
本機緩存由遠而近是:一級緩存,二級緩存、三級緩存、內存
** 緩存種類:**
- CDN
- 反向代理
- 本地緩存
- 分布式緩存
** 使用緩存的前提:**
- 數據訪問熱點不均衡,部分數據會被頻繁訪問,需要使用緩存:HTML的最新20條動態
- 數據不會很快過期,否則會產生臟數據
** 數據庫的設計都是按照有緩存的負載前提下設計的。**
異步
主要是為了解耦,使用隊列
類和類之間解偶:接口
模塊與模塊之間解偶:隊列
異步的好處:
-
提高可用性
-
增高響應速度
-
消除并發訪問高峰
** 問題:可能會對用戶體驗、業務流程造成影響 **
冗余
高可用的手段:冗余
應用服務:集群
數據:定期備份、主從結構對數據實時熱備、災備數據中心
自動化
開發:
-
自動化代碼管理
-
自動化測試
-
自動化代碼審查
-
自動化布署
-
自動化安全檢查
運維:
-
自動化監控
-
自動化報警
-
自動化失效轉移
-
自動化失效恢復
-
自動化降級
-
自動化分配資源
安全
程序實現安全:XSS、SQL注入、編碼轉換
-
通過密碼、手機檢驗碼進行身份認證;
-
登錄交易對通信數據加密
-
驗證碼防止機器人程序對網站攻擊
-
敏感信息過濾:反作弊
架構指標
性能
響應時間
** 執行一個操作需要的時間 **
打開一個網站 幾秒數據查查詢一次 10毫秒機械硬盤一次尋址定位 4毫秒機械硬盤順序讀1M數據 2毫秒SSD順序讀1M數據 0.3毫秒從Redis讀一個數據 0.5毫秒從內存讀1M數據 10多微秒Java程序本地方法調用 幾微秒** CPU操作時間 **
從CPU到 大約需要的CPU周期 大約需要的時間(單位ns)寄存器 1 cycle L1 Cache ~3-4 cycles ~0.5-1 nsL2 Cache ~10-20 cycles ~3-7 nsL3 Cache ~40-45 cycles ~15 ns跨槽傳輸 ~20 ns內存 ~120-240 cycles ~60-120ns網絡傳輸2K數據 1微秒** 并發數 **
同時處理請求的數目
** 吞吐量 **
單位時間內系統處理的請求數量,如請求數/秒,頁面數每秒,訪問人數每天,
一些高大上的指標:
-
TPS:每秒處理事務數
-
HPS:每秒HTTP請求數
-
QPS:每秒的查詢數
** 性能計數器 **
運維人員關注的指標,服務器或操作系統的性能指標,如:系統負載(top命令),對象與線程數、內存使用情況、CPU使用情況,磁盤IO,網絡IO。這些指標超出閾值后,系統都可能會出問題。
優化:
** 前端優化 **
-
減少http請求/使用瀏覽器緩存/壓縮/CSS放上面,JS放下面/減少Cookie傳統
-
CDN加速/反向代理
-
緩存優化
-
異步隊列
-
集群
** 代碼優化 **
-
多線程/內存/
-
存儲優化
-
SSD/分布式文件系統
擴展性
對現有系統影響最小的情況下,系統功能可以持續擴展和提升的能力。
高擴展性的關鍵是:高內聚,低耦合 -> 模塊拆分
-
分布式消息隊列
-
分布式服務
** 大型網站遇到的問題:**
-
編譯、布署困難:代碼多,編譯時間長,布署機器多
-
代碼分支管理困難:復用代碼的修改經常會造成沖突
-
數據庫連接耗盡:
-
新增業務困難:在一個亂如麻的系統中增加新業務,維護舊功能異常痛苦,一腳全是雷,大家干的熱火朝天,就是問題多多。
** 解決方法:拆、拆、拆 (重要的事情要說3遍) **
-
拆成低耦合的模塊,獨立布署。
-
縱拆:將大應用拆為多個小應用獨立布署
-
橫拆:將復用的業務拆分出來,獨立布署,對外提供穩定的接口。
服務提供者啟動后在服務注冊中心注冊,服務消費者想使用某項服務時,先從服務注冊中心獲取服務提供者列表,找到服務的接口,然后根據負載均衡策略將服務請求發送到對應的服務器上。
** 可擴展的數據結構 **
NOSQL:CouchBase、MongoDB、HBase
** 利用開放平臺建設網站生態圈 **
OpenAPI
伸縮性
不需要改變軟件的軟硬件設計,只需要布署服務器數量就可以擴大或縮小服務處理能力。
根據功能進行物理分離實現伸縮:橫向分離:不同的業務模塊分離布署、縱向分離:業務流程分離布署
單一功能通過集群來實現伸縮:一頭牛拉不動時,不找更強壯的牛,而是找兩頭牛
** 應用服務器集群的伸縮性設計 **
-
Http重定向:302
-
DNS域名解析:二級域名
-
反向代理負載:Nginx
-
IP負載均衡
-
數據鏈路層負載均衡:LVS
** 分布式緩存集群的伸縮性設計 **
- 一致性Hash算法
** 數據庫伸縮性設計 **
-
主從架構
-
讀寫分離
** NoSQL **
- HBase的的HRegion的分裂
可用性
可用性就是不出故障。
不可用時間=故障修復時間點-故障發現時間點
** 可用性指標=(1-不可用時間/總時間)*100% **
2個9基本可用,88小時3個9是較高可用,小于9小時4個9是高可用,53分鐘5個9是極高可用,5分鐘** 可用性 **
** 業務拆分 **
-
無狀態應用:負載均衡、Session管理
-
基礎服務高可用:分級管理、超時設置、異步調用、服務降級、冪等性設計
-
數據高可用:數據備份、失效轉移
安全性
XSS(跨站點腳本攻擊):消毒
注入攻擊:請求參數消毒,參數綁定
CSRF(跨站點請求偽造):表單Token、驗證碼、Referer檢查
加密:
單向散列加密:Md5 SHA 使用彩虹表對稱加密:交換密鑰是難題非對稱加密:公鑰加密,私鑰解密轉載于:https://my.oschina.net/gccr/blog/494296
總結
- 上一篇: 在项目中引入领域驱动设计的经验
- 下一篇: jdk1.8.0_45源码解读——Map