來自:碼農翻身(微訊號:coderising)
我是Servlet, 由於很多框架把我深深地隱藏了起來,我變得似乎無關緊要了,很多人也選擇性的把我給遺忘了。 其實,我還活得好好的呢, 只不過是從前臺明星慢慢退居幕後而已。
好基友Servlet + JSP
想當年我剛剛誕生的時候,無數人對我趨之若鶩。
因為那個時候Web伺服器只能處理靜態的HTML頁面,圖片,JavaScript這樣的東西, 比如Apache 這個著名的Web伺服器。
人類想要看一點動態的內容,比如什麼留言板,購物網站等,還得靠極為難用的CGI。
我一齣生, 他們就歡呼著把CGI給拋棄,紛紛改用Java寫Servlet程式, 再後來我的好兄弟JSP問世,我們簡直形成了絕配。
我負責控制,JSP負責檢視,再加上負責資料的Java Bean, MVC三駕馬車正式形成,風靡一時,想當年,著名的開源論壇軟體Jive就是我們的巔峰之作。
說起JSP,這小子有時候還不太服我,經常振振有詞地說:“你Servlet沒什麼了不起的,我也可以當Controller!”
JSP確實可以當Controller, 早些年我還真的見過,一個長達6000多行的JSP,行使著Controller的職責,每當程式員要改這些程式碼就膽顫心驚,叫苦不迭。
其實JSP不知道,它本質上也就是Servlet ,JSP只不過穿了一件漂亮的外衣,給了程式員們一個輕鬆寫動態頁面的工具而已,實際執行的時候會被編譯成Servlet類, 本質上我們是一樣的。
我和JSP都生活在Servlet Container當中,Container這個詞有點高大上,但是說白了,無非就是能執行Servlet和JSP的一個東西,比如說Tomcat, 比如說Jetty。
但是無論是我還是JSP, 我們能處理的只是HTTP請求,必須得有人把HTTP請求轉發給我們才可以。
這件事情只有讓Tomcat, Jetty他們來做了,他們自己可以接收HTTP請求,然後轉發給我們;
他們也可以從別人,例如Apache那裡接收HTTP請求,然後發給我們處理,處理完了再轉發給Apache, Apache再發給人類的瀏覽器。
雖然有點麻煩, 但是這種方式確實非常靈活,各司其職,擴充套件性比較好,比如,一個Apache可以把請求分發給後臺多個Tomcat中的一個。
Apache,Nginx 他們專心致志地去處理靜態內容(HTML, JS, 圖片) ,我們這裡心無旁騖地執地執行“不講邏輯的”業務邏輯,訪問資料庫,然後生成頁面傳回。
Application Server
日子過得波瀾不驚,我一度認為,這個世界就將這麼執行下去。
應用程式越開發越多,出現了一些通用的需求,比如安全,事務,分散式等等,這些需求應用程式不願意處理,想丟給作業系統,作業系統也不願意處理, 那怎麼辦?
不知道是誰提了一個叫做中介軟體的概念: 你們不願意做的,我們中介軟體來做。
Java 世界也不敢怠慢,也搞出了一大堆的規範,像什麼EJB,JMS,JTA等等,把我和JSP也合併到其中,形成一個大“雜燴”,叫做J2EE。
其中最春風得意的就是EJB這傢伙,獨自生活在EJB Container中(又是Container!),號稱能支援真正地分散式計算:一個EJB可以有多個實體,分佈到多個伺服器中,應對使用者的請求, 聽起來很高深的技術。
他們把Servlet Container稱為Web Container, 和EJB Container 一起,還有其他的一些東西,被合併到一個叫做Application Server當中去了。 最知名的幾個Application Server 就是 Weblogic , WebSphere , JBoss。
國內的金蝶也實現過一個,叫做Apusic,雖然影響力不如前面那幾位,但值得贊賞。
退居幕後
我和JSP都沒有料到,EJB搶了我們的風頭,成了系統的中心, 讓我們極為不爽。
我和JSP豈能善罷甘休? 我們決定抓住EJB的弱點進行反擊, 我們和人類一個叫做Rod Johnson的聯合,讓他出面,列舉出EJB的36大罪狀,昭告天下,這些罪狀包括但不限於:笨重,效能低下,難於測試,昂貴….
EJB確實是個扶不起的阿斗, 很快就被人批得體無完膚,大家紛紛投入Rod Johnson 建立的Spring的懷抱。
我鬆了一口氣, 可是很快就發現事情不對勁,大家紛紛用起了框架! 比如Struts, SpringMVC……
在這些框架中,我雖然處於一個非常重要的角色, 但是通常情況下只要配置一下web.xml,就可以把我扔到一邊了。
Container 照例把HTTP請求傳遞給我,但是我卻不能親手處理,我需要傳遞給框架,框架分派給Controller,沒我什麼事了!
那些程式員們要做的事情就是寫Controller, Service , DAO這些和我八班桿子打不著的東西。
我恨框架, 但是看到程式員們寫程式碼寫得那麼高興,又無話可說,畢竟框架極大地減少了他們的工作量:
之前對於每個HTTP請求,程式員得手工地去解析URL, 呼叫相關的Java Bean。
現在只需要用個配置檔案或者註解就可以把URL給對映到一個Java 類。
之前對於HTTP請求中的引數, 程式員也得手工解析和驗證。
現在也可以直接對映到Java 物件或者變數
……
用起來這麼簡單,他們不用才怪。
更讓人生氣的是,Rod他們後來倒騰出來一個叫做Spring Boot的東西,徹底地把我給隱藏起來了!
尤其是對於一個新手來說,甚至完全不知道我的存在。
Tomcat和Jetty這樣的Servlet Container也很悲催,他們竟然被內嵌到了Spring Boot中! 程式員開發出的Web應用,就像一個普通的Java程式一樣,從main函式開始執行。
我們徹底地退居幕後了!
不過我有義務提醒一下學習後端程式設計的同學,不要一上來就學習框架,不要被框架迷住你的雙眼!
還是應該好好看看最基本的Java Web, 就是我和我的兄弟JSP。
威脅來臨
雖然是退居幕後,但是我的核心地位依然穩固,是Java Web應用的中堅力量,我生活在Servlet Container中,專門處理HTTP請求,這麼多年難逢敵手。
直到有一天,有個叫做Netty的傢伙上門挑戰。
這個Netty居然完全不用Servlet Container,或者換句話說,人家自己就是一個“Container” , 這對我來說絕對是釜底抽薪的攻擊, 我引以為傲的Servlet 規範, Servlet API統統不管用了。
我只能處理HTTP, 可是這個Netty支援各種各樣的協議:HTTP, FTP, UDP, 它還支援實現各種各樣自定義的協議! 這就意味著程式員完全可以自定義一套自己應用的RPC協議,然後放到Netty上執行。
它的底層是Java NIO,又封裝了Java NIO那些複雜的底層細節,可以輕鬆實現高效能、高可靠的網路伺服器, 這實在是太可怕了。
我似乎看到了一個可怕的場景: 用Netty 開發的伺服器端,執行著眾多的Web 服務,他們之間使用私有的協議在互相呼叫,效率極高,效能極高, 根本沒有Servlet, HTTP, Tomcat什麼事。
讓我稍感安慰的是,直接使用Netty的程式員們還不多,雖說有不少人在使用基於Netty的Dubbo, 但是Netty也被封裝隱藏起來了。 我估計真正具有鑽研精神的程式員才願意去研究他吧。
●編號693,輸入編號直達本文
●輸入m獲取文章目錄
Python程式設計
更多推薦:《18個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。