问题精选-Netty+Tomcat
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题精选-Netty+Tomcat相关的知识,希望对你有一定的参考价值。
参考技术A BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。
NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。
AIO:一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理。
BIO 是面向流的,NIO 是面向缓冲区的;BIO 的各种流是阻塞的。而 NIO 是非阻塞的;BIO 的Stream 是单向的,而 NIO 的 channel 是双向的。
NIO 的特点:事件驱动模型、单线程处理多任务、非阻塞 I/O,I/O 读写不再阻塞,而是返回0、基于 block 的传输比基于流的传输更高效、更高级的 IO 函数 zero-copy、IO 多路复用大大提高了 Java 网络应用的可伸缩性和实用性。基于 Reactor 线程模型。
Buffer:与 Channel 进行交互,数据是从 Channel 读入缓冲区,从缓冲区写入 Channel 中的。
flip 方法 : 反转此缓冲区,将 position 给 limit,然后将 position 置为 0,其实就是切换读写模式。
clear 方法 :清除此缓冲区,将 position 置为 0,把 capacity 的值给 limit。
rewind 方法 : 重绕此缓冲区,将 position 置为 0
Channel:表示 IO 源与目标打开的连接,是双向的,但不能直接访问数据,只能与 Buffer 进行交互。
bio:传统的 Java I/O 操作,同步且阻塞 IO。
nio:JDK1.4 开始支持,同步阻塞或同步非阻塞 IO。指定使用 NIO 模型来接受 HTTP 请求protocol=”org.apache.coyote.http11.Http11NioProtocol” 指定使用 NIO 模型来接受 HTTP 请求。默认是 BlockingIO,配置为protocol=”HTTP/1.1”acceptorThreadCount=”2” 使用 NIO 模型时接收线程的数目。
aio(nio.2):JDK7 开始支持,异步非阻塞 IO。
apr:Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地 提高Tomcat对静态文件的处理性能。
在 Tomcat 中托管 Netty 服务器是不是可行/可取?
【中文标题】在 Tomcat 中托管 Netty 服务器是不是可行/可取?【英文标题】:Is hosting a Netty Server inside Tomcat feasible/desirable?在 Tomcat 中托管 Netty 服务器是否可行/可取? 【发布时间】:2011-03-12 18:59:59 【问题描述】:我们构建了一个基于 Netty/NIO 的服务,我正在考虑将该服务部署到我们的生产环境中。我们部署服务的标准方式是作为 WAR,部署在 Tomcat 中。
当我在这里提出相同的方法时,我得到了“不应该这样做”的喊叫和抱怨,因为 Netty 和 Tomcat 都是服务器,并且“在另一台服务器上托管一个服务器没有意义”。
对我来说这很有意义,因为它完全解决了我的部署问题,并且让我免于编写其他代码。为什么是这么大的“不不”?
【问题讨论】:
您能否更具体地谈谈您的“部署问题”以及“让我免于编写其他代码”? @Romain - 我们的操作人员有脚本,这些脚本可以获取 WAR 并将它们部署到各种 tomcat,停止/启动它们/等等...如果我不在 Tomcat 中托管它,而是作为独立的jar,那么这些脚本需要调整。我所指的“其他代码”是通过 HTTP 公开服务方法——我们已经有了通过标准 HTTP servlet 执行此操作的代码,现在我们需要重新实现它。问题是 - 仅将其托管在 Tomcat 中有什么问题? 重新部署 WAR 有什么问题?好处是你有一个统一的代码,如果需要,你可以回滚到。 【参考方案1】:Tomcat 提供的动态 WAR 部署和取消部署是为 Web 应用程序设计的。您尝试部署到 Tomcat 中的 Netty 应用程序不是 Web 应用程序,而只是一个仅共享 VM 内存的单独服务器。这意味着 Tomcat 已被重新用于通用微内核,例如 OSGi。
不过,我认为这不是什么大问题。由于您的公司使用 WAR 作为标准部署机制,因此重用它可能是个好主意。你甚至不需要编写远程关机之类的管理功能,因为 Tomcat 已经提供了它们。您需要做的就是确保在取消部署时释放所有资源。
有些人可能不喜欢这种方法。理想情况下,应该有一个通用的基础设施来部署和管理任何应用程序(又名微内核),甚至 Tomcat 都被部署为一个模块,而微内核直接管理 WAR,而不是 Tomcat。但这还有很长的路要走。
【讨论】:
我们的新公司标准是部署为战争,几乎每个应用程序都使用 netty 或 Mina 作为我们的专有协议。只需要小心关闭,但到目前为止没有大问题。现在,如果 netty 可以为 spring mvc 做 servlet,我们就万事大吉了。【参考方案2】:这很有意义。事实上,我们在 Tomcat 中运行一个 Java 电子邮件服务器。
Tomcat 在容纳应用程序方面有一些巨大的优势:
-
已经为您编写了守护程序脚本
Tomcat 允许热部署(只要您不使用休眠 :))
在某些时候,您可能需要管理 UI 或管理 API
有很多工具可以监控 Tomcat,这意味着可以免费监控您的应用。
现在使用 Netty、Mina 或任何事件驱动的网络技术,您将无法使用大多数 MVC 框架。事实上,您将无法使用大多数 Java 企业框架,因为很多事情都依赖于每个请求的线程(事务、安全等...)。
【讨论】:
【参考方案3】:不要在Tomcat中启动任何东西,这很不方便,而且这有很多痛苦的问题。只需将 Tomcat(或 Jetty)嵌入到您的应用程序中,然后将您的应用程序作为纯 java 进程运行即可。
【讨论】:
我在生产中使用了这种方法几次,它很有效。使用 maven 和 jenkins 会更有趣。以上是关于问题精选-Netty+Tomcat的主要内容,如果未能解决你的问题,请参考以下文章
薪水界的天花板!一文助我拿下十多个offer:精选并发+JVM+多线程+Netty+MySQL,达到这个境界就可以躺平啦~