在介绍Tomcat之前,我们先介绍一个概念Servlet。

Servlet是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议。从下图可以看出Servlet依托于容器运行和提供服务,这类容器称为Servlet容器,Tomcat就是一个Servlet容器。

图中请求在Servlet内完成处理并返回结果,此处可以看出Servlet是服务器端接收外部请求的入口,后端所有的与网页请求有关的业务逻辑均由此引出。

Tomcat调用Servlet的流程如下:

1. Tomcat接收请求,由于可能存在多个客户端同时发起请求,所以Tomcat要能够处理并发请求,那么就需要多线程。

Tomcat 默认配置的最大请求数是150,可以自行设置该参数,操作系统对于进程中的线程数有一定的限制:Windows 每个进程中的线程数不允许超过2000,Linux 每个进程中的线程数不允许超过1000,一般在应用超过250个并发时,建议配置集群服务。

2. Tomcat根据接收的请求,寻找到对应的Servlet。由于所有的资源都存放在Tomcat中,在对项目进行加载时Tomcat内部会建立Servlet对象和类所在地址的映射关系,根据映射关系获取到确定的servlet。

3. Tomcat调用Servlet完成请求----响应的业务实现。Tomcat不能预知客户端会访问哪一个Servlet,所以Tomcat需要动态地调用Servlet对象,底层实现依托Java反射机制,最后调用具体的Servlet执行get或post方法并响应客户端。

结合上述过程,简要介绍下Servlet的生命周期:

用户第一次访问Servlet的时候,服务器Tomcat会创建一个Servlet的实例那么Servlet中init方法就会执行。任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法。在service方法内部根据请求的方式的不同调用doGet或doPost方法。当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行。

最后讨论一个问题,Tomcat接收请求的过程是怎样的?

1. 服务器端监听一个端口,比如8080,然后等待请求。

2. 客户端也就是浏览器由socket套接字发起请求,然后建立连接,此处为建立TCP连接。

3. 客户端就开始向服务器端发送http请求,http请求携带请求数据。

4. 服务器端读到请求数据就开始处理请求,处理完了后给客户端响应数据并回到读请求的状态。

5. 客户端接收到服务器端响应的数据后客户端会展示数据,并回到发送请求的状态。

顺便讨论一个连接的问题,如果上述请求过程结束后,客户端这个http请求并没有回到发送请求的状态,而是直接销毁,下次请求时需重新建立新的连接,这个连接就是短连接,否则就是长连接。http1.0协议是短连接,http1.1开始支持长连接。

引入一个新概念,何为socket套接字?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

Tomcat----服务运行的容器的更多相关文章

  1. 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序

    小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...

  2. 解决一台机器同时运行多个Tomcat服务

    http://www.cnblogs.com/itolssy/archive/2008/09/09/1278041.html 如果不加任何修改,在一台服务器上同时运行两个Tomcat服务显然会发生端口 ...

  3. CVE-2016-1240 Tomcat 服务本地提权漏洞

    catalogue . 漏洞背景 . 影响范围 . 漏洞原理 . 漏洞PoC . 修复方案 1. 漏洞背景 Tomcat是个运行在Apache上的应用服务器,支持运行Servlet/JSP应用程序的容 ...

  4. how tomcat works 五 servlet容器 上

    servlet容器是用来处理请求servlet资源,并为Web客户端填充response对象的模块.在上一篇文章(也就是书的第四章)我们设计了SimpleContainer类,让他实现Containe ...

  5. dubbo服务运行的三种方式

    dubbo服务运行,也就是让生产服务的进程一直启动.如果生产者进程挂掉,也就不存在生产者,消费者不能进行消费. Dubbo服务运行的三种方式如下:1.使用Servlet容器运行(Tomcat.Jett ...

  6. Tomcat服务的安装与配置

    介绍 百度百科 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开 ...

  7. 浅谈微服务架构、容器技术与K8S

    关注嘉为科技,获取运维新知 企业应用系统:从单体应用走向微服务架构:从裸金属走向容器. 如果在诸多热门云计算技术诸如容器.微服务.DevOps.OpenStack等之中,找出一个最火的方向,那么可能非 ...

  8. CentOS 7 Tomcat服务的安装与配置

    3422人阅读  http://blog.51cto.com/13525470/2073657 一.Linux下的Java运行环境 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由S ...

  9. 唯品会RPC服务框架与容器化演进--转

    原文地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=405781868&idx=1&sn=cbb10d37e25 ...

  10. Tomcat是一个Servlet容器?

    "Tomcat是一个Servlet容器",这句话对于2019年的程序员应该是耳熟能详的. 单纯的思考一下这句话,我们可以抽象出来这么一段代码: class Tomcat { Lis ...

随机推荐

  1. centos7最小安装怎么安装防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,需要事先关闭. 关闭firewall: 1 2 3 systemctl stop firewalld.service systemctl d ...

  2. scala简单学习---1

    :paste //进入代码块模式 :quit //退出scala编程 安装方面: 版本:scala-2.12.4.msi 环境变量: %SCALA_HOME%\bin;%SCALA_HOME%\jre ...

  3. 学一学Transfomer

    017年,Google发表论文<Attention is All You Need>,提出经典网络结构Transformer,全部采用Attention结构的方式,代替了传统的Encode ...

  4. mysql RPM 包比较全的网站

    https://pkgs.org/download/mysql-devel https://pkgs.org/download/mysql-server https://pkgs.org/downlo ...

  5. Server2008实验——私钥和添加数据恢复代理程序

    导出和安装私钥 当一个用户加密一个文件的时候,生成证书,拥有证书的私钥的用户才能够解开这个加密文件:为了防止私钥丢失导致加密文件不可打开,可以导出私钥给同一个用户组的用户帮忙打开: 1.创建[xl]和 ...

  6. ASP.NET Core 入门笔记4,ASP.NET Core MVC路由入门

    敲了一部分,懒得全部敲完,直接复制大佬的博客了,如有侵权,请通知我尽快删除修改 摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc ...

  7. 架构模式: Saga

    架构模式: Saga 上下文 您已应用每服务数据库模式.每个服务都有自己的数据库.但是,某些业务事务跨越多个服务,因此您需要一种机制来确保服务之间的数据一致性.例如,假设您正在建立一个客户有信用额度的 ...

  8. bug解决思路——插入数据时,前台不展示数据

    积攒一下平时解决bug时的思路,以后若是一头乱麻时翻出来看看~ 一个bug五一之前就和现场在定位,直到今天才算是定位到问题. 所有bug,还是得重现出来才可以发现问题.现场说登记记录时数据没在前台展示 ...

  9. python中 __file__的小坑坑

    在python脚本中,我们难免会需要用到自身文件所在的绝对路径,第一想法可能就是用os.path.dirname(__file__) 但是这里有个大坑,我就踩了,这种方式得到路径会出现问题,脚本执行报 ...

  10. Oracle-DQL 6- 子查询

    子查询: --查询emp表中工资高于allen的员工信息SELECT sal FROM empWHERE ename = 'ALLEN'; SELECT * FROM empWHERE sal > ...