netty是什么?

Netty是什么?

相对于Tomcat这种Web Server(顾名思义主要是提供Web协议相关的服务的),Netty是一个Network Server,是处于Web Server更下层的网络框架,也就是说你可以使用Netty模仿Tomcat做一个提供HTTP服务的Web容器。

简而言之,Netty通过使用NIO的很多新特性,对TCP/UDP编程进行了简化和封装,提供了更容易使用的网络编程接口,让你可以根据自己的需要封装独特的HTTP Server活着FTP Server等.


作者:郭大宽
链接:https://www.zhihu.com/question/24322387/answer/27412211
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

1)本质:JBoss做的一个Jar包

2)目的:快速开发高性能、高可靠性的网络服务器和客户端程序

3)优点:提供异步的、事件驱动的网络应用程序框架和工具

通俗的说:一个好使的处理Socket的东东

 

如果没有Netty?

远古:

java.net + java.io

近代:

java.nio

其他:

Mina,Grizzly

 

与Mina相比有什么优势?

1、都是Trustin Lee的作品,Netty更晚;

2、Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有所下降,Netty解决了这个设计问题;

3、Netty的文档更清晰,很多Mina的特性在Netty里都有;

4、Netty更新周期更短,新版本的发布比较快;

5、它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);



Netty 在哪些行业得到了应用?

  • 互联网行业:随着网站规模的不断扩大,系统并发访问量也越来越高,传统基于 Tomcat 等 Web 容器的垂直架构已经无法满足需求,需要拆分应用进行服务化,以提高开发和维护效率。从组网情况看,垂直的架构拆分之后,系统采用分布式部署,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。

netty是一套在java NIO的基础上封装的便于用户开发网络应用程序的api. 应用场景很多,诸如阿里的消息队列(RocketMQ),分布式rpc(Dubbo)通信层都使用到了netty(dubbo可以用服务发现自由选择通信层). 主要优点个人总结如下:

1. netty是非阻塞事件驱动框架, 并结合线程组(group)的概念,可以很好的支持高并发,慢连接的场景。


作者:吉悦
链接:https://www.zhihu.com/question/24322387/answer/27444924
来源:知乎
著作权归作者所有,转载请联系作者获得授权。


除了 Dubbo 之外,淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通信。

 

### Spring MVC 中替换 RxNettyContainer 的方式 在 Spring MVC 应用程序中,默认情况下,Web 容器通常由 Tomcat 或 Jetty 提供支持。然而,如果希望替换默认的 Web 容器并使用其他容器(例如 Netty),可以通过自定义配置实现这一目标。 #### 1. 配置新的异步处理机制 为了替换 `RxNettyContainer` 并引入其他容器实现,需要调整应用程序的异步处理逻辑。Spring MVC 支持多种异步模式,包括 Servlet 3.0+ 的异步 API 和 Reactor/Reactor Netty 等响应式编程模型[^2]。 以下是具体的步骤: - **移除现有的依赖项** 如果当前项目已经集成了 `rxnetty-container`,则需先将其从项目的构建工具(如 Maven 或 Gradle)中移除。 对于 Maven 构建文件: ```xml <!-- 移除以下依赖 --> <dependency> <groupId>io.reactivex.netty</groupId> <artifactId>rx-netty</artifactId> <version>x.x.x</version> </dependency> ``` - **引入替代容器的相关依赖** 假设要切换到基于 Netty 的另一种实现(如 Reactor Netty)。可以在 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>io.projectreactor.netty</groupId> <artifactId>reactor-netty</artifactId> <version>1.1.7</version> </dependency> ``` #### 2. 自定义 DispatcherServlet 初始化过程 由于 Spring MVC 的核心是通过 `DispatcherServlet` 来分发请求,因此需要确保新容器能够适配该 servlet 的生命周期管理[^3]。 - 创建一个新的类继承 `AbstractHttpHandlerInitializer`,用于初始化 HTTP 处理器并与指定的容器绑定。 ```java import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import reactor.ipc.netty.http.server.HttpServer; public class CustomNettyInitializer extends AbstractHttpHandlerInitializer { @Override protected HttpHandler createHttpHandler() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(WebConfig.class); // 注册你的 Spring MVC 配置类 context.refresh(); DispatcherServlet dispatcherServlet = new DispatcherServlet(context); return ServletHttpHandlerAdapter.adapt(dispatcherServlet); } } ``` - 启动时运行上述初始化器以加载定制化的容器实例: ```java public static void main(String[] args) throws Exception { HttpServer server = HttpServer.create().host("localhost").port(8080).newHandler(new CustomNettyInitializer()); server.block(); // 开始监听端口 } ``` #### 3. 调整组件扫描范围 根据现有配置文件中的 `<context:component-scan>` 设置[^4],确认哪些包下的 Bean 将被纳入 Spring 容器或 Spring MVC 子容器管理。对于新增加的支持库,可能还需要额外声明其对应的扫描路径。 例如,在 `spring-mvc.xml` 中扩展扫描规则: ```xml <context:component-scan base-package="org.reactivestreams"/> ``` 这样可以确保来自第三方库的关键功能也能正常注册为 Spring Beans。 --- ### 总结 通过以上方法即可完成对原有 `RxNettyContainer` 组件的替换操作,并采用更灵活高效的解决方案取而代之。需要注意的是整个过程中涉及到多个层次间的协作关系,务必仔细验证各部分之间的兼容性和交互行为是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值