Tomcat
文章平均质量分 82
JavaEdge.
关注并私信我,获取更多大厂求职经验。《编程严选网》创始人
展开
-
自定义Filter后,我的业务代码怎么被执行了多次?
实际生产过程中,若要求构建的过滤器针对全局路径有效,且无任何特殊需求(主要针对 Servlet 3.0 的一些异步特性支持),则完全可直接使用 Filter 接口(或继承 Spring 对 Filter 接口的包装类 OncePerRequestFilter),并使用**@Component** 将其包装为 Spring 中的普通 Bean,也可达到预期需求。不过不管使用哪种方式,可能都遇到问题:业务代码重复执行多次。这里以 @Component + Filter 接口实现方式呈现案例。创建一SB应用原创 2023-01-22 23:03:34 · 1973 阅读 · 1 评论 -
Tomcat组件化设计
Web容器为了支持这种组件化设计,遵循了一些规范,比如面向接口编程,用“管理者”去组装这些组件,用反射的方式动态的创建组件、统一管理组件的生命周期,并且给组件生命状态的变化提供了扩展点,组件的具体实现一般遵循骨架抽象类和模板模式。原创 2022-12-12 16:55:52 · 282 阅读 · 0 评论 -
HttpServlet为什么要实现serializable?
HttpServlet为什么要实现serializable?在什么情况下,servlet会被序列化?如果未显示定义serialVersionUID,系统会用什么算法给指定一个?Serializable是可序列化。简单点将,就是实现了这个接口后,实例就可以转化为数据流了。...原创 2021-10-31 16:43:32 · 928 阅读 · 0 评论 -
Servlet实例数量到底多少,是否线程安全
通过注解或servlet声明都能控制 servlet 容器如何提供 servlet 实例。对于非分布式(默认)的 servlet,servlet 容器对于每个 Servlet 声明必须且只能产生一个实例。但若 Servlet 实现了 SingleThreadModel 接口,servlet 容器可选择实例化多个实例以便:处理高负荷请求或串行化请求到一个特定实例若 servlet 部署分布式环境,容器可为每个JVM的每个 Servlet 声明产生一个实例。但若在分布式环境中 servlet 实现原创 2021-10-29 19:35:06 · 3538 阅读 · 0 评论 -
Servlet的生命周期
Servlet从创建直到毁灭的整个过程:Servlet 初始化后调用 init () 方法Servlet 调用 service() 方法来处理客户端的请求Servlet 销毁前调用 destroy() 方法最后,Servlet 是由 JVM 的垃圾回收器进行GCinit()只调用一次。在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化。Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet原创 2021-10-29 17:25:34 · 994 阅读 · 0 评论 -
Tomcat是如何修正JDK原生线程池bug的?
程序运行的本质,就是使用系统资源(CPU、内存、网络、磁盘等)完成信息的处理。比如在JVM中创建一个对象实例需要CPU和内存资源,如需频繁创建大量对象,并且这些对象存活时间短,就需要频繁销毁,很可能这部分代码会成为性能瓶颈。“池”就是用来解决这问题。对象池就是把用过的对象保存起来,等下次需要这种对象时,直接从对象池中拿出来复用,避免频繁创建和销毁。JDK中提供了线程池的默认实现,我们也可以通过扩展Java原生线程池来实现自己的线程池。为提高处理能力和并发度,Web容器一般会把处理请求的工作放到线程池,原创 2021-08-18 12:09:03 · 1414 阅读 · 2 评论 -
Tomcat进程占用CPU过高怎么办?
CPU经常会成为系统性能的瓶颈,可能:内存泄露导致频繁GC,进而引起CPU使用率过高代码Bug创建了大量的线程,导致CPU频繁上下文切换通常所说的CPU使用率过高,隐含着一个用来比较高与低的基准值,比如JVM在峰值负载下的平均CPU利用率40%CPU使用率飙到80%就可认为不正常JVM进程包含多个Java线程:一些在等待工作另一些则正在执行任务最重要的是找到哪些线程在消耗CPU,通过线程栈定位到问题代码如果没有找到个别线程的CPU使用率特别高,考虑是否线程上下文切换导致了CP原创 2021-08-02 20:44:56 · 8757 阅读 · 22 评论 -
Tomcat各种网络异常场景解决方案及优化
Java Socket网络编程常见的异常有哪些,然后通过一个实验来重现其中的Connection reset异常,并且通过配置Tomcat的参数来解决这个问题。异常场景java.net.SocketTimeoutException超时异常,超时分为连接超时在调用Socket.connect方法的时候超时,大多因为网络不稳定读取超时调用Socket.read方法时超时。不一定是因为网络延迟,很可能下游服务的响应时间过长java.net.BindException: Address alre原创 2021-08-01 21:55:38 · 3010 阅读 · 6 评论 -
Tomcat性能调优
由于Web应用程序跑在Tomcat工作线程,因此Web应用对请求的处理时间也直接影响Tomcat性能,而Tomcat和Web应用在运行过程中所用到的资源都来自os,因此调优需要将服务端看作是一个整体来考虑。I/O调优指选择NIO、NIO.2还是APR线程池调优指的是给Tomcat的线程池设置合适的参数,使得Tomcat能够又快又好地处理请求I/O模型I/O调优实际上是连接器类型的选择,一般情况下默认都是NIO,在绝大多数情况下都是够用的。APR除非你的Web应用用到了TLS加密传输,而且对性原创 2021-08-01 18:50:32 · 2583 阅读 · 6 评论 -
Spring Boot如何启动嵌入式Tomcat?
Spring Boot在内部启动了一个嵌入式Web容器。Tomcat是组件化设计,所以就是启动这些组件。Tomcat独立部署模式是通过startup脚本启动,Tomcat中的Bootstrap和Catalina会负责初始化类加载器,并解析server.xml和启动这些组件。内嵌模式,Bootstrap和Catalina的工作由Spring Boot代劳,Spring Boot调用Tomcat API启动这些组件。Spring Boot中Web容器相关接口WebServer为支持各种Web容器原创 2021-07-31 18:40:13 · 1887 阅读 · 1 评论 -
Tomcat对异步Servlet的支持
线程分类Tomcat启动的线程和Web应用本身启动的线程:Tomcat线程池中的线程会调用Servlet#service,叫Tomcat线程Web程序在service方法的实现里启动的新线程,叫Web应用线程当一个新请求到达,Tomcat会从线程池取一个线程处理,该线程会调用你的Web应用,Web应用在处理请求过程中,Tomcat线程会一直阻塞,直到Web应用处理完,才输出响应,最后Tomcat回收该线程。假如Web应用需很长时间处理一个请求(比如DB查询或等待下游的服务调用返回),则Tomc原创 2021-07-31 01:15:11 · 1631 阅读 · 1 评论 -
Tomcat对Servlet规范的Filter及Listener实现
加载Servlet的类不等于创建Servlet实例,Tomcat先加载Servlet的类,然后还得在Java堆创建Servlet实例。一个Web应用里往往有多个Servlet,而在Tomcat中一个Web应用对应一个Context容器,即一个Context容器需管理多个Servlet实例。但Context容器并不直接持有Servlet实例,而是通过子容器Wrapper管理Servlet,可以把Wrapper容器看作Servlet的包装。为何需要Wrapper?Context容器直接维护一个Servl原创 2021-07-31 00:40:47 · 1366 阅读 · 2 评论 -
Tomcat如何打破双亲委派机制实现隔离Web应用的?
Tomcat通过自定义类加载器WebAppClassLoader打破双亲委托,即重写了JVM的类加载器ClassLoader的findClass方法和loadClass方法,这样做的目的是优先加载Web应用目录下的类。除此之外,你觉得Tomcat的类加载器还需要完成哪些需求呢?或者说在设计上还需要考虑哪些方面?我们知道,Tomcat作为Servlet容器,它负责加载我们的Servlet类,此外它还负责加载Servlet所依赖的JAR包。并且Tomcat本身也是一个Java程序,因此它需要加载自己的类和依赖原创 2021-07-30 21:55:17 · 3863 阅读 · 11 评论 -
Tomcat如何打破双亲委托机制?
我们经常会遇到ClassNotFound异常,表明JVM在尝试加载某类时失败了。要解决这个异常,你得知道什么是类加载JVM如何加载类为什么会出现ClassNotFound想想Tomcat又是如何加载和管理Web应用下的Servlet呢?Tomcat正是通过Context组件来加载管理Web应用的,所以今天我会详细分析Tomcat的类加载机制。但在这之前,我们有必要预习一下JVM的类加载机制,我会先回答一下一开始抛出来的问题,接着再谈谈Tomcat的类加载器如何打破Java的双亲委托机制。J原创 2021-07-29 01:27:54 · 1191 阅读 · 0 评论 -
Tomcat实现热部署、热加载原理解析
要在运行的过程中升级Web应用,如果你不想重启系统,实现的方式有两种:热加载和热部署。如何实现热部署、热加载?跟类加载机制有关。热加载的实现方式是Web容器启动一个后台线程,定期检测类文件变化。若有变化,就重新加载类,在这个过程中不会清空Session ,一般用在开发环境。热部署类似,也由后台线程定时检测Web应用变化,但它会重新加载整个Web应用。这会清空Session,比热加载更干净、彻底,一般用在生产环境。Tomcat实现热加载、热部署Tomcat通过开启后台线程,使得各个层次的容器组件原创 2021-07-29 00:47:27 · 1700 阅读 · 1 评论 -
Nio2Endpoint组件:Tomcat如何实现异步I/O?
NIO是同步非阻塞,NIO已经足够好了,Java为什么还要NIO.2呢?NIO和NIO.2最大的区别?一个是同步一个是异步。而异步最大特点是,应用程序无需自己触发数据从内核空间到用户空间的拷贝。为何是应用程序去“触发”数据拷贝,而非直接从内核拷贝数据?应用程序无法访问内核空间,数据拷贝必须由内核负责,问题是谁来触发?内核主动将数据拷贝到用户空间并通知应用程序还是等待应用程序通过Selector来查询,当数据就绪后,应用程序再发起一个read调用,这时内核再把数据从内核空间拷贝到用户空间原创 2021-07-27 22:24:17 · 1687 阅读 · 4 评论 -
【大厂求职必看】太强了!Tomcat线程模型全网最清晰讲解!
UNIX系统的I/O模型同步阻塞I/O、同步非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O。什么是 I/O就是计算机内存与外部设备之间拷贝数据的过程。为什么需要 I/OCPU访问内存的速度远远高于外部设备,因此CPU是先把外部设备的数据读到内存里,然后再进行处理。当你的程序通过CPU向外部设备发出一个读指令,数据从外部设备拷贝到内存需要一段时间,这时CPU没事干,你的程序是:主动把CPU让给别人还是让CPU不停查:数据到了吗?数据到了吗?…这就是I/O模型要解决的问题。Ja原创 2021-07-26 16:48:22 · 3285 阅读 · 10 评论 -
Jetty架构设计之Connector、Handler组件
Jetty是Eclipse基金会的一个开源项目,和Tomcat一样,Jetty也是一个“HTTP服务器 + Servlet容器”,并且Jetty和Tomcat在架构设计上有不少相似的地方。但同时Jetty也有自己的特点,主要是更加小巧,更易于定制化。Jetty作为一名后起之秀,应用范围也越来越广,比如Google App Engine就采用了Jetty来作为Web容器。Jetty整体架构Jetty Server:多个Connector(连接器)、多个Handler(处理器),以及一个线程池Jetty原创 2021-07-24 17:58:15 · 1952 阅读 · 6 评论 -
Tomcat的各级容器们的职责
通过Tomcat的/bin目录下的脚本startup.sh来启动Tomcat,那你是否知道我们执行了这个脚本后发生了什么呢?Tomcat也是是一个Java程序,因此startup.sh脚本会启动一个JVM运行Tomcat的启动类BootstrapBootstrap主要负责初始化Tomcat的类加载器,并创建CatalinaCatalina是个启动类,它通过解析server.xml、创建相应组件,并调用Server#startServer组件负责管理Service组件,会调用Service的sta原创 2021-07-21 13:47:07 · 1321 阅读 · 6 评论 -
Tomcat的生命周期管理
Tomcat组件之间的静态关系虚线表示一个请求在Tomcat中的流转若想让一个系统能对外提供服务,需创建、组装并启动这些组件;在服务停止时,还需要释放资源,这是一个动态过程。即Tomcat需动态管理这些组件的生命周期。当我们设计一个较大系统或框架时,也需要考虑:如何统一管理组件的创建、初始化、启动、停止和销毁?如何做到代码逻辑清晰?如何方便地添加或者删除组件?如何做到组件启动和停止不遗漏、不重复?组件有大有小,大组件管理小组件,比如Server管理Service,Service又管理连.原创 2021-07-20 15:46:41 · 3162 阅读 · 6 评论 -
Tomcat多层容器的设计
Tomcat的容器用来装载Servlet。那Tomcat的Servlet容器是如何设计的呢?容器的层次结构Tomcat设计了4种容器:Engine、Host、Context和WrapperTomcat通过这种分层,使得Servlet容器具有很好的灵活性。Context表示一个Web应用程序Wrapper表示一个Servlet,一个Web应用程序中可能会有多个ServletHost代表一个虚拟主机,或一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可以部署多个Web应用程序原创 2021-07-20 14:19:03 · 2250 阅读 · 10 评论 -
Tomcat的连接器是如何设计的?
导读为什么要学习Tomcat的设计思路,对我们这些 crud 工程师有用吗?现代背景下,我们不仅可以学到Tomcat的架构,学会从宏观上怎么去设计一个复杂系统,怎么设计顶层模块,以及模块之间关系。Tomcat总体架构Tomcat主要实现了2个核心功能:处理Socket连接,负责网络字节流与Request和Response对象的转化加载和管理Servlet,以及具体处理Request请求因此Tomcat设计了两个核心组件:连接器(Connector)负责对外交流容器(Container原创 2021-07-18 16:14:08 · 1583 阅读 · 6 评论 -
不知道这些Servlet规范、容器,还敢说自己是Java程序员?
浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理。那HTTP服务器怎么知道要调用哪个处理器方法。最直接的做法是在HTTP服务器代码里写一大堆if else:如果是A请求就调X类的M1方法,如果是B请求就调Y类的M2方法。这样设计的问题在于HTTP服务器的代码跟业务逻辑耦合,若新增业务方法还要改HTTP服务器的代码!面向接口编程是解决耦合问题的银弹,可以定义一个接口,各种业务类都必须实现这个接口,这个接口就是Servlet接口,也把实现了Servlet接原创 2021-07-17 14:25:36 · 2327 阅读 · 4 评论 -
tomcat8问题
遇到过一个偶发的tomcat8问题,请求到tomcat后,nio长连接,到了20秒后超时后才自动断开连接,返回结果内容正常,抓包发现和正常的比少了最后的回车换行。可能你的应用程序设置的响应长度Content-Length与实际响应数据长度不符,可能长了那么一丢丢,这样Tomcat一直在等你的数据。...原创 2021-07-14 22:41:22 · 857 阅读 · 2 评论 -
SpringBoot应用启动内置Tomcat的过程分析
Connector启动过程Connector是Tomcat提供的类。// 通过此 Connector 开始处理请求@Overrideprotected void startInternal() throws LifecycleException { // Validate settings before starting if (getPortWithOffset() < 0) { throw new LifecycleException(sm.getStri原创 2021-07-14 19:19:41 · 2750 阅读 · 9 评论 -
Java NIO系列教程(8)-SocketChannel的最佳实践
Java NIO中的SocketChannel是一个连接到TCP 网络套接字的通道。可通过如下方式创建SocketChannel:打开一个SocketChannel,并连接到网络上的某台服务器一个新连接到达ServerSocketChannel时,会创建一个SocketChannel打开 SocketChannel下面是SocketChannel的打开方式的简单用法:SocketChannel socketChannel = SocketChannel.open();socketChan原创 2021-07-14 17:38:59 · 1271 阅读 · 4 评论 -
面试官问:你们服务最大的并发量是多少?
Spring Boot 能支持的最大并发量主要看其对Tomcat的设置。由于现在都使用的是springboot服务,配置文件中也没有配置Tomcat 相关参数,基本都是使用默认的Tomcat的线程配置。默认设置中,Tomcat的最大线程数200,最大连接数10000。并发量指的是连接数,还是线程数?连接数。200个线程如何处理10000条连接?Tomcat有两种处理连接的模式BIO一个线程只处理一个Socket连接NIO一个线程处理多个Socket连接。由于HTTP请求不会太耗时,而且多原创 2021-07-03 19:52:06 · 6972 阅读 · 9 评论 -
一文看懂Tomcat、Nginx和Apache的区别
这三者都是web server,那他们各自有什么特点呢?他们之间的区别是什么呢?nginx 和 tomcat在性能上面有何异同?tomcat用在java后台程序上,java后台程序难道不能用apache和nginx吗?Apache HTTP Server Project、Nginx都是开源的HTTP服务器软件。HTTP服务器本质上也是一种应用程序——它通常运行在服务器之上,绑定服务器的IP地址并监听某一个TCP端口来接收并处理HTTP请求,这样客户端(如Firefox,Chrome这样的浏览器.原创 2021-06-28 16:29:04 · 3534 阅读 · 12 评论 -
Tomcat 的线程池实现原理
一个激进创建线程的弹性线程池更符合我们的需求,你能给出相关的实现吗?实现后再测试一下,是否所有的任务都可以正常处理完成呢?既然选择先扩容线程池再加入队列,那为什么不干脆把核心线程数设置大一些,然后核心线程数可回收这种策略呢?其实我们希望尽量确保有足够多线程能处理任务,但又不闲置过多线程,或临时创建过多线程,换句话说让线程的创建和回收不要太频繁。选择哪个策略要根据任务的性质和压力的流量形态来决定。复用线程池,任务很慢,主线程get结果的时候不会导致主线程卡死的状态吗?不是也提倡不同的任务用不同的原创 2021-02-02 12:55:38 · 1467 阅读 · 0 评论 -
Tomcat 架构模型
Tomcat 无需任何三方框架,即可实现业务需要(必须有线程池)的运行 servlet 的容器,其线程模型并非不如 Netty!只是使用场景不同而已!原创 2020-10-28 23:57:02 · 1201 阅读 · 0 评论 -
Tomcat7与Tomcat8的差异详细对比
1 配置文件tomcat8 更贴心,给出明确已启动的提示输出。tomcat72 请求的响应状态值tomcat8下请求成功时,响应值为 successtomcat7下为ok原创 2020-07-28 17:31:06 · 5818 阅读 · 2 评论 -
Tomcat登录进入manager管理界面
conf/tomcat-users.xml添加如下内容:默认是没有任何用户有权限的,需要手动加入<role rolename="admin-gui"/><role rolename="manager-gui"/><role rolename="manager-jmx"/><role rolename="manager-script"/><role rolename="manager-status"/><user usern原创 2020-07-28 14:49:51 · 2383 阅读 · 0 评论 -
tomcat如何知道WebRoot是web根目录?
在eclipse下建工程,默认webContent目录是web根目录在myeclipse下建工程,默认webRoot是web根目录有时自己写更经常直接采用web作根目录。tomcat如何知道哪一个目录是web根目录,从而找到classes呢?这两者真的有关系吗?web工程完成之后还不是要发布,放到tomcat的webapp下面去webRoot只是给developer用的,就像eclipse里的src文件夹一样...原创 2020-07-28 14:44:30 · 1749 阅读 · 0 评论 -
都2020了你该知道Tomcat真正的启动文件了
0 前言全是干货的技术殿堂文章收录在我的 GitHub 仓库,欢迎Star/fork:Java-Interview-Tutorialhttps://github.com/Wasabi1234/Java-Interview-Tutorial真正的启动是在 catalina.sh 设置startup.sh 只是找到catalina.sh 然后执行catalina.sh 来启动!下面我们...原创 2020-03-13 20:53:28 · 3673 阅读 · 0 评论 -
Tomcat下载安装及其基本操作
目录0 前言1 下载1.1 进入 [Apache Tomcat官网](http://tomcat.apache.org/)1.2 [选择经典稳定版本 8.5](https://tomcat.apache.org/download-80.cgi)2 启动Tomcat2.1 终端输入2.1.1 设置权限2.2 拖拽3 验证是否启动成功4 关闭 Tomcat0 前言全是干货的技术殿堂文章收录在...原创 2020-03-13 17:51:40 · 2478 阅读 · 0 评论