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的主要内容,如果未能解决你的问题,请参考以下文章