網(wǎng)站性能優(yōu)化是在網(wǎng)站遇到問題時的解決方案。網(wǎng)站性能問題大多是因為用戶高并發(fā)訪問時引起的混埠,所以網(wǎng)站性能優(yōu)化的主要工作就是改善用戶高并發(fā)訪問時的響應(yīng)速度脆丁。
web 前端性能優(yōu)化
減少 HTTP 請求
因為 HTTP 每次的請求的代價都是很昂貴的,所以減少 HTTP 請求的數(shù)目可以有效的提高訪問性能续搀。
減少 HTTP 請求次數(shù)的手段主要是合并 CSS帐我、合并 JavaScript坎炼、合并圖片。將頁面需要的 JavaScript拦键、CSS 合并成一個文件谣光,這樣瀏覽器只需要一次請求即可。
使用瀏覽器緩存
對于一個網(wǎng)站而言芬为,CSS萄金、JavaScript、Logo媚朦、圖片這些靜態(tài)資源文件的更新頻率比較低氧敢,而這些文件又幾乎是每個頁面都需要用到的。將這些文件緩存到瀏覽器中可以很好的改善網(wǎng)站性能询张。
通過設(shè)置 HTTP 響應(yīng)頭中的 Cache-Control 和 Expires 數(shù)據(jù)可以設(shè)定瀏覽器是否開啟緩存孙乖,及緩存時間。
如果某些靜態(tài)文件按需要及時更新,可以通過改變文件名實現(xiàn)唯袄。
使用壓縮
文本文件的壓縮效率可以達(dá)到 80% 以上弯屈,在服務(wù)器對 HTML、CSS恋拷、JavaScript 文件使用 GZip 壓縮资厉,然后在瀏覽器中解壓,可以有效的減少通信傳輸?shù)臄?shù)據(jù)量蔬顾。
但是壓縮是很耗費(fèi) CPU 資源的宴偿,對服務(wù)器會產(chǎn)生一定的壓力。如果服務(wù)器壓力大阎抒,而帶寬足夠的情況下建議最好不要啟用壓縮酪我。優(yōu)化第一步要做的就是找到性能瓶頸,不然很容易負(fù)優(yōu)化且叁。
CSS 放置在頁面最上面,JavaScript 放在網(wǎng)頁最下面
瀏覽器會在下載完所有需要用到的 CSS 之后才會對整個頁面進(jìn)行渲染秩伞,因此最后的做法是將 CSS 放在頁面最上面逞带,讓瀏覽器盡快下載 CSS。而 JavaScript 剛好相反纱新,瀏覽器在加載 JavaScript 后會立即執(zhí)行展氓,有可能會阻塞,造成頁面顯示緩慢脸爱,因此 JavaScript 最好放在頁面最下邊遇汞。
但是,如果頁面解析是就需要 JavaScript簿废,那就不適用此條優(yōu)化建議
減少 Cookie 和 Token 承載的數(shù)據(jù)量
Cookie 包含在每次請求和響應(yīng)中空入,太大的 Cookie 會嚴(yán)重影響數(shù)據(jù)傳輸,因此寫入數(shù)據(jù)到 Cookie 時要考慮這個數(shù)據(jù)是不是必須的族檬。盡量要減少 Cookie 承載的數(shù)據(jù)量歪赢。
現(xiàn)在網(wǎng)站使用 restful 風(fēng)格,使用 Token 作為用戶憑證单料。如果網(wǎng)站的大部分接口都需要使用 token埋凯,那么也需要減少 Token 承載內(nèi)容。還有 Token 的 payload 部分是沒有加密的扫尖,只是用了 base64 做了編碼白对,放太多內(nèi)容可能會導(dǎo)致用戶信息泄露。
使用 CDN 加速
CDN 的本質(zhì)就是一個緩存换怖,讓用戶就近獲取所需內(nèi)容甩恼,降低網(wǎng)絡(luò)擁塞,提高用戶訪問響應(yīng)速度。CDN 能夠緩存一些靜態(tài)文件媳拴,如圖片黄橘、文件、CSS屈溉、Script 腳本塞关、靜態(tài)網(wǎng)頁等。
使用 Nginx
使用 Nginx 做靜態(tài)服務(wù)器子巾,反向代理帆赢、負(fù)載均衡。
后端服務(wù)器優(yōu)化
應(yīng)用服務(wù)器是網(wǎng)開發(fā)最復(fù)炸线梗,變化最多的地方椰于,優(yōu)化的手段主要有緩存、集群仪搔、異步瘾婿。
使用緩存
當(dāng)網(wǎng)站遇到瓶頸的時候,首先想到的應(yīng)該就是能不能使用緩存優(yōu)化烤咧。在整個網(wǎng)站應(yīng)用中緩存無處不在偏陪,瀏覽器、服務(wù)器煮嫌、數(shù)據(jù)庫都有使用緩存優(yōu)化性能笛谦。合理的使用緩存對網(wǎng)站性能優(yōu)化意義重大。
使用緩存為什么可以優(yōu)化網(wǎng)站性能昌阿?
- 緩存是存儲在可以高速訪問的介質(zhì)中的饥脑,如內(nèi)存,cpu 的一級二級緩存懦冰,所以使用緩存可以提高獲取數(shù)據(jù)的速度灶轰。
- 我們可以緩存一些經(jīng)過復(fù)雜計算才能得到的結(jié)果。減少計算量儿奶,這就是常說的空間換時間框往。
使用緩存可以提高系統(tǒng)性能,但是不合理的使用緩存非但不能提供系統(tǒng)性能還會成為系統(tǒng)的累贅闯捎,甚至風(fēng)險椰弊。在開發(fā)中如何合理使用緩存?
- 不緩存頻繁修改的數(shù)據(jù)瓤鼻。如果緩存的事平凡修改的數(shù)據(jù)秉版,會出現(xiàn)數(shù)據(jù)寫入緩存后,還沒有讀取就失效了茬祷,用了緩存跟沒用一樣反而還增添了系統(tǒng)負(fù)擔(dān)清焕。
- 不緩存沒有熱點數(shù)據(jù)。因為內(nèi)存有限,不可能將所有數(shù)據(jù)都緩緩存秸妥,我們需要盡可能緩存可能被大量訪問的部分滚停。
- 不緩存一致性強(qiáng)的的數(shù)據(jù)。有的緩存的數(shù)據(jù)超過的失效時間才會從數(shù)據(jù)庫從新加載粥惧,因此要容忍一定時間的數(shù)據(jù)不一致键畴。
緩存的一些概念解釋
- 緩存雪崩:緩存服務(wù)器崩潰,或者大量緩存失效導(dǎo)致的請求全落在數(shù)據(jù)庫上導(dǎo)致書庫宕機(jī)突雪。
- 緩存穿透:因為業(yè)務(wù)邏輯問題或則惡意攻擊持續(xù)高并發(fā)的請求不存在的數(shù)據(jù)起惕,所有的請求落在數(shù)據(jù)苦。
- 緩存預(yù)熱:新啟動的緩存沒有任何數(shù)據(jù)咏删,在建立緩存過程中惹想,系統(tǒng)的新能和負(fù)載都不太好。最好的做法是啟時先把熱點數(shù)據(jù)加載到緩存督函。
異步
使用消息隊列的異步可以改善服務(wù)器性能嘀粱。
比如,用戶請求驗證碼辰狡,我們把用戶請求發(fā)送給消息隊列后立即返回草穆,再由消息隊列的消費(fèi)者從隊列獲取消息,異步發(fā)送驗證碼搓译。所以使用異步可以有效的提高接口響應(yīng)速度。
消息隊列還具有很好的削峰作用锋喜,將短時間高并發(fā)產(chǎn)生的消息存儲到消息隊列中些己,然后在一一處理。比如在促銷開始時涌入的大量訂單嘿般,如果不適用消息隊列可能超出服務(wù)器負(fù)荷段标,對服務(wù)器造成沖擊。
使用集群
使用負(fù)載均衡為一個應(yīng)用構(gòu)建一個有多臺服務(wù)器組成的服務(wù)器集群講并發(fā)訪問請求分發(fā)到多臺服務(wù)器上處理炉奴。避免單一服務(wù)器因為負(fù)載壓力過大響應(yīng)過慢逼庞。
代碼優(yōu)化
多線程
從資源利用的角度來看,使用多線程主要的原因有兩個瞻赶, IO 阻塞與多 CPU赛糟。
線程 IO 阻塞會釋放 CPU 資源,這時候 CPU 可以調(diào)度其他線程砸逊。
另一個原因是現(xiàn)在的處理器都是多核想要最大限度的使用這些CPU必須使用多線程璧南。
使用多線程需要注意線程安全問題,既多線程并發(fā)對共享資源進(jìn)行修改师逸,導(dǎo)致數(shù)據(jù)不一致司倚。線程安全產(chǎn)生的 bug 難以測試和重現(xiàn)。
編程上解決線程安全的主要手段有幾點
- 將對象設(shè)計成無狀態(tài)對象。就是對象本身不存儲狀態(tài)信息动知,這樣多線程并發(fā)訪問時就不會出現(xiàn)狀態(tài)不一致皿伺,Java Servlet 對象就設(shè)計成了無狀態(tài)對象。
- 使用局部變量:因為在 Java 中局部變量是存儲在棧中的盒粮,棧是線程獨享的鸵鸥。
- 使用鎖:并發(fā)訪問時使用鎖,通過鎖將并發(fā)訪問轉(zhuǎn)換為順序操作拆讯,從而避免資源被并發(fā)修改脂男。
資源復(fù)用
系統(tǒng)運(yùn)行時要盡量開銷很大的系統(tǒng)資源創(chuàng)建和銷毀。比如說數(shù)據(jù)庫連接种呐、網(wǎng)絡(luò)通信連接宰翅、線程和復(fù)雜對象。
資源復(fù)用主要有兩種方式
- 單例爽室,因為目前 web 開發(fā)主要使用貧血模式汁讼,從 Service 到 DAO 都是無狀態(tài)對象,無需重復(fù)創(chuàng)建阔墩,使用單例模式也是自然而然的嘿架,事實上如果不特別配置的話 Spring 構(gòu)造的對象都是單例的。
- 對象池啸箫,對象池通過復(fù)用實例對象耸彪,減少對象的創(chuàng)建和資源消耗。比如數(shù)據(jù)庫連接對象忘苛,如果每次使用都創(chuàng)建一個新的蝉娜,大量的時間耗費(fèi)在創(chuàng)建和關(guān)閉連接上。使用連接池的方式扎唾,連接對象統(tǒng)一存儲在對象池中召川,需要連接是就從連接池中獲取一個空閑連接,使用完畢歸還即可胸遇,不需要重復(fù)的創(chuàng)建銷毀荧呐。
存儲性能優(yōu)化
一句話花錢上固態(tài)。