从Web技术演化角度理解Web服务器、应用服务器、Servlet、Servlet容器、Web容器等概念

从Web技术演化角度理解Web服务器、应用服务器、Servlet、Servlet容器、Web容器等概念

Web服务器

Web服务器是服务端的一个程序,当这个程序运行的时候,他时刻等待着其他客户端的连接请求,当有客户端请求连接的时候,Web服务器便负责和客户端建立连接,建立连接后,当客户端发送Http请求到Web服务器,Web服务器负责解析Http请求,定位到Http请求的资源,并遵循Http协议对资源进行包装响应给客户端

Http协议可以理解为客户端和服务端约定好的对话语言。假如一个人只能听得懂中文,只会用中文表达,而另一个人只能听得懂英文,也只会用英文表达,那么这两个人都无法理解对方的意思,是无法沟通交流的。同理,客户端和服务端必须相互约定好双方都能懂的语言进行交流,Http协议就是各种语言中的一种。解析Http请求的过程就是理解对方表达的意思的过程,遵循Http协议对资源进行包装的过程就是用Http协议进行表达的过程。

从Web技术演化角度理解Web服务器、应用服务器、Servlet、Servlet容器、Web容器等概念

Web 技术演化

早期,web技术主要用于浏览静态页面:

从Web技术演化角度理解Web服务器、应用服务器、Servlet、Servlet容器、Web容器等概念

也就是说早期你只能从Web服务器请求到静态资源

静态资源(如:HTML、CSS、JS等Web页面中的供人们浏览的数据始终是不变的资源,也包括图片、多媒体等人们从不同时间点访问都始终是一样的资源)

动态资源: 指web页面*人们浏览的数据是由程序产生的,不同时间点访问 web页面看到的内容各不相同。比如:JSP/Servlet、ASP、PHP,在javaWeb领域中,动态资源被认为通过java代码去动态生成html

然而随着时间发展,用户已经不满足于仅浏览静态页面。用户需要一些交互操作,获取一些动态结果。如果基于HTTP协议实现Web服务器增强功能太过复杂,所以需要一些扩展机制来实现用户想要的功能。

早期使用的Web服务器扩展机制是CGI(Common Gateway Interface,公共网关接口)。

从Web技术演化角度理解Web服务器、应用服务器、Servlet、Servlet容器、Web容器等概念

使用这种方法,用户单击某个链接或输入网址来访问CGI程序,web服务器收到请求后,运行该CGI程序,对用户请求进行处理,紧接着将处理结果并产生一个响应,该响应被返回给web服务器,web服务器对响应进行包装,以HTTP响应的方式返回给浏览器。

应用服务器诞生

JSP,ASP,PHP等动态内容需要通过CGI、FastCGI、ISAPI等接口交给其他程序(如上图CGI程序)去处理。这个其他程序就是应用服务器

应用服务器有:WebLogic,JBoss,Tomcat等。

Web服务器&应用服务器

  • 严格意义上,Web服务器只负责处理HTTP协议,只能发送静态页面的内容。包括:Nginx,Apache,IIS等。
  • 而动态内容交给应用服务器去处理。
  • 但如今随着技术的发展,两种服务器都具备了各自的功能
    • 应用服务器一般也支持处理HTTP协议。
    • 大多数Web服务器也都有插件来支持脚本语言,比如Perl、PHP、ASP、JSP等,通过这些插件,这些服务器就可以生成动态的HTTP内容。
    • 因此两者界限没这么清晰。在大多数时候,Web服务器和应用服务器这两个术语是可以互换使用的。
  • 但是应用服务器的HTTP协议部分仅仅是支持,一般不会做特别优化,所以很少有见Tomcat直接暴露给外面,而是和Nginx、Apache等配合,只让Tomcat处理JSP和Servlet部分。大多数生产环境都有web服务器充当应用服务器的反向代理。这意味着在页面请求时,web服务器会通过提供静态内容(例如图像/静态HTML)来解释请求,并且它还会使用某种过滤技术(主要是请求资源的扩展)识别动态内容请求,并透明地转发到应用服务器。

Servlet和Servlet容器诞生

CGI程序在一定程度上解决了用户需求。不过还存在一些不足之处,如CGI程序编写困难,响应时间较长,以进程方式运行导致性能受限。于是1997年,sun公司推出了Servlet技术,作为java阵营的CGI解决方案。

从Web技术演化角度理解Web服务器、应用服务器、Servlet、Servlet容器、Web容器等概念

Servlet

Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。

与CGI程序相比,Servlet的优点

  • Servlet是单实例多线程的运行方式,每个请求在一个独立的线程中运行,而提供服务的Servlet实例只有一个。
  • Servlet具有可升级性,能响应更多的请求,因为Servlet容器使用一个线程而不是操作系统进程,而线程仅占用有限的系统资源。
  • Servlet使用标准的API,被更多的Web服务器所支持。
  • Servlet使用Java语言编写,因此拥有Java程序语言的所有优点,包括容易开发和平*立性。
  • Servlet可以访问Java平台丰富的类库,使得各种应用的开发更为容易。
  • Servlet容器给Servlet提供额外的功能,如错误处理和安全。

Servlet容器(Servlet引擎)

Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于 MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。

(注:常用的MIME类型:text/html,application/pdf,video/quicktime,application /java,image/jpeg,application/jar,application/octet-stream,application/x- zip)

有了servlet之后,用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问Servlet,Web服务器接收到该请求后,并不是将 请求直接交给Servlet,而是交给Servlet容器。Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理, 并产生一个响应。这个响应由Servlet容器返回给Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给Web浏览器。

Servlet容器的作用

  • 通信支持 :利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立serversocket、监听某个端口、创建流等 等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考虑如何在servlet中实现业务逻辑(如处理一个订单)。
  • 生命周期管理 :servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。
  • 多线程支持 :容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。
  • 声明方式实现安全 :利用servlet容器,你可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。
  • JSP支持 :servlet容器负责将jsp代码翻译为真正的java代码。

Servlet容器的分类

  • 独立的Servlet容器

当我们使用基于Java技术的Web服务器时,Servlet容器作为构成Web服务器的一部分而存在。然而大多数的Web服务器并非基于Java,因此,就有了下面两种Servlet容器的工作模式。

  • 进程内的Servlet容器

Servlet容器由Web服务器插件和Java容器两部分的实现组成。Web服务器插件在某个Web服务器内部地址空间中打开一个 JVM(Java虚拟机),使得Java容器可以在此JVM中加载并运行Servlet。如有客户端调用Servlet的请求到来,插件取得对此请求的控 制并将它传递(使用JNI技术)给Java容器,然后由Java容器将此请求交由Servlet进行处理。进程内的Servlet容器对于单进程、多线程的服务器非常适合,提供了较高的运行速度,但伸缩性有所不足。

  • 进程外的Servlet容器

Servlet容器运行于Web服务器之外的地址空间,它也是由Web服务器插件和Java容器两部分的实现组成的。Web服务器插件和Java容 器(在外部JVM中运行)使用IPC机制(通常是TCP/IP)进行通信。当一个调用Servlet的请求到达时,插件取得对此请求的控制并将其传递(使 用IPC机制)给Java容器。进程外Servlet容器对客户请求的响应速度不如进程内的Servlet容器,但进程外容器具有更好的伸缩性和稳定性。

Web容器

用于部署和管理Web应用的,我们都可以称之为Web容器。

总结

Web服务器是一个运行在服务端,负责等待接收客户端连接请求,与客户端建立连接,处理http请求和响应静态资源的程序。

应用服务器是一个运行在服务端,负责处理动态资源的程序,与Web服务器完成交互,完成动态资源处理的工作。

Servlet容器Servlet引擎)是应用服务器的一种,管理Servlet。

Servlet是一个生成动态内容的程序。

如今许多Web服务器具备应用服务器的功能,许多应用服务器具备Web服务器的功能,因此Web服务器和应用服务器这两个术语是可以互换使用的。

我们可以把用于部署和管理Web应用的服务器称之为Web容器。

Tomcat是一个由Apache、Sun和其他一些公司及个人共同开发而成免费的开放源代码的Servlet容器,将我们的Web项目部署到Tomcat后,我们可以Http请求访问,因此它也具有Web服务器的功能。因此我们可以称它为Web服务器、应用服务器、Servlet容器(Servlet引擎)、Web容器。

参考资料