电竞比分网-中国电竞赛事及体育赛事平台

分享

高并發(fā)的大型網(wǎng)站架構(gòu)設(shè)計(jì)

 quasiceo 2018-07-15

 

最近在學(xué)習(xí)大型網(wǎng)站的架構(gòu)設(shè)計(jì),便想把學(xué)習(xí)過(guò)程中的一些東西總結(jié)記錄下來(lái),以便復(fù)習(xí)和鞏固提高。先來(lái)看看大型網(wǎng)站架構(gòu)圖:

大型網(wǎng)站架構(gòu)圖

從左邊開(kāi)始,先是CDN服務(wù)器和反向代理服務(wù)器,都用于緩存一些用戶(hù)需要請(qǐng)求的資源。兩者的區(qū)別在于CDN部署在網(wǎng)絡(luò)提供商的機(jī)房,用戶(hù)可以就近獲??;反向代理則部署在網(wǎng)站中心機(jī)房。使用CDN和反向代理的目的都是盡快返回?cái)?shù)據(jù)給用戶(hù)。這樣可以加快返回用戶(hù)資源的速度,也減輕了后端服務(wù)器的負(fù)載壓力。
往下走,是一臺(tái)負(fù)載均衡調(diào)度服務(wù)器,用于將用戶(hù)的請(qǐng)求發(fā)送到服務(wù)器集群上。這里面A,B應(yīng)用服務(wù)器可以是Tomcat服務(wù)器集群,只不過(guò)它上面只部署了Action,也就是我們平時(shí)寫(xiě)的controller層的代碼。在這里面去調(diào)用被分別部署在不同服務(wù)器上的業(yè)務(wù)層代碼(大型網(wǎng)站會(huì)進(jìn)行業(yè)務(wù)拆分,將不同的應(yīng)用獨(dú)立部署)。如果某些業(yè)務(wù)請(qǐng)求量較大,業(yè)務(wù)處理時(shí)間較長(zhǎng),可以根據(jù)實(shí)際情況來(lái)將其加入消息隊(duì)列,以達(dá)到快速返回的目的。最后,由分布式的業(yè)務(wù)服務(wù)器去調(diào)用分布式的數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)。右邊,文件這些東西可以部署在分布式的文件服務(wù)器上。右上,使用分布式緩存服務(wù)器將平時(shí)最常訪問(wèn)的20%數(shù)據(jù)(二八定律:80%的業(yè)務(wù)訪問(wèn)集中在20%的數(shù)據(jù)上)緩存起來(lái)。最下面兩個(gè),由于網(wǎng)站業(yè)務(wù)相當(dāng)復(fù)雜,采用一些非關(guān)系數(shù)據(jù)庫(kù)如nosql和非數(shù)據(jù)庫(kù)查詢(xún)技術(shù)如搜索引擎進(jìn)行進(jìn)行數(shù)據(jù)的存儲(chǔ)和檢索。
以上,就是一個(gè)大型網(wǎng)站的大體架構(gòu)。
總體架構(gòu)講完了,接下來(lái)講一點(diǎn)具體的東西。大型網(wǎng)站核心架構(gòu)要素:性能,可用性,伸縮性,擴(kuò)展性,安全性。
先來(lái)講性能:

web前端性能優(yōu)化:

一般來(lái)講,web前端主要優(yōu)化手段有優(yōu)化瀏覽器訪問(wèn),使用反向代理,CDN等。

瀏覽器訪問(wèn)優(yōu)化:

1 減少http請(qǐng)求
http請(qǐng)求的開(kāi)銷(xiāo)都很昂貴,應(yīng)該盡量減少http請(qǐng)求次數(shù)。主要手段是將javascrit,css,圖片合并成一個(gè)文件,這樣瀏覽器只需一次請(qǐng)求。
  • 1
  • 2
2 使用瀏覽器緩存
對(duì)網(wǎng)站而言,css,javascript,logo,圖標(biāo)這些資源更新頻率低,可以設(shè)置http頭中的Cache-Control和Expires屬性將其緩存在瀏覽器中。
  • 1
  • 2
3 啟用壓縮
可以在服務(wù)器端對(duì)文件進(jìn)行壓縮,文本文件的壓縮效率可達(dá)80%以上,因此HTML,CSS,Javascript文件啟用GZip壓縮可以達(dá)到較好的效果
  • 1
  • 2
4 css文件放在頁(yè)面最上面,javascript放在頁(yè)面最下面
瀏覽器在css全部下載完之后才進(jìn)行頁(yè)面渲染,而javascript則是加載后就立即執(zhí)行。因此先進(jìn)行css文件的下載,javascript放在最后即可。
  • 1
  • 2

cdn加速

CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))本質(zhì)仍是一個(gè)緩存,而且將數(shù)據(jù)緩存在離用戶(hù)最近的地方,使用戶(hù)以最快速度獲取數(shù)據(jù)。一般緩存靜態(tài)資源。
  • 1
  • 2

反向代理

反向代理服務(wù)器可以保護(hù)服務(wù)器的安全,來(lái)自互聯(lián)網(wǎng)的請(qǐng)求必需經(jīng)過(guò)代理服務(wù)器。所以也可以在代理服務(wù)器放一些靜態(tài)數(shù)據(jù),當(dāng)用戶(hù)第一次訪問(wèn)靜態(tài)內(nèi)容時(shí),靜態(tài)內(nèi)容就被緩存在方向代理服務(wù)器上,其他用戶(hù)請(qǐng)求進(jìn)來(lái)時(shí),就可以直接返回,減輕web服務(wù)器負(fù)載壓力。
  • 1
  • 2

應(yīng)用服務(wù)器性能優(yōu)化

服務(wù)器的優(yōu)化手段主要有緩存,集群,異步等。
  • 1
  • 2

異步操作:

在高并發(fā)情況下,若不使用消息隊(duì)列,用戶(hù)請(qǐng)求直接寫(xiě)入數(shù)據(jù)庫(kù)會(huì)對(duì)數(shù)據(jù)庫(kù)造成巨大的壓力,同時(shí)使響應(yīng)延遲加劇。使用消息隊(duì)列,異步寫(xiě)入數(shù)據(jù)庫(kù),可以起到很好的削峰作用,改善網(wǎng)站的擴(kuò)展性,提升網(wǎng)站性能。
  • 1
  • 2

使用集群:

在網(wǎng)站高并發(fā)訪問(wèn)的場(chǎng)景下,使用負(fù)載均衡技術(shù)為應(yīng)用構(gòu)建一個(gè)墮胎服務(wù)器組成的集群,將并發(fā)訪問(wèn)請(qǐng)求分發(fā)到多臺(tái)服務(wù)器上處理,避免單一服務(wù)器因負(fù)載壓力過(guò)大而響應(yīng)緩慢。
  • 1
  • 2

代碼優(yōu)化:

1 多線(xiàn)程
從資源利用的角度來(lái)看,使用多線(xiàn)程的原因主要有兩個(gè):
  • 1
  • 2
  • io阻塞:當(dāng)線(xiàn)程進(jìn)行io處理時(shí),會(huì)阻塞cpu以等待io。利用多線(xiàn)程io阻塞與執(zhí)行交替進(jìn)行,可以最大限度利用cpu。

  • 多cpu:一個(gè)服務(wù)器有多個(gè)cpu,在這個(gè)手機(jī)都有四核cpu的時(shí)代要想做大限度使用這些cpu,必需啟用多線(xiàn)程。

2 資源復(fù)用
資源復(fù)用主要有兩種模式:?jiǎn)卫蛯?duì)象池。
  • 1
  • 2
  • 單例:由于web開(kāi)發(fā)中主要使用貧血模式,使用很多無(wú)狀態(tài)對(duì)象,無(wú)需重復(fù)創(chuàng)建,因此使用單例模式自然而然的事。

  • 線(xiàn)程池:對(duì)象池通過(guò)復(fù)用對(duì)象實(shí)例,減少對(duì)象創(chuàng)建和資源消耗。

3 數(shù)據(jù)結(jié)構(gòu)
在不同的場(chǎng)景中使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu),改寫(xiě)數(shù)據(jù)和計(jì)算特性可以極大優(yōu)化程序的性能。
  • 1
  • 2
4 垃圾回收
如果web應(yīng)用運(yùn)行在JVM等具有垃圾回收功能的環(huán)境中,理解垃圾回收機(jī)制有助于程序優(yōu)化和參數(shù)調(diào)優(yōu),以及編寫(xiě)內(nèi)存安全的代碼。
  • 1
  • 2

網(wǎng)站架構(gòu)的伸縮性設(shè)計(jì)

一般來(lái)說(shuō)。網(wǎng)站的伸縮性設(shè)計(jì)可分為兩類(lèi):一類(lèi)是根據(jù)功能進(jìn)行物理分離實(shí)現(xiàn)伸縮,一類(lèi)是單一功能通過(guò)集群實(shí)現(xiàn)伸縮。前者是不同的服務(wù)器部署不同的服務(wù),提供不同的功能;后者是集群內(nèi)的服務(wù)器部署相同的服務(wù)實(shí)現(xiàn)相同的功能。
  • 1
  • 2

應(yīng)用服務(wù)器集群的伸縮性設(shè)計(jì)

負(fù)載均衡是實(shí)現(xiàn)伸縮性設(shè)計(jì)的關(guān)鍵技術(shù)。因?yàn)樗軐⒂脩?hù)的請(qǐng)求按照某種規(guī)則分發(fā)到集群不同的服務(wù)器上,且能感知或配置集群的服務(wù)器數(shù)量,及時(shí)發(fā)現(xiàn)新上線(xiàn)或下線(xiàn)的服務(wù)器,以此來(lái)實(shí)現(xiàn)應(yīng)用服務(wù)器集群的可伸縮性。實(shí)現(xiàn)負(fù)載均衡的技術(shù)有以下幾種:
  • 1
  • 2
  • http重定向負(fù)載均衡

       http服務(wù)器就是一臺(tái)普通的應(yīng)用服務(wù)器,唯一功能就是根據(jù)根據(jù)用戶(hù)的http請(qǐng)求計(jì)算一臺(tái)真實(shí)的web服務(wù)器地址。這種方案的優(yōu)點(diǎn)是比較簡(jiǎn)單。缺點(diǎn)是瀏覽器需要兩次請(qǐng)求服務(wù)器才能完成一次訪問(wèn),性能較差;實(shí)踐中不常采用。
    
    • 1
    • 2
  • dns域名解析負(fù)載均衡

     每次域名解析請(qǐng)求都會(huì)根據(jù)負(fù)載均衡算法計(jì)算一個(gè)不同的ip地址返回。優(yōu)點(diǎn)是將負(fù)載均衡工作交給dns,省掉了網(wǎng)站管理維護(hù)負(fù)載均衡服務(wù)器的麻煩。缺點(diǎn)是dns負(fù)載均衡的控制權(quán)在域名服務(wù)商那里,網(wǎng)站無(wú)法對(duì)其做更多的改善和更強(qiáng)大的管理。
    
    • 1
    • 2
  • 反向代理負(fù)載均衡

    反向代理服務(wù)器需要雙網(wǎng)卡及內(nèi)部外部?jī)商譱p地址。其優(yōu)點(diǎn)是和反向代理服務(wù)器功能集成在一起,部署簡(jiǎn)單。缺點(diǎn)是所有請(qǐng)求均經(jīng)過(guò)此,其性能可能成為瓶頸。
    
    • 1
    • 2
    • ip負(fù)載均衡

      在網(wǎng)絡(luò)層通過(guò)修改請(qǐng)求目標(biāo)地址進(jìn)行負(fù)載均衡。ip負(fù)載均衡在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā),有更好的處理性能。但對(duì)需要提供下載服務(wù)或視頻服務(wù)的大型網(wǎng)站而言,難以滿(mǎn)足需求。

    • 數(shù)據(jù)鏈路層負(fù)載均衡

      在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址進(jìn)行負(fù)載均衡。此模式是目前大型網(wǎng)站采用最廣的一中負(fù)載均衡手段。

數(shù)據(jù)庫(kù)存儲(chǔ)服務(wù)器集群的伸縮

這里主要將關(guān)系型數(shù)據(jù)庫(kù)的伸縮設(shè)計(jì)。對(duì)于進(jìn)行了水平分庫(kù)分表的數(shù)據(jù)庫(kù),可以用一些分布式數(shù)據(jù)庫(kù)產(chǎn)品例如Mycat,Cobar.

利用分布式消息隊(duì)列降低降低系統(tǒng)耦合性

如果模塊間不存在直接調(diào)用,那么新增或修改對(duì)其他模塊的影響就最小。通過(guò)在低耦合的模塊間傳輸事件消息,來(lái)保持模塊的松散耦合。最常用的是分布式消息隊(duì)列。在伸縮性方面,由于消息隊(duì)列上的服務(wù)器上的數(shù)據(jù)是即時(shí)被處理的,可以看作無(wú)狀態(tài)的服務(wù)器,伸縮性比較簡(jiǎn)單,將新服務(wù)器加入分布式消息隊(duì)列集群中,通知生產(chǎn)者服務(wù)器更改消息隊(duì)列服務(wù)器列表即可。在可用性方面,為避免內(nèi)存空間不足的問(wèn)題,會(huì)將消息寫(xiě)入磁盤(pán)。
  • 1
  • 2

網(wǎng)站應(yīng)用攻擊與防御:

從互聯(lián)網(wǎng)誕生之日起,各種web攻擊和信息泄漏也從未停止。在此講一下主要的攻擊手段及防御措施。

  • xss攻擊

    xss即跨站點(diǎn)腳本攻擊,致黑客通過(guò)篡改網(wǎng)頁(yè),注入惡意html腳本。主要防御手段有兩種:
    
    1 消毒
    
    對(duì)某些html危險(xiǎn)字符轉(zhuǎn)義,如“>”轉(zhuǎn)義為“&gt”。
    
    2 HttpOnly
    
    即瀏覽器禁止頁(yè)面javascript訪問(wèn)帶有HttpOnly屬性的cookie。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • sql注入

    sql注入,攻擊者在http請(qǐng)求中注入惡意sql命令。防御方法,還是消毒,過(guò)濾請(qǐng)求數(shù)據(jù)中可能注入的sql。或者參數(shù)綁定,如mybatis的#{},將攻擊者的sql視為參數(shù),而不是可執(zhí)行sql。

    • csrf攻擊

    跨站點(diǎn)請(qǐng)求偽造,攻擊者通過(guò)跨站請(qǐng)求,以合法用戶(hù)身份進(jìn)行非法操作。其核心是利用服務(wù)器session或?yàn)g覽器cookie策略。盜取用戶(hù)身份。防御方法
    1 表單token。在頁(yè)面表單加入一個(gè)隨機(jī)數(shù)作為token值,提交到服務(wù)器進(jìn)行檢查。
    2 驗(yàn)證碼
    3 Refer Check
    http請(qǐng)求頭的請(qǐng)求域中記錄著請(qǐng)求來(lái)源,可檢查請(qǐng)求來(lái)源驗(yàn)證其是否合法。

web應(yīng)用防火墻
ModSecurity,一種開(kāi)源的web應(yīng)用防火墻,探測(cè)攻擊并保護(hù)web程序。
  • 1
  • 2
網(wǎng)站安全漏洞掃描
指根據(jù)一定規(guī)則構(gòu)造攻擊性u(píng)rl模擬黑客行為的工具。
  • 1
  • 2

由于本博客只是對(duì)大型網(wǎng)站的架構(gòu)及其用到的技術(shù)做一個(gè)大致的描述(不太好做詳細(xì)的講解,因?yàn)檫@里牽扯的知識(shí)點(diǎn)實(shí)在太多,而每個(gè)知識(shí)點(diǎn)又是可以單獨(dú)提出來(lái)寫(xiě)成一片或幾篇博客的那種),所以對(duì)大多數(shù)知識(shí)點(diǎn)的講解只是淺嘗輒止,如果想了解更多細(xì)節(jié)的同學(xué),可以自行百度或者閱讀本文的主要參考文獻(xiàn):

大型網(wǎng)站技術(shù)架構(gòu)核心原理與案列分析 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多