Netty 特性一览

概述

  1. Netty封装了JDK的NIO,让你用的更丝滑更爽:
  • 简化开发代码
  • fixed bug,优化了细节
  • 提供工具类:拆包、心跳包等
  • 轻松切换BIO、NIO
  • 自带两个线程池高性能
  • 被众多RPC广泛使用:Dubbo、RocketMQ
  1. Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。

  2. 为什么用Netty?

  • BIO 不适合多线程,服务端多线程阻塞:1.线程资源占用厉害 2. 线程切换CPU开销大
  • NIO 编程复杂
  1. Netty服务端开发过程:创建引导类,设置2个线程池,设置IO模型,绑定监听事件,绑定端口启动
public class NettyServer {
    public static void main(String[] args) {
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        NioEventLoopGroup boosGroup = new NioEventLoopGroup();
        NioEventLoopGroup workerGroup = new NioEventLoopGroup();
        serverBootstrap
                .group(boosGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    protected void initChannel(NioSocketChannel ch) {
                    }
                });
        serverBootstrap.bind(8000);
    }
}
  1. Netty的Reactor模型:
  • bossGroup接受新连接线程,主要负责创建新连接
  • workerGroup,负责读取数据的线程,主要用于读取数据以及业务逻辑处理
  • workerGroup里面的NioEventLoop有一个无限循环:监听事件、处理事件、处理队列消息
  1. 核心原理:
  • 每个Client和Server连接的时候,会被丢到boss线程,boss线程的NioEventLoop负责监听Accept行为,Accept成功,就会生成一个客户端的Channel
  • 把Channel Assign给workGroup里面的一个NioEventLoop,来负责这个Channel的所有的读写监听和响应

最终的模型:多个client连接上NettyServer之后,都有boss线程会获取到1个channel,channel被分给不同的NioEventLoop,每个Loop都是一个独立的线程,类似于Selector会自旋遍历所有的channel的事件。
相当于传统NIO中,一个Selector包办所有的Accept()、read、write、close等操作。现在分给N个Selector来处理,bossGroup只负责连接,N个workGroup的Selector负责各自分配channel的读写监听和处理。

  1. 拆包和粘包:
  • 在即时性要求不高的业务场景下,降低TCP的交互次数,把多个小的消息,粘成一个大的消息,从而节省带宽
  • 传递的消息超过最大数据包的限度时,必须要拆分为几个子包,才能保证数据的完整性,所以必须拆包
  1. 粘包、半包、拆包的解决方案
  • 在报文末尾增加换行符表明一条完整的消息,这样在接收端可以根据这个换行符来判断消息是否完整。(有时候文本中有换行符,则该方法无效)
  • 将消息分为消息头、消息体。可以在消息头中声明消息的长度,根据这个长度来获取报文(比如 808 协议)(编程复杂,但是避免空间浪费)
  • 规定好报文长度,不足的空位补齐,取的时候按照长度截取即可。(可能浪费空间,但是编程简单)
  1. 工具类
  • LineBasedFrameDecoder,换行符拆包,写消息的时候,末尾添加 \n即可
  • LengthFieldBasedFrameDecoder 基于包长度的拆包类

Netty特性VS NIO原生

  1. Netty不仅支持NIO,还直播BIO:一个Client从workGroup里分配一个专门的线程阻塞式的读取消息,如果线程组用完了,新的连接就会进入排队。
  2. 封装更多的通用功能,比如字符串拆包,心跳检测功能,字符串的编码和解码
  3. 解决了NIO中JDK的一些bug,比如selector自旋的时候CPU飙升的bug
  4. 封装了NIO很多的细节,比如引入workGroup和bossGroup线程组,可根据实际业务场景配置工作线程个数,而NIO要自己去实现
  5. Netty是异步非阻塞的模式,支持ChannelFuture查看IO事件的执行情况,并且事件完成执行相应的回调方法

参考博客

闪电侠大佬博客,业界良心
https://www.jianshu.com/nb/26583432

粘包拆包 闪电侠
https://www.jianshu.com/p/dc26e944da95

非常好的一个系列,有入门、有源码分析、有实战
https://blog.csdn.net/column/details/enjoynetty.html

偏实战
https://www.jianshu.com/u/e2d07947c112

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容