课工场 > 文章 >新专栏 > 服务器为啥是只猫?
服务器为啥是只猫?
陈燕 | 2021-02-22 15:45:58
928

作为一个web开发者,自打进入这一行,每天接触最多的可能就是服务器了,每天最多的操作可能就是启动服务器,关掉服务器,各种测试操作。

作为一个web开发者,自打进入这一行,每天接触最多的可能就是服务器了,每天最多的操作可能就是启动服务器,关掉服务器,各种测试操作。


很多时候,对它是又爱又恨,爱的是它确实是我们做web开发必不可少的东西,而且很优秀;恨的是,每天都要经常启动,停止;不厌其烦的操作。


虽然我们每天都在使用Tomcat服务器,大家就是知道这是一个很好用的服务器,但是我猜很多开发者肯能并不一定清楚的它的来历,也未必对它的原理有过研究。


提到Tomcat,大家可能最先想到的就是一只可爱的小猫咪,但是你没有想过,这个为什么一个服务器会和一致可爱的小猫咪联系在一起呢,好像八竿子也打不着的亲戚,所以,今天咱们就来了解下Tomcat的前世今生......


image.png


· Tomcat的由来


Tomcat 服务器是一个免费的开放源的Web应用服务器,属于轻量级应用服务器,广泛应用于web开发,深受广大开发者喜爱,是目前比较流行的Web应用服务器。


Tomcat是Apache 软件基金会(ApacheSoftwareFoundation)的一个核心项目,Tomcat最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发的,并由Sun贡献给Apache软件基金会。Apache Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的ServletJSP规范总是能在Tomcat中得到体现。


但是人们不禁对这个Tomcat和小猫咪的关系感到好奇,Tomcat的这个单词是“公猫/野猫”的意思,因为它的开发者姆斯·邓肯·戴维森希望用一种能够自己照顾自己的动物代表这个软件,于是命名为tomcat,它的Logo兼吉祥物也被设计成了一只公猫形象。还有就是,具说姆斯·邓肯·戴维森在撸代码的时候,他养的小猫总是在他的键盘上跳来跳去,所有就多种因素在一起,就有了今天的Tomcat.


但其实,在Tomcat里还有另外一些有意思的故事,比如Tomcat中最核心的模块Servlet,在它的作者开发这个模块的时候,就给他起了听上去都很美的名字Catalina,这个单词的意思是“卡特琳娜”,没错,它就是一个连作者自己的都没去过的美丽的小岛,果然得不到的永远在骚动~~~


好了,关于Tomcat的由来的故事基本就这么多吧,感觉还是跟很多软件的故事类似,要么起个地名,要么起个动物名。


image.png


· Tomcat的原理


Tomcat 作为一个Http服务器 +Servlet容器,屏蔽了很多应用层协议和网络通信细节,给我们的是标准的Request和 Response对象,当我们在使用SpringMVC之类的框架的时候,从来都不考虑一个请求的具体的实现细节,就是因为 Tomcat已经为我们做好了这些,我们只需要关注每个请求的具体业务逻辑。


说到这些实现细节,可是复杂了,我们先从整体整体架构上来看下Tomcat的总体结构。


image.png


从上图中可以看出 Tomcat有很多组件,但是比较核心的是Connector和Container两个组件,这两个组件分别控制着Tomcat于外界的联系,一个控制着Tomcat的生命周期。

  • Connector(连接器) :Tomcat 与外部世界的连接器,监听固定端口接收外部请求,传递给 Container,并 将 Container 处理的结果返回给外部

  • Container(容器):Catalina,Servlet 容器,内部有多层容器组成,用于管理 Servlet 生命周期,调用 servlet 相关方法

  • Server(服务器):代表Tomcat本身,用来接收客户端发请求数据并进行解析,启动service并监听端口等

  • Service(服务器):它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收

  • Engine(引擎):表示可运行的Catalina的servlet引擎实例,负责请求 的处理。

  • Context(上下文容器):也可以看成Web应用。Context上下文代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,它表示Web应用程序本身

  • Host(虚拟主机):是web应用容器或者是Tomcat中所说的上下文虚拟主机

  • Wrapper(包装器):表示一个单独的servlet,负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收


· Tomcat的处理流程


说完了Tomcat的核心组件,我们再来看下Tomcat的处理流程,当一个请求过来之后,Tomcat是怎么处理的,我们上面介绍到的这些组件优势怎么发挥作用的,我们先来看一张图。


image.png


  1. 用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得

  2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应

  3. Engine获得请求localhost/index.jsp,匹配所有的虚拟主机Host

  4. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)

  5. path=“/”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet, 对应于JspServlet类

  6. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost(),执行业务逻辑、数据存储等程序

  7. Context把执行完之后的HttpServletResponse对象返回给Host

  8. Host把HttpServletResponse对象返回给Engine

  9. Engine把HttpServletResponse对象返回Connector

  10. Connector把HttpServletResponse对象返回给客户Browser

最终将处理后的结果,渲染之后返回给浏览器,这样一个请求就算完成啦!


image.png


栏目分类
关闭
关闭

了解
畅学卡

手机端
学习