最近一兩年用C++寫了好幾個基於TCP通信類型程序,都是寫一個小型的服務器,監聽請求,解析自定義的協議,處理請求,返回結果。每次寫新程序時都把老代碼拿來,修改一下協議解析部分和業務處理部分,然后就一個新的程序就誕生了。如此這般做了幾回,就萌生了一個想法:是不是可以做一個通用的服務器程序,每次只要實現很少的代碼就可以構建的一個新的服務器程序?
巧的是在用C++寫代碼的時候,我剛好碰到過一個叫做Push Framework的開源項目(在這里可以找到:www.pushframework.com),就是干這個的,功能完整,性能不錯。
因為本人主要做Java,因此就萌生了把它翻譯成Java版本的想法,這個過程可以學到兩點:
1. 服務器程序的基本架構
2. Java網絡部分的API
說到這個,就想起了Netty和Mina,就提供這種類型的功能,而且還提供異步I/O。除了這兩個著名的項目,我還發現Java世界里有類似功能的項目還有一些:
1. Grizzly (https://grizzly.java.net/): 從GlassFish服務器程序中分離出來的,用Java NIO實現。
2. IoServer (https://code.google.com/p/ioserver/): 國人的項目,號稱比Mina更輕量級,專注於手游方面的服務器。
3. Quick Server (http://www.quickserver.org/): 基於TCP,同樣是只需要專注於協議和處理邏輯。
看到有不少類似的項目,啥逼格都沒有了,那就純屬基礎學習吧。這里貼一下自己的這個項目的地址:Java Push Framework (https://github.com/wanly3643/Java-Push-Framework/)。目前一個能運行的版本已經提交上去了,有興趣的朋友可以拿去看看,文檔正在抓緊寫。
翻譯成Java版本之后,根據自己的理解畫了一個服務器程序的簡單架構圖:

第一行表示新的客戶端到達時的處理邏輯,第二三行表示有新的請求到達時的處理邏輯。
一個服務器應該提供一個監視服務,提供一個監聽服務端口獲取服務器的運行狀態。因為對於監視請求的處理和普通客戶端很類似,因此可以和普通客戶端一起處理。
此外對於服務器來說,還需要包含廣播功能,這就需要一個廣播管理模塊,廣播消息隊列以及廣播消息發送模塊。
其實,做這個通用的服務器框架只是第一步,后面還打算自己實現HTTP協議,然后再實現servlet容器,這樣就能出來一個小的tomcat了。
這是一條線,還有一條線就是研究服務器程序性能方面的研究。
開篇就寫這么多,后面會按照模塊來分析,寫一些思路和實現代碼時遇到的問題。
