Java进阶教程Tomcat核心原理解析
2024-05-24 16:17:30 0 举报
AI智能生成
Java进阶教程Tomcat核心原理解析
作者其他创作
大纲/内容
B/S
C/S
软件架构
静态资源
动态资源
资源分类
传输协议
ip
端口
网络通信三要素
服务器
服务器软件
web服务器软件
服务器概念
webLogic 收费
webSphere 收费
JBOSS 收费
Tomcat 开源&免费
常见web服务器软件
下载->解压
tomcat软件安装
startup.sh 启动(前置条件:jdk已经安装)
shutdown.sh 关闭tomcat(或者直接kill进程)
bin 执行文件
logging.properties 日志配置文件
server.xml tomcat服务器核心配置信息,包括端口号等
tomcat-user.xml tomcat用户及角色信息配置
web.xml tomcat中所有应用默认的部署描述文件,主要定义基础的selvet和mine映射
Cataline 用于存储针对每个虚拟机的Context配置
context.xml 用于定义所有web应用均需加载的Context配置,如果web应用制定了自己的context.xml,则该文件被覆盖
catalina.properties Tomcat的环境变量配置
catalina.policy tomcat运行的安全策略配置
conf 存放tomcat的相关配置文件
lib tomcat依赖的jar包
logs 默认日志存放目录
webapps tomcat默认的web应用部署目录
work 应用jsp代码生成和编码的临时目录
tomcat目录
https://mp.csdn.net/mp_blog/creation/success/139168049
tomcat源码的下载、部署、运行
基本概念
http工作原理
1、为了http服务器与业务的解耦,在http服务器与业务中间添加servlet容器,这样servlet容器负责解耦http请求,并将请求转发至具体的业务类2、业务类都必须实现servlet接口,这个是serlvet的规范
servlet容器工作流程
Coyote
连接器:处理Socket连接,负责网络字节流与Request和Response对象的转化
容器:加载和管理Servlet,以及具体处理Request请求
重点:连接器、容器一个应用服务器里面,必须存在连接器及容器才能对外提供服务,一个容器可以对应多个连接器
tomcat整体架构
NIO(默认采用的I/O模型):非阻塞I/O,采用java NIO类库实现
APR:采用apache可移植运行库实现,是C/C++编写的本地库,如果选择该方案,需要安装独立的APR库
BIO 8.5版本起,tomcat移除了BIO支持
tomcat支持的I/O模型
HTTP/1.1
AJP
HTTP/2
tomcat支持的应用层协议
tomcat模块分层图
EndPoint: Coyote 通信端点,即通信监听的接口,是具体Socket接收和发送处理 器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。(用来实现TCP/IP协议的,处理用户的socket请求)Processor:Coyote 协议处理接口 ,如果说EndPoint是用来实现TCP/IP协议的,那么 Processor用来实现HTTP协议,Processor接收来自EndPoint的Socket,读取字节流解 析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理, Processor是对应用层协议的抽象Adapter适配器(适配器模式):将request对象转化为servletRequest对象
连接器组件
组件 职责---------------------------------------Catalina : 负责解析Tomcat的配置文件,以此来创建服务器Server组件,并根据命令来对其进行管理Server : 服务器表示整个CatalinaServlet容器以及其它组件,负责组装并启动Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了一种优雅的启动和关闭整个系统的方式Service : 服务是Server内部的组件,一个Server包含多个Service。它将若干个Connector组件绑定到一个Container(Engine)上Connector : 连接器,处理与客户端的通信,它负责接收客户请求,然后转给相关的容器处理,最后向客户返回响应结果Container : 容器, 负责处理用户的servlet请求,并返回对象给web用户的模块
Catalina结构(容器结构)Catalina负责管理Server,而Server表示着整个服务器。Server下面有多个 服务Service,每个服务都包含着多个连接器组件Connector(Coyote 实现)和一个容器 组件Container。在Tomcat 启动的时候, 会初始化一个Catalina的实例。一个service包含多个连接器及一个servlet容器
容器 描述-------------------------Engine :表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service 最多只能有一个Engine,但是一个引擎可包含多个HostHost :代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主 机地址,而一个虚拟主机下可包含多个ContextContext :表示一个Web应用程序, 一个Web应用可包含多个WrapperWrapper :表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器
Catalina结构
线上配置
server.xml配置结构
容器/Catalina
tomcat启动流程
默认实现上面我们提到的Server、Service、Engine、Host、Context都是接口, 上图中罗列了这 些接口的默认实现类。当前对于 Endpoint组件来说,在Tomcat中没有对应的Endpoint 接口, 但是有一个抽象类 AbstractEndpoint ,其下有三个实现类: NioEndpoint、 Nio2Endpoint、AprEndpoint , 这三个实现类,分别对应于前面讲解链接器 Coyote 时, 提到的链接器支持的三种IO模型:NIO,NIO2,APR , Tomcat8.5版本中,默认采 用的是 NioEndpoint。
由于所有的组件均存在初始化、启动、停止等生命周期方法,拥有生命周期管理的特 性, 所以Tomcat在设计的时候, 基于生命周期管理抽象成了一个接口 Lifecycle ,而组 件 Server、Service、Container、Executor、Connector 组件 , 都实现了一个生命周期 的接口,从而具有了以下生命周期中的核心方法:1) init():初始化组件2) start():启动组件3) stop():停止组件4) destroy():销毁组件
Lifecycle接口及实现类
Tomcat架构
请求流程Tomcat是用Mapper组件来完成这个任务的。 Mapper组件的功能就是将用户请求的URL定位到一个Servlet,它的工作原理是: Mapper组件里保存了Web应用的配置信息,其实就是容器组件与访问路径的映射关系, 比如Host容器里配置的域名、Context容器里的Web应用路径,以及Wrapper容器里 Servlet映射的路径,你可以想象这些配置信息就是一个多层次的Map。一个请求URL最后只会定位到一个 Wrapper容器,也就是一个Servlet
步骤如下:1) Connector组件Endpoint中的Acceptor监听客户端套接字连接并接收Socket。2) 将连接交给线程池Executor处理,开始执行请求响应任务。3) Processor组件读取消息报文,解析请求行、请求体、请求头,封装成Request对象。4) Mapper组件根据请求行的URL值和请求头的Host值匹配由哪个Host容器、Context容器、Wrapper容器处理请求。5) CoyoteAdaptor组件负责将Connector组件和Engine容器关联起来,把生成的 Request对象和响应对象Response传递到Engine容器中,调用Pipeline。6) Engine容器的管道开始处理,管道中包含若干个Valve、每个Valve负责部分处理逻 辑。执行完Valve后会执行基础的 Valve–StandardEngineValve,负责调用Host容器的 Pipeline。7) Host容器的管道开始处理,流程类似,最后执行 Context容器的Pipeline。8) Context容器的管道开始处理,流程类似,最后执行 Wrapper容器的Pipeline。9) Wrapper容器的管道开始处理,流程类似,最后执行 Wrapper容器对应的Servlet对象 的 处理方法。
Tomcat请求处理流程
Listener:默认配置的5个Listener 的含义
GlobalNamingResources
Executor:默认情况下,Service 并未添加共享线程池配置。 如果我们想添加一个线程池,如上
通过给Host添加别名,我们可以实现同一个Host拥有多个网络名称
配置2个域名
Context:用于配置一个Web应用可以直接在浏览器中 访问文本文件1) docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于 Host appBase的相对路径。2) path:Web应用的Context 路径。如果我们Host名为localhost, 则该web应用访问 的根路径为: http://localhost:8080/myApp。 它支持的内嵌元素为:CookieProcessor, Loader, Manager,Realm,Resources, WatchedResource,JarScanner,Valve。
子主题
Host:用于配置一个虚拟主机, 它支持以下嵌入元素:Alias、Cluster、Listener、 Valve、Realm、Context属性说明:1) name: 当前Host通用的网络名称, 必须与DNS服务器上的注册信息一致。 Engine中 包含的Host必须存在一个名称与Engine的defaultHost设置一致。2) appBase: 当前Host的应用基础目录, 当前Host上部署的Web应用均在该目录下 (可以是绝对目录,相对路径)。默认为webapps。3) unpackWARs: 设置为true, Host在启动时会将appBase目录下war包解压为目 录。设置为false, Host将直接从war文件启动。4) autoDeploy: 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应 用。
Engine:作为Servlet 引擎的顶级元素,内部可以嵌入: Cluster、Listener、Realm、 Valve和Host属性说明:1) name: 用于指定Engine 的名称, 默认为Catalina 。该名称会影响一部分Tomcat的 存储路径(如临时文件)。2) defaultHost : 默认使用的虚拟主机名称, 当客户端请求指向的主机无效时, 将交 由默认的虚拟主机处理, 默认为localhost。
Service:该元素用于创建 Service 实例,默认用org.apache.catalina.core.StandardService。 默认情况下,Tomcat 仅指定了Service 的名称, 值为 “Catalina”。Service 可以内嵌的 元素为 : Listener、Executor、Connector、Engine
port : Tomcat 监听的关闭服务器的端口。shutdown: 关闭服务器的指令字符串。Server内嵌的子元素为 Listener、GlobalNamingResources、Service。
server.xml
tomcat-user.xml
Tomcat服务器配置
ServletContext 初始化参数
会话配置:session
Servlet配置
Listener配置:监听器
Filter配置:过滤器
欢迎页面配置
错误页面配置
Web应用配置
Tomcat管理
-Xms: 初始堆大小-Xmx: 最大堆大小-Xmn: 年轻代大小-XX:+PrintGCDetails 打印gc日志详情-XX:SurvivorRatio=8 eden与survivor的比例,当为8的时候,eden占年轻代的80%,survivor区总的占20%,但survivor区要再分成两个survivor,所以,survivor大小为10%-XX:MinHeapFreeRatio=minimum 堆中最小空闲大小的比例-XX:MaxHeapFreeRatio=maximum 堆中最大空闲大小的比例-XX:NewRatio=ratio 年轻代与老年代的比例关系,但要注意的是,默认情况下为2,即老年代占2/3,年轻代占1/3-XX:NewSize=size 新生代最小值-XX:MaxNewSize=size 新生代最大值-XX:+AggressiveHeap
JVM配置
1) 删除webapps目录下的所有文件,禁用tomcat管理界面;2) 注释或删除tomcat-users.xml文件内的所有用户权限3) 更改关闭tomcat指令或禁用; tomcat的server.xml中定义了可以直接关闭 Tomcat 实例的管理端口(默认8005)。 可以通过 telnet 连接上该端口之后,输入 SHUTDOWN (此为默认关闭指令)即可关闭 Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。由于默认关闭 Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。4)定义错误页面 在webapps/ROOT目录下定义错误页面 404.html,500.html; 然后在tomcat/conf/web.xml中进行配置
配置安全
应用安全
传输安全:https
Tomcat安全
Java进阶教程Tomcat核心原理解析
0 条评论
回复 删除
下一页