这是我参与8月更文挑战的第17天,活动详情查看: 8月更文挑战
Netty在很多开源框架中用的比较多,比如我们常用的Dubbo接口,底层都是通过Netty来实现RPC之间的调用,RocketMQ底层也是通过Netty来实现通信的;如果我们要自定义实现一个框架,Netty我们就会用到,要做到系统直接的通信,底层很多都用的是Netty来实现。那么Netty到底是什么呢?先看官方(netty.io/)的描述:
Netty is _an asynchronous event-driven network application framework _for rapid development of maintainable high performance protocol servers & clients
Netty是⼀个⾼性能的、异步的、基于事件驱动的⽹络应⽤框架 Netty是基于Java的NIO来实现的,将各种传输类型,协议的实现API进行了统一封装,实现了阻塞和非阻塞Socker,Netty能够方便我们快速的进行系统间的通信,让开发者只需要关心业务,不需要去关心网络传输之间的逻辑,提升了开发效率
核心框架
看netty官方提供的图,可以看出netty涉及的面比较广,体系也比较完善
-
核⼼
- 可扩展的事件模型
- 统⼀的通信api
- ⽆论是http还是socket都使⽤统⼀的api,简化了操作
- 零拷⻉机制与字节缓冲区
-
传输服务
- ⽀持socket以及datagram(数据报)
- ⽀持http协议
- In-VM Pipe (管道协议)
-
协议⽀持
- http 以及 websocket
- SSL 安全套接字协议⽀持
- Google Protobuf (序列化框架)
- ⽀持zlib、gzip压缩
- ⽀持⼤⽂件的传输
- RTSP(实时流传输协议,是TCP/IP协议体系中的⼀个应⽤层协议)
- ⽀持⼆进制协议并且提供了完整的单元测试
Netty模型
Netty底层是用Java的NIO来实现的,但是Neety的模型是基于Reactor模型来实现,模型示意图与Reactor模型示意图基本一致
- Netty模型中,负责处理新连接事件的是BossGroup,负责处理其他事件的是WorkGroup:Group就是线程池的概念。
- NioEventLoop表示⼀个不断循环的执⾏处理任务的线程,⽤于监听绑定在其上的读/写事件。
- 通过Pipeline(管道)执⾏业务逻辑的处理,Pipeline中会有多个ChannelHandler,真正的业务逻辑是在ChannelHandler中完成