Netty简介Netty是由JBoss开发,基于JAVA NIO的一个高性能通信框架 。之前几篇文章介绍了Java NIO的一些基本的概念和API 。但在实际的网络开发中,其实很少使用Java NIO原生的API 。主要有以下原因:
- 原生API使用单线程模型,不能很好利用多核优势,如果自己去写多线程结合起来比较麻烦;
- 原生API是直接使用的IO数据,没有做任何封装处理,对数据的编解码、TCP的粘包和拆包、客户端断连、网络的可靠性和安全性方面没有做处理;
在《Netty权威指南》这本书里提到一个真实的故事,两个项目团队都要做基于NIO非阻塞特性构建高性能、异步和高可靠性的底层通信框架,但一个团队选择了基于Java NIO API从头开发,另一个团队选择了基于Netty开发 。最终,从头开发的团队遇到了各种各样的问题,导致项目延迟,而基于Netty开发的团队则进展顺利 。
【什么是Netty?】其实网络开发是一个比较复杂的事情,因为网络的不稳定性,通常会遇到各种各样的问题,比如前面提到的客户端突然断连、TCP的拆包和沾包等等 。
幸运的是,网络上已经有了这么一个成熟的框架帮我们处理了这些事情,这个框架就是Netty 。Netty主要应用于以下领域:
- 高性能的RPC框架:常用于微服务之间的高性能远程调用(如Dubbo)
- 游戏行业:Netty可以很轻松地定制和开发一个私有协议栈,
- 即时通讯:Netty基于Java NIO,并且做了一些优化,支持高性能的即时通讯
Netty可以做什么?这里有一个Netty的功能特性的图:
文章插图
Netty Core提供了基本功能,包括文件零拷贝、基本的API、可扩展的基于事件的模型(下文详细介绍) 。
Netty支持非常多的协议,比如HTTP、WebSocket等 。当然,Netty也可以自定义协议 。常见协议的示例代码可以参考netty源码里面的example包 。
Netty同时支持Java的BIO和NIO两种方式 。且很容易与Spring等主流框架进行集成 。
Reactor 线程模型首先介绍处理事件的两种方式:
- 轮询方式:线程不断轮询访问相关事件发生源有没有发生事件,有发生事件就调用事件处理逻辑 。Java 原生的NIO就是使用的轮询方式 。
- 事件驱动方式,发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻辑处理事件 。事件驱动方式也被称为消息通知方式,其实是设计模式中观察者模式的思路 。
Reactor是反应堆的意思 。Reactor线程模型是指通过一个或多个输入,同时传递给服务处理器的服务请求的事件驱动处理模式 。
Reactor模式主要工作原理如下图:
文章插图
Reactor 有一个专门负责监听和分发事件的线程,如图中的Service Handler,所有请求进来后,被它分发到具体的处理线程,如图中的EventHandler去处理 。
Reactor可能有多个,而Netty正是使用了多Reactor的线程模型 。
Netty是怎么工作的?
文章插图
Netty里面有两个Group,分别是Boss Group和Worker Group 。其中,Boss Group用于处于连接,Worker Group用于处理实际的读写IO 。
Boss Group里面的NioEventLoop会轮询accept事件,遇到有新的连接,就生成NIOSocketChannel,并把这个Channel注册到Worker Group的Selector上 。
Worker Group轮询read和write事件,在可读或者可写条件满足时,就进行处理 。
Worker Group和Boss Group都是通过里面的NioEventLoop来操作的 。NioEventLoop中维护了一个线程和任务队列,支持异步提交执行任务,线程启动时会调用NioEventLoop的run方法 。
最后都会执行一个runAllTasks方法,它用于处理任务队列中的任务 。任务队列中的任务包括用户调用 eventloop.execute或schedule执行的任务,或者其他线程提交到该eventloop的任务 。
示例代码以下是使用Netty创建一个Server的示例代码 。Client也可以使用Netty来创建,也可以使用之前文章里面的NIO示例代码 。这里就不展示基于Netty的Client端的代码,只展示Server端的代码了 。
文章插图
文章插图
推荐阅读
- 舍利花和舍利子的区别 供养舍利子用红花还是藏红花
- 海王星气体 海王星是气体还是固体
- 注解式限流是如何实现的?
- 茶叶的耐泡程度与什么有关
- Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马
- 什么是“分布式事务”?这回彻底懂了
- 梦见挖菜好不好 梦见挖菜窖什么意思
- 五子棋七步必胜开局 五子棋后手6步必胜
- 中国最大的野生黄鳝多重 世界上最大的黄鳝是多少重
- 梦到流血受伤是什么意思 梦到流血是什么意思