Java Python 和Nodejs在web开发方面的简单比较

对语言之间优势这个问题,可以写几本书来具体阐述. 我尝试简单地说一点。不见得对,也不可能完整,仅供参考。

互联网兴起,静态页面不能满足复杂的交互需求. 出现了动态技术.
史前时期动态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的优势更在于包罗万象。各方面都能找到优秀的组件。但开发起来复杂一些,更适合有一定规模的团队采用。

    原文作者:Yujiaao
    原文地址: https://segmentfault.com/a/1190000014598626
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞