大家好,这里是五彩石编程,我是军哥。做网络相关的开发,经常会听到一个词叫做servlet
,和它一起出现的,往往还有jetty
、tomcat
、jboss
、springboot
等,概念很多,也很抽象,经常搞得人一头雾水,今天军哥就用10分钟的时间,带你拿下它。
回归最初
首先,回到互联网还是静态页面的时期,那个时候,网页内容都是提前写好的,每次访问,出现的内容都是相同的,现在的人们肯定想象不到,那时候上互联网是怎样的一种体验。
当然有人忍受不了这样的互联网体验,于是后来出现了一种返回动态内容的技术,叫做CGI
,common gateway interface,这种技术在每次用户请求时,会启动一个进程,来处理用户的请求,将处理后的结果返回给用户,这样用户就可以看到不同的内容了,页面总算动起来了。
但每次都启动进程的这种方式,太消耗服务器资源了,响应速度也会受到影响,加上那时候的cpu和内存资源还很宝贵,所以又出来了一种叫做fast CGI
的技术,先启动一堆的进程,等用户请求来了,哪个进程闲着就让它处理,这样服务器的硬件资源消耗就可控了,响应速度也上来了,比较出名的lamp及lnmp架构就随之出现了。
与此同时,java也在发展一种能让网页能动起来的技术,取名为servlet
,但早期的servlet
比较难用,于是后面又持续更新了几次,随着更新而出现的就是后来的jsp
技术、jsp+javaBean
技术、使用mvc分层思路的jsp+servlet+model
技术等,一直到了现在。
servlet是什么
servlet
和cgi
的思路不同,它走的是在内存中管理用户请求的思路,使用多线程来实现,所以根本不存在多进程管理相关的事情。
那么servlet
究竟是什么呢?其实就是一套规范,相当于有几个人在聊天,聊到了动态网页技术,想到了用多线程来实现,于是就深入聊了一下相关技术的细节,聊完后,把聊天的详细内容纪录了下来,取了个名字叫做servlet
。光有聊天的内容还很空,无法落地,于是基于聊天的内容,细化整理出来了一套非常详细的规范,在这套规范里,它定义了什么叫做请求,它应该有哪些属性参数,格式是什么,安全问题怎么处理,IO问题怎么处理,cookie怎么处理,编码格式等等。还有其它的比如响应相关的内容、过滤、session、上下文、生命周期等各种细节方面的东西,这些东西整理完了之后,给这份文档打了个编号叫JavaEE7 Servlet 3.1(JSR340)
。
有了规范还是无法使用,要想使用它让网页动起来,需要这个规范的一个实现才可以,于是java先定义了一个servlet的接口,就是常见的javax.servlet.Servlet
接口,有了接口就好办了,所有实现这个接口的类就都是servlet了,这个接口中只有5个方法,那么我们如果简单实现一下这5个方法,我们的类是不是就是servlet了?如果我们写的类严格按照servlet的规范来写,那么它肯定是了,但规范那么复杂,简单写一个怎么可能实现呢?只是从语法上可以说是servlet的实现,但却不合乎servlet的规范。
所以现在你已经明白了,servlet在我们应用中的本质就是一个具体的servlet接口的实现类,查一下jdk源码就可以发现官方已经有servlet的几个实现了。
tomcat和servlet是什么关系
上面我们已经讲清楚了什么是servlet
,那jboss
、tomcat
、springboot
和servlet
又有什么关系呢?
现在来思考2个问题:
- 如果我们有多个程序,每个程序中都有servlet,那么这些程序该怎么管理呢?
- 我们写程序的核心是处理业务上的逻辑,用户的请求怎么解析、安全问题怎么处理、怎么进行响应等等各种问题,如果在每个程序中都需要我们处理,那是不是太麻烦了?
当然还有很多其它原因,各种原因综合到一起,最终有了一个思路,那就是拆分,servlet的管理功能拆分出来,拆出来后的技术实现方案就是tomcat
、jboss
等,还有内置了tomcat
的springboot
。
提到了tomcat
,自然会有人想到nginx
,两者不都是web服务器吗?区别是什么呢?其实很简单,nginx
支持的是cgi
技术,是进程间的通信,所以在配置文件中经常可以看到fastcgi_
开头的各种配置,而tomcat
支持的是servlet
技术,是同一个进程内线程间的通信,所以tomcat
又常被叫做servlet容器,因为它能够包含很多servlet
服务。
springboot和tomcat又是什么关系
那springboot为什么要内嵌tomcat
呢?其实原因不难猜测,如果使用单独的tomcat
来进行开发与部署,那么就需要手动的配置tomcat
,更新代码时,需要打成war包,复制到tomcat指定的目录下,对开发来说不够友好,影响开发效率,在部署时,除了程序的包,还需要额外安装配置一个tomcat
,也太麻烦,所以最好的方案就是把tomcat
嵌入springboot
中。
它又是怎么内嵌进去的呢?其实也不难,tomcat
本质上是一个servlet容器
,它负责接收用户的请求,再找个空闲的线程,让线程去执行servlet
中我们写的业务逻辑即可。那么把tomcat
的代码拿过来,因为tomcat
本身就是java开发的,所以修改起来也相对简单一点,再与springboot的处理流程整合一下,就成内嵌的tomcat
了。
相信现在,你已经对servlet有了比较清晰的了解了吧!但是一个servlet怎么能够处理那么多不同的请求呢?想了解更多的相关技术,请微信搜索并关注 “五彩石编程”公众号,军哥的文章将会持续同步更新。
下课