Java Python 和Nodejs在web開發方面的簡單比較

Yujiaao發表於2019-01-19

對語言之間優勢這個問題,可以寫幾本書來具體闡述. 我嘗試簡單地說一點。不見得對,也不可能完整,僅供參考。

網際網路興起,靜態頁面不能滿足複雜的互動需求. 出現了動態技術.
史前時期動態Web 開發多采用CGI 技術來實現.
CGI 將指令碼作為單獨的程式執行, 每個請求都使用環境變數、標準輸入和標準輸出來與它 “通訊 “。
這是種互對低效的執行方式. 出現了類似isapi, ASP 這樣技術(ASP 1.0 釋出於1996年12月, 作為 IIS 3.0的一部分). 方便多了,有了session管理, 有了內建物件.
但也有明顯缺點,程式碼與頁面混在一起.

接下來提出Servlet標準,參考實現是Tomcat.
Tomcat的作為Servlet 規範一個開源的參考實現, 最初是Sun公司在1998年11月釋出的. 核心人物是 James Duncan Davidson.
Tomcat 3.0合併了Sun捐贈的Java Web Server程式碼, 這個版本實現了Servlet 2.2和JSP 1.1規範.
目前由Apache軟體基金維護.

它是一個開放的標準,引發了當時的一些開發熱潮,
產生了大量的中介軟體,也稱為應用伺服器, 如WebSphere, WebLogic, GlassFish, JBoss, Jetty, Resin,金蝶的Apusic. 這裡面有的是完整實現了J2EE標準.如WebLogic:
標準具體有,Servlet, JSP, EJB, JDBC, Java Message Service, JTA, XML相關, JAAS 等等.
有的只是一小部分實現,如Tomcat:只有Servlet, JSP, Java EL, JNDI等.
對企業開發來說,這樣的標準有諸多的好處,解決了很多需要重複解決的問題,如訊息佇列,分散式事務等等. 應用只需根據介面開發就可以了,實現由應用伺服器來完成.
因為複雜,過重,適合中等以上團隊開發.

Tomcat/Servlet的體系之所以這麼設計,基於幾點考慮:

方便擴充套件
遵循標準化定義
保持版本間的相容性
好處是穩定,值得依賴,不會為個別商業機構左右.
不好的是地方是升級相對慢, 與nodejs社群的飛速發展相比, Java顯得沉重而緩慢.
但這未嘗不是好事, 對於開發人員來說, 這是非常好的長效投資. 保證工作經驗的積累是有效的, 而不是忽略業務追逐技術去適應迎接不暇的新版本.
Python 2到Python 3的過渡即是斷堐式的. 而Java最早的程式碼仍可以跑在今天的虛擬機器上.
Node.js也存在很多版本間的問題, 但因為是指令碼,而不是編譯,出錯時不會告訴你是版本的是問題, 而是報告各種奇怪的異常. 當然,這是題外話了.

Tomcat 內部的體系結構
Tomcat 有非常優秀的結構定義
核心部分有:
Catalina – 實現Servlet API
Coyote – HTTP協議棧
Jasper – JSP 動態編譯器及載入器, 負責把JSP頁面編譯成Servlet

可以看出以上全部的核心是 Servlet 規範.

作為網際網路的基礎設施,Tomcat歷經20年,沒有本質上改動, 可見當初設計才的洞見.

可以與其媲美的有估計只有乙太網口的設計, HTTP的設計, TCP/IP 的設計,USB介面的設計.

Tomcat 的配置項與程式碼隔離, 個人認為這是Tomcat設計最精良的地方
你可以在不改程式碼的前提下,對tomcat各個層面環節進行配置,從而實現多種協議多種特性的支援

與Python和Nodejs的Web Server的比較

都遵循HTTP/1.0 and HTTP/1.1 協議
但用Java寫的Web 應用支援更高層的Servlet 介面, 可以在不同應用伺服器中執行,不需要對程式碼進行調整,
Python和Nodejs都有很多Web Server的實現, 但這些Servers之間顯然沒有更高層次的抽象, 如需要切換,需要做大量改動和測試.
假設在你Server A 上做開發, 忽然發現Server B 上有你想的的特性, 你只有大幅改動才行.

Python 下的Web伺服器, 核心標準 WSGI

Python 下也有很多Web Server 軟體,如CherryPy WSGI Server, Gunicorn, Tornado, Twisted Web, uWSGI, Waitress WSGI Server等等.

這個伺服器都支援[WSGI]2規範.
需要指出的是WSGIv1.0.1出現的時間是: 26-Sep-2010, 比Java相應規範晚了十多年. 出來時已經是群雄混戰,想統一已經很難了,
也使得WSGI 是一個相對簡單,容易實現的規範, 以此來吸引伺服器開發者. 在此之前則是 CGI, FastCGI, mod_python三分天下的局面.

Node.js下的Web伺服器:light-server, live-server ,lite-server, http-server
基本以輕量級的靜態檔案伺服器為主。

總結一下

名稱 Java Python Node.js
典型的WebServer Tomcat Tornado http-server
標準 Servlet WSGI 無
伺服器端模板 JSP,Freemarker tornado.template CoffeKup, Swig, Jade
典型 Web框架 Spring MVC Flask, Django Express
資料庫相關 JDBC, Hibernate SQLAlchemy Moogoose
多執行緒與分散式 容易 不清楚 不清楚
日誌 Log4j, Slf4j 不清楚 不清楚
遠端除錯 容易 不清楚 不清楚
結論:
各有優勢,如Nodejs配合前端模板技術如Vue.js採用前後端分離的json/ajax作為資料格式在一些場景下很有吸引力。Python在做資料分析和人工智慧方面也有很多可以直接使用的演算法庫。Java的優勢更在於包羅永珍。各方面都能找到優秀的元件。但開發起來複雜一些,更適合有一定規模的團隊採用。

相關文章