是什么让Tomcat架构存活近20年?

2 篇文章 0 订阅
1 篇文章 0 订阅

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

互联网兴起,静态页面不能满足复杂的交互需求。 出现了动态技术。 史前时期动态 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等。 对企业开发来说,按这样的标准开发有诸多的好处,解决了很多需要重复解决的问题,如消息队列,分布式事务等等。 应用只需根据接口开发就可以了,实现由应用服务器来完成。 JavaEE 因为复杂,标准过重,适合中等以上团队开发。

Tomcat/Servlet 的体系之所以这么设计,基于几点考虑:

方便扩展
遵循标准化定义
保持版本间的兼容性

好处是稳定,值得依赖,不会为个别商业机构左右。 不好的是地方是升级相对慢, 与Node.js社区的飞速发展相比, 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 和 Node.js 的 Web Server 的比较

都遵循 HTTP/1.0 和 HTTP/1.1 协议
但用 Java 写的 Web 应用支持更高层的 Servlet 接口, 可以在不同应用服务器中运行,不需要对代码进行调整,

Python 和 Node.js 都有很多 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 出现的时间是: 2010年9月26日, 比 Java 相应规范晚了十多年。 标准出来时已经是群雄混战,想统一已经很难了, 也使得WSGI 是一个相对简单,容易实现的规范, 以此来吸引服务器开发者。 在此之前则是 CGI, FastCGI, mod_python三分天下的局面。

Node.js 下的 Web 服务器:light-server, live-server ,lite-server, http-server
基本以轻量级的静态文件服务器为主。

总结一下

名称JavaPythonNode.js
典型的 WebServerTomcatTornadohttp-server
标准ServletWSGI
服务器端模板JSP,Freemarkertornado。templateCoffeKup, Swig, Jade
典型 Web框架Spring MVCFlask, DjangoExpress
数据库相关JDBC, HibernateSQLAlchemyMoogoose
多线程与分布式容易支持多线程支持异步
日志Log4j, Slf4j系统内置loggingconsole
远程调试容易不清楚不清楚

结论:
各有优势,如 Node.js 配合前端模板技术如 Vue.js 采用前后端分离的 JSON/AJAX 作为数据格式在一些场景下很有吸引力。Python 在做数据分析和人工智能方面也有很多可以直接使用的算法库。Java的优势更在于包罗万象。各方面都能找到优秀的组件。但开发起来复杂一些,更适合有一定规模的团队采用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值