簡易的負載均衡服務器——springsnail
《linux高性能服務器編程》作者開源的一款簡易負載均衡服務器,整個項目代碼1400多行,短小精悍,適合初學者學習與模仿。該項目能從所有邏輯服務器中選取負荷最小的一臺來處理新的客戶連接,並且使用了進程池,有限狀態機,高效數據結構和統一事件源等書中提及的思路優化其性能,同時還細緻地封裝了每個函數和模塊,使之更像一個完整的實際服務器項目。
參考博客:
《Linux高性能服務器》附帶項目springsnil源碼解析
Linux高性能服務器編程springsnail源碼解析(c++負載均衡)
項目搭建與使用
項目源碼下載:
git clone https://github.com/liu-jianhao/springsnail.git
下載下來之後發現,整個項目源碼如下:
解釋一下各個文件的內容與作用:
-
config.xml:配置文件,指明服務器本身的地址及它所要連接的ip127.0.0.1:8080表明服務器的主機位置和端口(localhost),下面兩個103.65.41.126和103.65.41.125分別指明服務器連接的ip。執行時使用命令./springsnail -f config.xml即可
-
fdwrapper.h與fdwrapper.cpp:操作文件描述符fd的各種函數,具體會在源碼解析中放出。
-
log.h與log.cpp:日誌函數,在程序運行過程中打印各種信息到文件和控制檯中。
-
mgr.h與mgr.cpp:處理網絡連接和負載均衡的框架
-
conn.h與conn.cpp:客戶端類與函數
-
processcool.h:進程池,是整個項目的動力。
-
main.cpp:主函數,處理服務器的主要邏輯。
瞭解完項目源碼分佈之後,我們發現有Makefile文件,所以直接make即可生成可執行文件。可執行文件就是圖中綠色的springsnail了。
有了可執行文件,下一步就是修改配置文件config.xml,將服務器連接到我們想連接的ip上去。
比如,我們想連接到網易雲音樂,先nslookup一下域名的地址:
$ nslookup music.163.com
結果如下:
上面59.111.181.35,59.111.181.38,59.111.181.60就是域名的ip了,我們隨便選兩個添加到config.xml文件中去:
保存並退出,然後執行服務器程序:
$ ./springsnail -f config.xml
終端顯示如下信息:
表明服務器已經成功與目標ip連接。
此時我們可以將這個服務器作爲中轉,向服務器發送數據。
首先另開終端,使用nc工具進行連接:
$ nc localhost 8080
/*nc(netcat)是一個功能強大的網絡工具,如果並未安裝請使用命令
$ yum install nc.x86_64
netcat不僅可以通過使用TCP或UDP協議的網絡連接讀寫數據,同時還是一個功能強大的網絡調試和探測工具,能夠建立你需要的幾乎所有類型的網絡連接。*/
連接成功後服務端會顯示:
這樣的信息,此時在nc端模擬http報文,命令如下:
$ nc localhost 8080
GET /HTTP/1.1
發現nc端返回如下信息:
可以清晰的看出我們的訪問被403 Forbidden了,說明網易並不允許這樣的中轉服務器的存在,服務端也有相應的反饋:
可以看到剛纔我們的連接請求被中斷了,服務端有"error"日誌消息迴應。
還可以使用這個服務器去訪問其他網站,只需修改config.xml文件即可,會有許多不同的結果。
接下來將對整個項目的源碼進行剖析,從框架到實現都會做上詳細的註釋。