tomcat 有三种启动模式:BIO、NIO、APR
tomcat 默认启动模式为bio 为block io 阻塞io 利用Java 中的 io 。每一个请求来就会创建一个新的线程去 处理请求
对应这jdk 1.4 之后出现的 nio 新的 io解决技术,为非阻塞的io。利用的是 Selector 去处理多请求,不用去创建多个线程。
Selector(多路复用器)
JAVA NIO 的选择器使用一个线程去监视多个通道 ,具体通过轮询的方式,当通道上的已经准备就绪时好,再进行IO操作 ,不会像阻塞io 一样 会阻塞,导致后面的请求无法进行。
简单地讲Selector会不断地轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的IO操作。
服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有没有自己要处理的事件到达,有则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。 同步和异步就是一个要写while去轮询,一个就是提供回调逻辑。,所以这个轮询方法也意味着,NIO是同步的。 原文链接:https://blog.csdn.net/No_Game_No_Life_/java/article/details/101206866
将tomcat conf 目录下的 server.XML中的 将protocol 改为 org.apache.coyote.http11.Http11NioProtocol 即可 http -nio -8999 处此使显示为已经配置成功
Tomcat 8.0 的版本以上都默认设置使用NIO 的启动方式 通过查看2.1.8 版本 spring boot 内置的 [Apache Tomcat/9.0.24] 服务器,发现日志中确实如此。
[2020-07-22 15:35:30,037] [INFO ] [main] [Starting ProtocolHandler ["http-nio-8080"]]
[2020-07-22 15:36:57,202] [INFO ] [http-nio-8080-exec-1]
<!-- tomcat 的默认启动为 bio <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!--设置为nio 的模式 --> <!-- <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" /> -->
<!-- 设置为apr模式启动 --> <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
将tomcat 设置为apr 模式 除了去修改,server.xml 处的配置文件外 ,还有在机器上安装所需要的依赖。
因为apr 模式是 使用jni 技术调用操作系统底层的IO接口,因此需要安装其他的环境。
apr 模式被誉为 Tomcat 生产环境的首选方式,能大幅度提高服务器的并发处理性能,因此配置apr 环境是很需要掌握的知识。
为配置 环境直接启动 tomcat 会报如下错误 :
配置方法参考:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。