在電商專案中所有的訪問都是通過首頁訪問進去的,那麼首頁門戶的訪問頻率會是非常高的,用我們專業術語來說就是併發量高,這時問題就來了,併發量高我們在做程式時就要保證首頁的抗壓能力強,而且還要保證抗壓的同時資料的載入速度還要保證也能高。這時就要說下OpenResty併發站點架構的思想了。
一、OpenResty簡介
二、OpenResty解決的問題
上面官方的術語說的很官方,可能看完了也不知道這玩意有啥好的,那就用大白話這樣說吧!OpenResty解決的是高併發的痛點。現在服務的後臺大部分是java寫的,但是用java寫出穩定的高併發服務是很複雜的一件事,首先是伺服器的選擇,web伺服器有幾個選型,tomcat,apache,weblogic,還有商用webphere. 1、tomcat官方宣稱的併發量是1000,厲害點的做點引數調優,也不過3000併發,如果要開發一個併發百萬的服務,1000000/3000,需要1000臺伺服器,想想都不可能。 2、apache的併發比tomcat更不堪,200-300 3、weblogic的併發稍好,平均能達到3000左右,但是也沒有達到好一個數量級;但是nginx就不一樣了,處理幾萬的請求很輕鬆,記憶體佔用也不高,在幾年前我朋友他們公司把它用作負載均衡,沒想過當做一個web伺服器,OpenResty的出現解決了享受nginx高併發優勢的攔路虎,因為nginx是使用非同步事件模型,跟傳統的程式設計思想不一樣,而lua是用c解釋執行的指令碼語言(執行效率很高),可以用傳統的同步程式設計思想上,在nginx請求接進來後處理稍複雜的邏輯。
對於高併發的系統來說,都是基於記憶體的,或者說是基於快取的,這時有的人可能會想用mysql支撐高併發,mysql的併發量在4000-8000,超過這個量mysql效能就會急劇下降。一次記憶體讀取的時間是幾十納秒,一次快取讀取是幾毫秒,一納秒等於1秒的1000000000分之一,一毫秒等於1秒的1000分之一,請求過來之後直接走記憶體讀取,在需要和資料庫互動的時候把資料寫入記憶體,然後再批量入庫,快速響應。
web流量也符合二八原則,百分之八十的流量集中在百分之二十的頁面,比如電商的首頁,產品詳情頁,使用openResty支撐產品詳情頁的高併發訪問,在處理訂購單,購物車等環節用其他的高併發框架處理,比如java的NIO網路框架netty。
三、OpenResty搭建
CentOS
你可以在你的 CentOS 系統中新增 openresty
倉庫,這樣就可以便於未來安裝或更新我們的軟體包(通過 yum check-update
命令)。 執行下面的命令就可以新增我們的倉庫(對於 CentOS 8 或以上版本,應將下面的 yum
都替換成 dnf
):
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
# update the yum index:
sudo yum check-update
然後就可以像下面這樣安裝軟體包,比如 openresty
:
sudo yum install -y openresty
如果你想安裝命令列工具 resty
,那麼可以像下面這樣安裝 openresty-resty
包:
sudo yum install -y openresty-resty
命令列工具 opm
在 openresty-opm
包裡,而 restydoc
工具在 openresty-doc
包裡頭。
列出所有 openresty
倉庫裡頭的軟體包:
sudo yum --disablerepo="*" --enablerepo="openresty" list available
參考 OpenResty RPM 包頁面獲取這些包更多的細節。
對於 CentOS 8 及更新版本,我們只需要將上面的 yum
命令都替換成 dnf
即可。
systemctl start openresty
然後直接在瀏覽器上打出http://ip/就可以看到頁面了
三、靜態頁面的釋出
上面講了OpenResty的作用以及安裝,這個過程看過官網還是比較簡單的,接下來就說下作用。在電商平臺中很多都是圖片,這些圖片都是靜態資源。可以開啟購物平臺看下。
可以發現就只查詢一個產品請求連結就達到了471個,如果把滾動條向下滾動請求會更多,可以通過控制檯發現這裡面大部分都是靜態資源,很少的動態請求。針對一個網店來說有這麼多的靜態資源如果都用tomcat去處理的話,tomcat的壓力是很大的。用一個例子說明下,前面說過OpenResty的抗壓能力非常好,他能非常輕鬆的達到10K到1000K,前面說過OpenResty裡面包含了Nginx,如果一個請求過來先經過Nginx,Nginx併發能力雖然很強,但是如果後端用Tomcat叢集承接的話,這時會導致服務很容易掛掉(上面說過Toncat的併發量)。
那麼這個問題出現了怎麼解決呢,解決思路其實也很簡單,那就是讓很多Nginx能處理的靜態請求直接讓Nginx自己直接處理,讓需要查詢資料庫的動態請求交給tomcat處理,這樣一來整體抗壓能力就提交很多了。這個思想其實就是動靜分離的處理思想。
下面就關於動靜分離的實踐做一個釋出,玩過nginx釋出vue專案的朋友對這一步來說是很簡單的,我把vue打包後的檔案通過工具上傳到我的linux中了,這一步比較簡單我就不說明了。目錄如下
接下來要做的就是通過Nginx釋出程式碼。先進入到openresty目錄
cd /usr/local/openresty/
然後進入到nginx目錄
然後進入他的核心配置檔案conf裡面修改檔案nginx.conf檔案
修改紅框內的兩個內容就可以了,上面那個是要訪問的網址,下面那個是打包專案的路徑
儲存檔案後重新載入一下用命令
nginx -s reload
報了個錯,這個錯是我環境變數沒有配置,輸入命令
vi /etc/profile
在檔案最後一行配置如下配置
export PATH=/usr/local/openresty/nginx/sbin:$PATH
然後再輸入下面命令就可以讓配置生效了
source /etc/profile
再用nginx -s reload執行一下就不會報錯了
現在訪問下自己配置的網址www.ljx.com,發現域名沒用
這個也簡單,花錢買是不可能的,飯都吃不起的人怎麼可能浪費錢去買域名。修改本地檔案 C:\Windows\System32\drivers\etc\HOSTS 檔案就可以了,在HOSTS檔案最後一行加上ip 域名就行例如
192.168.32.32 www.ljx.com
這樣頁面就載入出來了