Netty

Posted miraclemaker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty相关的知识,希望对你有一定的参考价值。

1.基础知识:

  • 基础步骤:
  • 客户端发送数据的同步方式和异步方式:
  • 概念:是一个异步的,基于事件驱动的NIO框架,基于netty可以快速开发网络IO程序。
  • 核心组件:

。msg:客户端传来的数据最开始是字节,需要经过ChannelPipeline的加工才能给服务端读。

。Channel:数据传输的通道,传输过程中对数据进行处理。

。EventLoop:包括一个selector和一个Thread;总管多个连接,处理不同的连接传输不同的消息。一个Channel绑定一个EventLoop,一个EventLoop可以绑定多个Channel。

。EventLoopGroup:总管多个EventLoop。我们可以细分为boss处理连接,work处理读写(也可以对处理时间长的channel设置单独的EventLoopGroup进行处理)。
。ChannelHander:针对自己感兴趣的数据进行某方面的处理。

。ChannelPipeline:一个ChannelPipeline里有多个ChannelHander依次进行自己的处理。

。Bootstrap和ServerBootstrap:Bootstrap引导客户端,ServerBootstrap引导服务器,串联各个组件。

  • 使用:定义EventLoopGroup(是一个接口,一般我们用NioEventLoopGroup(io,普通,定时)和DefaultEventLoopGroup(普通,定时)实现类)
  • 特点:

。高并发:基于NIO,NIO是一个同步非阻塞IO;

。传输快:零拷贝特性,减少了不必要的内存拷贝;

。封装好:封装了NIO很多细节,提供了简单的API;

  • 优点:使用简单(封装),功能强大(多种编码能力,多种协议),高性能,版本稳定(经常维护)。
  • 应用场景:用于网络通信,比如rpc框架,http服务器,即时通讯系统等。

2.Netty的高性能如何体现?

  • NIO线程模型:同步非阻塞IO模型;
  • 零拷贝:减少了不必要的内存拷贝;
  • 内存池:使用直接内存,并且可以重复利用;
  • 串行化处理读写:避免了使用锁带来的额外开销;
  • 高性能的序列化协议:支持多种高性能的序列化处理协议;

3.Netty和Tomcat的区别:

  • Tomcat:基于HTTP协议的web容器,需要遵循selvelt规范;
  • Netty:支持并且可自定义各种协议,不需要遵循selvelt规范;

4.BIO,NIO,AIO:

  • 首先连接和请求都分为有效和无效(只连接,之后不做事情)。
  • BIO:同步阻塞IO,一个连接一个线程,适用于连接数目少的架构;
  • NIO:同步非阻塞IO,一个请求一个线程,先注册到多路复用器,再有多路复用器轮询启动线程,适用于连接数目多但连接短的架构。
  • AIO:异步阻塞IO,一个有效请求一个线程,先经过操作系统处理再分配线程处理,适用于连接多连接长。

5.Select,Poll,Epoll模型:

6.Reactor模型:

7.EventLoop和EventLoopGroup:

  • 一个线程对应一个EventLoop,一个EventLoopGroup包含多个EventLoop,连接来了EventLoopGroup接收连接后交给内部的EventLoop处理具体的IO操作。

8.Netty的线程模型:

  • 单线程模型:所有IO操作都在一个线程上运行
  • 多线程模型:一个线程可以处理多个链路的请求,连接建立后到后端的IO线程池处理IO任务
  • 主从多线程模型:Acceptor线程池来接收连接,连接建立后就到后端的subReactor线程池处理IO任务

9.Netty无锁化如何体现的:

  • IO线程内部串行操作,避免多线程竞争造成性能下降,表面上来看CPU利用率很低,但实际上我们可以调整NIO线程池参数同时开启多个串行化线程并行。

10.粘包和拆包:

  • 原因:TCP没有界限,请求的数据超出缓冲区才会被发送,因为TCP并不了解上层的业务逻辑,就有可能出现粘包:多个小包封装成一个包运输;拆包:一个大的数据包被拆分。
  • 解决方案:每个包都封装成固定长度;采用分隔符;记录消息长度;自定义协议。
  • Netty的解决方案:针对上述三种解决方案推出不同的解码器来处理这些问题,最常用的是消息头包含消息长度的协议。

11.Netty零拷贝如何体现?

  • 使用堆外内存进行读写,不需要进行缓冲区的二次拷贝;
  • 提供了组合Buffer对象,可以方便的操作这些组合对象;
  • 直接将目标缓冲区的数据发送到指定信道,避免了传统的循环write造成的内存拷贝。

12.Netty的长连接和心跳机制:

  • TCP长连接的过程中要时刻检测连接是否中断,一段时间内没有数据交互时就要互相发送数据报文进行检测,TCP有自带的心跳检测,但是不够灵活,所以一般我们都是在应用层层面实现心跳机制的。

13.Netty的对象池技术:

  • 因为IO操作需要频繁的在用户缓冲区和内核缓冲区间拷贝数据,这个过程中需要创建大量的buffer,因此采用池化技术

14.序列化协议:Java默认,Json,xml,fastjson。

15.同步阻塞,同步非阻塞,多路复用,异步:

  • 阻塞与非阻塞:线程去监听事件,如果没有事件发生,就阻塞住,或者是立即返回;
  • 同步与异步:线程去监听事件,自己监听自己获取结果是同步,自己监听后不管其他线程获取结果是异步;
  • IO操作时分为两步的,先等待数据,再复制数据,这两步都会发生系统调用,
  • 同步阻塞等待阶段和复制阶段都阻塞;同步非阻塞:等待阶段无数据就返回再请求while循环,复制阶段阻塞;多路复用指的是用一个线程监听多个IO操作,也会阻塞,等待过程结束后返回,复制阶段再阻塞,这三种在复制阶段都会造成阻塞;而异步是等待操作系统通知自己什么时候有事件发生,复制阶段也不会阻塞。

 

以上是关于Netty的主要内容,如果未能解决你的问题,请参考以下文章

荐书 | Netty进阶之路:跟着案例学Netty

netty可以做啥

Netty 简介《Netty In Action》 #yyds干货盘点#

Netty:netty 中通道的进程生命周期是啥?

Netty源码:2 把握 Netty 整体架构脉络

Netty4概念篇:Netty架构设计