最近在學習大型網(wǎng)站的架構(gòu)設計,便想把學習過程中的一些東西總結(jié)記錄下來,,以便復習和鞏固提高,。先來看看大型網(wǎng)站架構(gòu)圖:
從左邊開始,先是CDN服務器和反向代理服務器,,都用于緩存一些用戶需要請求的資源。兩者的區(qū)別在于CDN部署在網(wǎng)絡提供商的機房,,用戶可以就近獲?。环聪虼韯t部署在網(wǎng)站中心機房,。使用CDN和反向代理的目的都是盡快返回數(shù)據(jù)給用戶,。這樣可以加快返回用戶資源的速度,也減輕了后端服務器的負載壓力,。
往下走,,是一臺負載均衡調(diào)度服務器,用于將用戶的請求發(fā)送到服務器集群上,。這里面A,B應用服務器可以是Tomcat服務器集群,,只不過它上面只部署了Action,也就是我們平時寫的controller層的代碼,。在這里面去調(diào)用被分別部署在不同服務器上的業(yè)務層代碼(大型網(wǎng)站會進行業(yè)務拆分,,將不同的應用獨立部署)。如果某些業(yè)務請求量較大,,業(yè)務處理時間較長,,可以根據(jù)實際情況來將其加入消息隊列,以達到快速返回的目的,。最后,,由分布式的業(yè)務服務器去調(diào)用分布式的數(shù)據(jù)庫系統(tǒng)實現(xiàn)數(shù)據(jù)的存儲。右邊,文件這些東西可以部署在分布式的文件服務器上,。右上,,使用分布式緩存服務器將平時最常訪問的20%數(shù)據(jù)(二八定律:80%的業(yè)務訪問集中在20%的數(shù)據(jù)上)緩存起來。最下面兩個,,由于網(wǎng)站業(yè)務相當復雜,,采用一些非關(guān)系數(shù)據(jù)庫如nosql和非數(shù)據(jù)庫查詢技術(shù)如搜索引擎進行進行數(shù)據(jù)的存儲和檢索。
以上,,就是一個大型網(wǎng)站的大體架構(gòu),。
總體架構(gòu)講完了,接下來講一點具體的東西,。大型網(wǎng)站核心架構(gòu)要素:性能,,可用性,伸縮性,,擴展性,,安全性。
先來講性能:
web前端性能優(yōu)化:
一般來講,,web前端主要優(yōu)化手段有優(yōu)化瀏覽器訪問,,使用反向代理,CDN等,。
瀏覽器訪問優(yōu)化:
1 減少http請求
http請求的開銷都很昂貴,,應該盡量減少http請求次數(shù)。主要手段是將javascrit,css,圖片合并成一個文件,,這樣瀏覽器只需一次請求,。
- 1
- 2
2 使用瀏覽器緩存
對網(wǎng)站而言,css,javascript,logo,圖標這些資源更新頻率低,,可以設置http頭中的Cache-Control和Expires屬性將其緩存在瀏覽器中,。
- 1
- 2
3 啟用壓縮
可以在服務器端對文件進行壓縮,文本文件的壓縮效率可達80%以上,,因此HTML,CSS,Javascript文件啟用GZip壓縮可以達到較好的效果
- 1
- 2
4 css文件放在頁面最上面,,javascript放在頁面最下面
瀏覽器在css全部下載完之后才進行頁面渲染,而javascript則是加載后就立即執(zhí)行,。因此先進行css文件的下載,,javascript放在最后即可。
- 1
- 2
cdn加速
CDN(內(nèi)容分發(fā)網(wǎng)絡)本質(zhì)仍是一個緩存,,而且將數(shù)據(jù)緩存在離用戶最近的地方,,使用戶以最快速度獲取數(shù)據(jù)。一般緩存靜態(tài)資源,。
- 1
- 2
反向代理
反向代理服務器可以保護服務器的安全,,來自互聯(lián)網(wǎng)的請求必需經(jīng)過代理服務器,。所以也可以在代理服務器放一些靜態(tài)數(shù)據(jù),當用戶第一次訪問靜態(tài)內(nèi)容時,,靜態(tài)內(nèi)容就被緩存在方向代理服務器上,,其他用戶請求進來時,就可以直接返回,,減輕web服務器負載壓力,。
- 1
- 2
應用服務器性能優(yōu)化
服務器的優(yōu)化手段主要有緩存,集群,,異步等,。
- 1
- 2
異步操作:
在高并發(fā)情況下,若不使用消息隊列,,用戶請求直接寫入數(shù)據(jù)庫會對數(shù)據(jù)庫造成巨大的壓力,,同時使響應延遲加劇。使用消息隊列,,異步寫入數(shù)據(jù)庫,,可以起到很好的削峰作用,改善網(wǎng)站的擴展性,,提升網(wǎng)站性能,。
- 1
- 2
使用集群:
在網(wǎng)站高并發(fā)訪問的場景下,使用負載均衡技術(shù)為應用構(gòu)建一個墮胎服務器組成的集群,,將并發(fā)訪問請求分發(fā)到多臺服務器上處理,,避免單一服務器因負載壓力過大而響應緩慢。
- 1
- 2
代碼優(yōu)化:
1 多線程
從資源利用的角度來看,,使用多線程的原因主要有兩個:
- 1
- 2
io阻塞:當線程進行io處理時,會阻塞cpu以等待io,。利用多線程io阻塞與執(zhí)行交替進行,,可以最大限度利用cpu。
多cpu:一個服務器有多個cpu,,在這個手機都有四核cpu的時代要想做大限度使用這些cpu,,必需啟用多線程。
2 資源復用
資源復用主要有兩種模式:單例和對象池,。
- 1
- 2
單例:由于web開發(fā)中主要使用貧血模式,,使用很多無狀態(tài)對象,無需重復創(chuàng)建,,因此使用單例模式自然而然的事,。
線程池:對象池通過復用對象實例,減少對象創(chuàng)建和資源消耗,。
3 數(shù)據(jù)結(jié)構(gòu)
在不同的場景中使用適當?shù)臄?shù)據(jù)結(jié)構(gòu),,改寫數(shù)據(jù)和計算特性可以極大優(yōu)化程序的性能,。
- 1
- 2
4 垃圾回收
如果web應用運行在JVM等具有垃圾回收功能的環(huán)境中,理解垃圾回收機制有助于程序優(yōu)化和參數(shù)調(diào)優(yōu),,以及編寫內(nèi)存安全的代碼,。
- 1
- 2
網(wǎng)站架構(gòu)的伸縮性設計
一般來說。網(wǎng)站的伸縮性設計可分為兩類:一類是根據(jù)功能進行物理分離實現(xiàn)伸縮,,一類是單一功能通過集群實現(xiàn)伸縮,。前者是不同的服務器部署不同的服務,提供不同的功能,;后者是集群內(nèi)的服務器部署相同的服務實現(xiàn)相同的功能,。
- 1
- 2
應用服務器集群的伸縮性設計
負載均衡是實現(xiàn)伸縮性設計的關(guān)鍵技術(shù)。因為它能將用戶的請求按照某種規(guī)則分發(fā)到集群不同的服務器上,,且能感知或配置集群的服務器數(shù)量,,及時發(fā)現(xiàn)新上線或下線的服務器,以此來實現(xiàn)應用服務器集群的可伸縮性,。實現(xiàn)負載均衡的技術(shù)有以下幾種:
- 1
- 2
http重定向負載均衡
http服務器就是一臺普通的應用服務器,,唯一功能就是根據(jù)根據(jù)用戶的http請求計算一臺真實的web服務器地址。這種方案的優(yōu)點是比較簡單,。缺點是瀏覽器需要兩次請求服務器才能完成一次訪問,,性能較差;實踐中不常采用,。
- 1
- 2
dns域名解析負載均衡
每次域名解析請求都會根據(jù)負載均衡算法計算一個不同的ip地址返回,。優(yōu)點是將負載均衡工作交給dns,省掉了網(wǎng)站管理維護負載均衡服務器的麻煩,。缺點是dns負載均衡的控制權(quán)在域名服務商那里,,網(wǎng)站無法對其做更多的改善和更強大的管理。
- 1
- 2
反向代理負載均衡
反向代理服務器需要雙網(wǎng)卡及內(nèi)部外部兩套ip地址,。其優(yōu)點是和反向代理服務器功能集成在一起,,部署簡單。缺點是所有請求均經(jīng)過此,,其性能可能成為瓶頸,。
- 1
- 2
ip負載均衡
在網(wǎng)絡層通過修改請求目標地址進行負載均衡。ip負載均衡在內(nèi)核進程完成數(shù)據(jù)分發(fā),,有更好的處理性能,。但對需要提供下載服務或視頻服務的大型網(wǎng)站而言,難以滿足需求,。
數(shù)據(jù)鏈路層負載均衡
在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址進行負載均衡,。此模式是目前大型網(wǎng)站采用最廣的一中負載均衡手段。
數(shù)據(jù)庫存儲服務器集群的伸縮
這里主要將關(guān)系型數(shù)據(jù)庫的伸縮設計,。對于進行了水平分庫分表的數(shù)據(jù)庫,,可以用一些分布式數(shù)據(jù)庫產(chǎn)品例如Mycat,,Cobar.
利用分布式消息隊列降低降低系統(tǒng)耦合性
如果模塊間不存在直接調(diào)用,那么新增或修改對其他模塊的影響就最小,。通過在低耦合的模塊間傳輸事件消息,,來保持模塊的松散耦合。最常用的是分布式消息隊列,。在伸縮性方面,,由于消息隊列上的服務器上的數(shù)據(jù)是即時被處理的,可以看作無狀態(tài)的服務器,,伸縮性比較簡單,,將新服務器加入分布式消息隊列集群中,通知生產(chǎn)者服務器更改消息隊列服務器列表即可,。在可用性方面,,為避免內(nèi)存空間不足的問題,會將消息寫入磁盤,。
- 1
- 2
網(wǎng)站應用攻擊與防御:
從互聯(lián)網(wǎng)誕生之日起,,各種web攻擊和信息泄漏也從未停止。在此講一下主要的攻擊手段及防御措施,。
xss攻擊
xss即跨站點腳本攻擊,,致黑客通過篡改網(wǎng)頁,注入惡意html腳本,。主要防御手段有兩種: 1 消毒 對某些html危險字符轉(zhuǎn)義,,如“>”轉(zhuǎn)義為“>”。 2 HttpOnly 即瀏覽器禁止頁面javascript訪問帶有HttpOnly屬性的cookie,。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- sql注入
sql注入,,攻擊者在http請求中注入惡意sql命令。防御方法,,還是消毒,,過濾請求數(shù)據(jù)中可能注入的sql?;蛘邊?shù)綁定,,如mybatis的#{},,將攻擊者的sql視為參數(shù),,而不是可執(zhí)行sql。
- csrf攻擊
跨站點請求偽造,,攻擊者通過跨站請求,,以合法用戶身份進行非法操作。其核心是利用服務器session或瀏覽器cookie策略,。盜取用戶身份,。防御方法
1 表單token,。在頁面表單加入一個隨機數(shù)作為token值,提交到服務器進行檢查,。
2 驗證碼
3 Refer Check
http請求頭的請求域中記錄著請求來源,可檢查請求來源驗證其是否合法。
web應用防火墻
ModSecurity,一種開源的web應用防火墻,,探測攻擊并保護web程序,。
- 1
- 2
網(wǎng)站安全漏洞掃描
指根據(jù)一定規(guī)則構(gòu)造攻擊性url模擬黑客行為的工具。
- 1
- 2
由于本博客只是對大型網(wǎng)站的架構(gòu)及其用到的技術(shù)做一個大致的描述(不太好做詳細的講解,,因為這里牽扯的知識點實在太多,,而每個知識點又是可以單獨提出來寫成一片或幾篇博客的那種),所以對大多數(shù)知識點的講解只是淺嘗輒止,,如果想了解更多細節(jié)的同學,,可以自行百度或者閱讀本文的主要參考文獻:
大型網(wǎng)站技術(shù)架構(gòu)核心原理與案列分析