05—tomcat & nginx

2021-03-14  本文已影响0人  安然在路上

Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器)

HTTP 服务器接收到请求之后把请求交给Servlet容器来处理,Servlet 容器通过Servlet接⼝调⽤业务类。Servlet接⼝和Servlet容器这⼀整套内容叫作Servlet规范。

注意:Tomcat既按照Servlet规范的要求去实现了Servlet容器,同时它也具有HTTP服务器的功能。

2.2 Tomcat Servlet容器处理流程

当⽤户请求某个URL资源时

1)HTTP服务器会把请求信息使⽤ServletRequest对象封装起来

2)进⼀步去调⽤Servlet容器中某个具体的Servlet

3)在 2)中,Servlet容器拿到请求后,根据URL和Servlet的映射关系,找到相应的Servet

4)如果Servlet还没有被加载,就⽤反射机制创建这个Servet,并调⽤Servlet的init⽅法来完成初始化

5)接着调⽤这个具体Servlet的service⽅法来处理请求,请求处理结果使⽤ServletResponse对象封装

6)把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端

2.3 Tomcat 系统总体架构

通过上⾯的讲解,我们发现tomcat有两个⾮常重要的功能需要完成

1)和客户端浏览器进⾏交互,进⾏socket通信,将字节流和Request/Response等对象进⾏转换

2)Servet容器处理业务逻辑

Tomcat 设计了两个核⼼组件连接器(Connector)和容器(Container)来完成 Tomcat 的两⼤核⼼功能。

连接器,负责对外交流:处理Socket连接,负责⽹络字节流与Request和Response对象的转化;

容器,负责内部处理:加载和管理Servlet,以及具体处理Request请求;

4.2 Servlet 容器 Catalina 的结构

可以认为整个Tomcat就是⼀个Catalina实例,Tomcat 启动的时候会初始化这个实例,Catalina实例通过加载server.xml完成其他实例的创建,创建并管理⼀个Server,Server创建并管理多个服务,

每个服务⼜可以有多个Connector和⼀个Container。

⼀个Catalina实例(容器)

⼀个 Server实例(容器)

多个Service实例(容器)

每个Service实例下可以有多个Connector实例和个Container实例

Catalina负责解析Tomcat的配置⽂件(server.xml) , 以此来创建服务器Server组件并进⾏管理

Server服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接器。Server通过实现Lifecycle接⼝,提供了⼀种优雅的启动和关闭整个系统的⽅式

Service服务是Server内部的组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个Container

Container容器,负责处理⽤户的servet请求,并返回对象给web⽤户的模块

##Tomcat 类加载机制剖析

- JVM 的类加载机制

JVM 的类加载机制中有⼀个⾮常重要的⻆⾊叫做类加载器(ClassLoader),类加载器有⾃⼰的体系,Jvm内置了⼏种类加载器,包括:引导类加载器、扩展类加载器、系统类加载器,他们之间形成⽗⼦关系,通过 Parent 属性来定义这种关系,最终可以形成树形结构。

1. 类加载器作⽤

引导启动类加载器BootstrapClassLoader

c++编写,加载java核⼼库 java.*,⽐如rt.jar中的类,构造ExtCassLoader和AppClassLoader

2. 扩展类加载器 ExtClassLoader

java编写,加载扩展库 JAVA_HOME/lib/ext⽬录下的jar中的类,如classpath中的jre ,javax.*或者java.ext.dir指定位置中的类

3. 系统类加载器

SystemClassLoader/AppClassLoader默认的类加载器,搜索环境变量 classpath 中指明的路径

- 双亲委派机制

当某个类加载器需要加载某个.class⽂件时,它⾸先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,⾃⼰才会去加载这个类。

双亲委派机制的作⽤:

防⽌重复加载同⼀个.cass。通过委托去向上⾯问⼀问,加载过了,就不⽤再加载⼀遍。保证数据保证核⼼.cass不能被篡改。通过委托⽅式,不会去篡改核⼼.class,即使篡改也不会去加载,即使加载也不会是同⼀个.cass对象了。不同的加载器加载同⼀个.class也不是同⼀个.class对象。这样保证了class执⾏安全(如果⼦类加载器先加载,那么我们可以写⼀些与java.ang包中基础类同名的类,然后再定义⼀个⼦类加载器,这样整个应⽤使⽤的基础类就都变成我们⾃⼰定义的类了。

##Tomcat 性能优化策略

系统性能的衡量指标,主要是响应时间和吞吐量。

1)响应时间:执⾏某个操作的耗时;

2) 吞吐量:系统在给定时间内能够⽀持的事务数量,单位为TPS(Transactions PerSecond的缩写,也就是事务数/秒,个事务是指个客户机向服务器发送请求然后服务器做出反应的过程。

Tomcat优化从两个⽅⾯进⾏

1)JVM虚拟机优化(优化内存模型)

2)Tomcat⾃身配置的优化(⽐如是否使⽤了共享线程池?IO模型?)

##Tomcat 性能优化策略

系统性能的衡量指标,主要是响应时间和吞吐量。

1)响应时间:执⾏某个操作的耗时;

2) 吞吐量:系统在给定时间内能够⽀持的事务数量,单位为TPS(Transactions PerSecond的缩写,也就是事务数/秒,个事务是指个客户机向服务器发送请求然后服务器做出反应的过程。

Tomcat优化从两个⽅⾯进⾏

1)JVM虚拟机优化(优化内存模型)

2)Tomcat⾃身配置的优化(⽐如是否使⽤了共享线程池?IO模型?)

- 虚拟机运⾏优化(参数调整)

Java 虚拟机的运⾏优化主要是内存分配和垃圾回收策略的优化:

内存直接影响服务的运⾏效率和吞吐量

垃圾回收机制会不同程度地导致程序运⾏中断(垃圾回收策略不同,垃圾回收次数和回收效率都是不同的)

jdk内存参数

- 垃圾回收(GC)策略

垃圾回收性能指标

吞吐量:⼯作时间(排除GC时间)占总时间的百分⽐,⼯作时间并不仅是程序运⾏的时间,还包含内存分配时间。

暂停时间:由垃圾回收导致的应⽤程序停⽌响应次数/时间。

垃圾收集器

串⾏收集器(Serial Collector)

单线程执⾏所有的垃圾回收⼯作,适⽤于单核CPU服务器

⼯作进程-----|(单线程)垃圾回收线程进⾏垃圾收集|---⼯作进程继续

并⾏收集器(Parale Collector)

⼯作进程-----|(多线程)垃圾回收线程进⾏垃圾收集|---⼯作进程继续

⼜称为吞吐量收集器(关注吞吐量),以并⾏的⽅式执⾏年轻代的垃圾回收,该⽅式可以显著降低垃圾回收的开销(指多条垃圾收集线程并⾏⼯作,但此时⽤户线程仍然处于等待状态)。适⽤于多处理器或多线程硬件上运⾏的数据量较⼤的应⽤

并发收集器(Concurrent Colector)

以并发的⽅式执⾏⼤部分垃圾回收⼯作,以缩短垃圾回收的暂停时间。适⽤于那些响应时间优先于吞吐量的应⽤,因为该收集器虽然最⼩化了暂停时间(指⽤户线程与垃圾收集线程同时执⾏,但不⼀定是并⾏的,可能会交替进⾏),但是会降低应⽤程序的性能

CMS收集器(Concurrent Mark Sweep Collector)

并发标记清除收集器,适⽤于那些更愿意缩短垃圾回收暂停时间并且负担的起与垃圾回收共享处理器资源的应⽤

G1收集器(Garbage-First Garbage Colector)

适⽤于⼤容量内存的多核服务器,可以在满⾜垃圾回收暂停时间⽬标的同时,以最⼤可能性实现⾼吞吐量(JDK1.7之后)

垃圾收集器

————————————————————Nginx分割线————————————————————

##使用场景:

- 反向代理

浏览器客户端发送请求到反向代理服务器(⽐如Nginx),由反向代理服务器选择原始服务器提供服务获取结果响应,最终再返回给客户端浏览器

- 负载均衡

当⼀个请求到来的时候,Nginx反向代理服务器根据请求去找到⼀个原始服务器来处理当前请求,那么这叫做反向代理。那么,如果⽬标服务器有多台,找哪⼀个⽬标服务器来处理当前请求呢,这样⼀个寻找确定的过程就叫做负载均衡。

###Nginx负载均衡策略###

1. 轮询

默认策略,每个请求按时间顺序逐分配到不同的服务器,如果某个服务器下线,能⾃动剔除

upstream lagouServer{

server 111.229.248.243:8080;

server 111.229.248.243:8082;

}

location /abc {

proxy_pass http://lagouServer/;

}

2. weight

weight代表权重,默认每⼀个负载的服务器都为1,权重越⾼那么被分配的请求越多(⽤于服务器性能不均衡的场景)

upstream lagouServer{

server 111.229.248.243:8080 weight=1;

server 111.229.248.243:8082 weight=2;

}

3. ip_hash

每个请求按照ip的hash结果分配,每⼀个客户端的请求会固定分配到同⼀个⽬标服务器处理,可以解决session问题

upstream lagouServer{

ip_hash;

server 111.229.248.243:8080;

server 111.229.248.243:8082;

}

- 动静分离

动静分离就是讲动态资源和静态资源的请求处理分配到不同的服务器上,⽐较经典的组合就是Nginx+Tomcat架构(Nginx处理静态资源请求,Tomcat处理动态资源请求)

## Nginx核⼼配置⽂件解读

Nginx的核⼼配置⽂件conf/nginx.conf包含三块内容:全局块、events块、http块

从配置⽂件开始到events块之间的内容,此处的配置影响nginx服务器整体的运⾏,⽐如worker进程的数量、错误⽇志的位置等

events块

events块主要影响nginx服务器与⽤户的⽹络连接,⽐如worker_connections 1024,标识每个workderprocess⽀持的最⼤连接数为1024

events块

http块

http块是配置最频繁的部分,虚拟主机的配置,监听端⼝的配置,请求转发、反向代理、负载均衡等

http块1 http块2 http块3

location 语法如下:

location [=~|~*^~] /uri/ { … }

在nginx配置⽂件中,location主要有这⼏种形式:

1)正则匹配 location ~ /lagou { }

2)不区分⼤⼩写的正则匹配 location ~* /lagou { }

3)匹配路径的前缀 location ^~ /lagou { }

4)精确匹配 location = /lagou { }

5)普通路径前缀匹配 location /lagou { }

优先级

4 > 3 > 2 > 1 > 5

##作业

图文并茂的地细描述Tomcat的体系结构:

从总体上,tomcat由http服务器和Servlet容器构成

tomcat

http服务器负责和客户端浏览器交互,进行socket通信,将请求封装为ServletRequest对象,进一步去调用Servlet容器中某个具体的Servlet。也可以称为连接器(connector)

connector和container

可以认为整个Tomcat就是⼀个Catalina实例, Tomcat 启动的时候会初始化这个实例, Catalina实例通过加载server.xml完成其他实例的创建,创建并管理⼀个Server, Server创建并管理多个服务,每个服务⼜可以有多个Connector和⼀个Container。

container

####Container 组件的具体结构

Container组件下有⼏种具体的组件,分别是Engine、 Host、 Context和Wrapper。这4种组件(容器)是⽗⼦关系。Tomcat通过⼀种分层的架构,使得Servlet容器具有很好的灵活性。体现在conf/server.xml中

- Engine

表示整个Catalina的Servlet引擎,⽤来管理多个虚拟站点,⼀个Service最多只能有⼀个Engine,但是⼀个引擎可含多个Host

- Host

代表⼀个虚拟主机,或者说⼀个站点,可以给Tomcat配置多个虚拟主机地址,⽽⼀个虚拟主机下可包含多个ontext

- Context

表示⼀个Web应⽤程序, ⼀个Web应⽤可包含多个Wrapper

- Wrapper

表示⼀个Servlet, Wrapper 作为容器中的最底层,不能包含⼦容器

附录:

tomcat 的mapper体系结构:

1. https://blog.csdn.net/NaShiYu/article/details/111773908

2. http://www.voidcn.com/article/p-hjydoatc-xp.html

上一篇 下一篇

猜你喜欢

热点阅读