最流行的 NIO 框架,由 JBOSS 提供的,整合了FTP,SMTP,HTTP协议
优点:模型简单,编码简单缺点:性能瓶颈,请求数和线程数 N:N 关系高并发情况下 ,CPU 切换线程上
下文损耗大案例:Tomcat 7之前,都是 BIO,7 之后是 NIO改进:伪 NIO,使用线程池去处理逻辑
同步阻塞:丢衣服->等洗衣机洗完->再去晾衣服同步非阻塞:丢衣服->去做其他事情,定时去看衣服是
否洗完->洗完后自己去晾衣服异步非阻塞:丢衣服-> 去做其他事情不管了,衣服洗好会自动晾好,并且
通知你晾好了
五种 I/O 模型:阻塞 IO、非阻塞 IO、多路复用 IO、信号驱动 IO、异步 IO,前 4 种是同步 IO,在内核
数据 copy 到用户空间时是阻塞的
核心:可以同时处理多个 connection,调用系统 select 和 recvfrom函数每一个socket 设置为 nonblocking 阻塞是被 select 这个函数 block 而不是 socket阻塞缺点:连接数不高的情况下,性能不一定
比 多线程+ 阻塞 IO 好(多调用一个select 函数)
采用 Future-Listener机制
IO 操作分为 2 步:
I/O 是指网络 I /O ,多路指多个 TCP 连接,复用指一个或几个线程。简单来说:就是使用一个或者几个
线程处理多个 TCP 连接,最大优势是减少系统开销,不必创建过多的线程进程,也不必维护这些线程进
程
文件描述符 writefds、readdfs、exceptfds30w个连接会阻塞住,等数据可读、可写、出异常、或者超
时返回select 函数正常返回后,通过遍历 fdset整个数组才能发现哪些句柄发生了事件,来找到就绪的
描述符fd,然后进行对应的 IO操作,几乎在所有的平台上支持,跨平台支持性好缺点:
基本流程和 select差不多,处理多个描述符也是轮询,根据描述符的状态进行处理,一样需要把fd集合
从用户态拷贝到内核态,并进行遍历。区别是poll 没有最大文件描述符限制(使用链表方式存储fd)
没有描述符限制,用户态拷贝到内核态只需要一次使用事件通知,通过epoll_ctl注册fd,一旦该fd 就绪,
内核就采用callback机制激活对应的fd优点:
Reactor模式(反应器设计模式),是一种基于事件驱动的设计模式,在事件驱动的应用中,将一个或
者多个客户的请求进行分离和调度。在事件驱动的应用中,同步地,有序地处理接受多个服务请求。属
于同步非阻塞 IO优点:
一个 Acceptor线程,一组 NIO 线程,一般是使用自带线程池,包含一个任务队列和多个可用线程场
景:可满足大多数场景,当Acceptor需要做负责操作的时候,比如认证等耗时操作 ,在高并发情况下
也会有性能问题
Acceptor不在是一个线程,而是一组 NIO 线程,IO 线程也是一组 NIO 线程,这样就是 2 个线程池去处
理接入和处理 IO场景:满足目前大部分场景,也是 Netty推荐使用的线程模型BossGroup 处理连接的
WorkGroup 处理业务的
在 linux系统上,AIO 的底层实现仍然使用 epoll,与 NIO 相同,因此在性能上没有明显的优势Netty 整
体架构是 reactor 模型,采用 epoll机制,IO 多路复用,同步非阻塞模型Netty是基于 Java NIO 类库实
现的异步通讯框架特点: 异步非阻塞,基于事件驱动,性能高,高可靠性,高可定制性。
回显服务,用于调试和检测的服务
高性能 RPC框架 3 个要素:IO 模型、数据协议(http,brotobuf/thrift)、线程模型EventLoop 好比一
个线程,一个 EventLoop可以服务多个Channel,一个Channel只有一个EventLoop,可以创建多个
EventLoop来优化资源的利用,也就是EventLoopGroup一个Cahnnel 一个连接,EventLoopGroup 负
责 EventLoop
NIO(单线程处理多个Channels) BIO(一个线程处理一个Channels)事件:
accept,connect,read,writeEventLoopGroup 默认创建线程数是 CPU 核数 * 2
EventLoopGroup g = new NioEventLoopGroup(1);
ServerBootstrap strap = new ServerBootstrap();
strap.group(g)复制代码
NioServerSocketChannelOioServerSocketChannelEpollServerSocketChannelKQueueServerSocket
Channel
用于对每个通道里面的数据处理
作用于被 accept之后的连接
作用于每个新建立的 channel,设置 TCP 连接中的一些参数
作用于被 accept之后的链接
用于对每个通道里面的数据处理
ChannelHandler生命周期:handlerAdded:当ChannelHandler添加到ChannelPipeline调用
handlerRemoved:当ChannelHandler从ChannelPipeline移除时调用exceptionCaught:执行抛出异常
时调用ChannelHandler有 2 个子接口:
ChannelInboundHandler(入站): 处理输入数据和Channel状态类型改变,适配器
ChannelInboundHandlerAdapter(适配器设计模式),常用
SimpleChannelInboundHandlerChannelOutboundHandler(出站):处理输出数据,适配器
Channel
ChannelPipeline:好比厂里的流水线一样,可以在上面添加多个ChannelHandler,也可以看成是一串
ChannelHandler 实例,拦截穿过Channel的输入输出 event,ChannelPileline实现了拦截器的一种高
级形式,使得用户可以对事件的处理以及ChannelHandler之间交互获得完全的控制权
InboundHandler顺序执行,OutboundHandler逆序执行
channel.pipeline().addLast(new OutboundHandler1());
channel.pipeline().addLast(new OutboundHandler2());
channel.pipeline().addLast(new InboundHandler1());
channel.pipeline().addLast(new InboundHandler2());
InboundHandler1 InboundHandler2 OutboundHandler2 OutboundHandler1InboundHandler1之
间通过 fireChannelRead()方法调用InboundHandler通过ctx.write(msg),传递到
OutboundHandlerctx.write(msg)传递消息,Inbound需要放在结尾,在 outbound之后,不然
outboundHandler不会执行,使用 channel.write(msg),或者 pipline.write(msg),就不用考虑(传播
机制)客户端: 发起请求再接受请求,先 outbound再inbound服务端:先接受请求再发送请求,先
inbound再outbound
netty中所有 I/0 操作都是异步的,意味着任何 I/0 调用都会立即返回,而ChannelFuture会提供有关的
信息 I/0 操作的结果或状态未完成:当 I/0 操作开始时,将创建一个新的对象,新的最初是未完成的,
它既没有成功,也没有被取消,因为 I/0 操作尚未完成。已完成:当 I/0 操作完成,不管是成功、失败
还是取消,Future都是标记为已完成的,失败的时候也有具体的信息,例如原因失败,但请注意,即使
失败和取消属于完成状态。
注意:不要在 IO 线程内调用Future对象的sync和await方法,不能在 channelhandler中调用 sync 和
await
继承 ChannelFuture,进一步扩展用于设置 IO 操作的结果
java序列化/反序列化,url编解码,base64编解码java自带序列化的缺点:
业界其他编解码框架:PB,Thrift,Marshalling,Kyro
Netty里面的编解码:
Decoder对应 ChannelInboundHandler,主要就是字节数组转换成消息对象方法:
Encoder 对应就是 ChannelOutboundHandler ,消息对象转换成字节数组编码器:
优点:成对出现,编解码都是在一个类里完成缺点:耦合,扩展性不佳
TCP 拆包:一个完整的包可能被 TCP 拆分成多个包进行发送TCP 粘包:把多个小的包封装成一个大的
数据包发送,client发送的若干数据包, server接收时粘在一个包发送方和接收方都可能出现这个原因发
送方的原因:TCP 默认会使用 Nagle算法接收方的原因:TCP 接收到数据放置缓存中,应用程序从缓存
中读取比较慢UDP 无粘包、拆包问题,有边界协议
发送方:关闭 Nagle 算法接收方:TCP 是无界的数据流,并没有处理粘包现象的机制,且协议本身无法
避免粘包,半包读写的发生需要在应用层进行处理应用层解决半包读写方法:
DelimiterBasedFrameDecoder:指定消息分隔符的解码器
LineBasedFrameDecoder:以换行符为结束标志的解码器
FixedLengthFrameDecoder:固定长度解码器
LengthFieldBasedFrameDecoder : message = header + body ,基于长度解码的通用解码器
LineBasedFrameDecoder:以换行符为结束标志的解码器StringDecoder 解码器将对象转成字符串
DelimiterBasedFrameDecodermaxLength: 表示一行最大的长度,超过长度依然没检测自定义分隔
符,抛出TooLongFrameExceptionfailFast: 如果为true,则超过 maxLength后立即抛出
TooLongFrameException,不进行继续解码,如果为 false,则等到完整消息被解码后,再抛出
TooLongFrameExceptionstripDelimiter:解码后的消息是否去除分隔符delimiters:分隔符,ByteBuf类
型
maxFrameLength 数据包最大长度lengthFieldOffset 长度字段的偏移量,长度字段开始的地方(跳过
指定长度个字节之后的才是消息体字段)lengthFieldLength 长度字段占的字节数,帧数据长度的字段
本身的长度lengthAdjustment一般 Header + Body ,添加到长度字段的补偿值,如果为负数,开发人员
认为这个Header的长度字段是整个消息包的长度,,则Netty应该减去对应的数字initialBytesToStrip
从解码帧中第一次去除的字节数,获取完一个完整的数据包之后,忽略前面的指定位数的长度字节,应
用解码器拿到的就是不带长度域的数据包
ByteBuf:传递字节数据的容器ByteBuf的创建方法:
Builder 构造器模式:ServerBootstrap责任链设计模式:pipeline的事件传播工厂模式:创建 channel
适配器模式:HandlerAdapter
root soft nofile 1000000
root hard nofile 1000000
* soft nofile 1000000
* hard nofile 1000000复制代码
fs.file-max=1000000复制代码
sysctl -p 重启生效参数cat /proc/sys/fs/file-max 查看全局fd数目
-Xms5g -Xmx5g -XX:NewSize=3g -XX:MaxNewSize=3g
浏览器同域名下资源加载有并发数限制,建议不同资源用不同域名输入域名-》浏览器内核调度-》本地
DNS 解析-》远程 DNS解析-》IP-》路由多层跳转-》目的服务器-》服务器内核-》应用程序
史上最全Java面试宝典,BAT大厂面试必备。整理不易,建议先关注点赞加收藏
序号 | 名称 | 地址 |
---|---|---|
1 | Java基础面试题(91道含答案) | (点击查看) |
2 | Java并发编程面试题 (123道含答案) | (点击查看) |
3 | Java异常面试题 (33道含答案) | (点击查看) |
4 | Java虚拟机(JVM)面试题(51道含答案) | (点击查看) |
5 | Java集合面试题(52道含答案) | (点击查看) |
6 | Linux面试题(50道含答案) | (点击查看) |
7 | Memcache面试题(23道含答案) | (点击查看) |
8 | Mybatiss面试题 (37道含答案) | (点击查看) |
9 | MySQL面试题(40道含答案) | (点击查看) |
10 | Netty面试题(49道含答案) | (点击查看) |
11 | Nginx面试题(23道含答案) | (点击查看) |
12 | RabbitMQ面试题(22道含答案) | (点击查看) |
13 | Redis面试题(70道含答案) | (点击查看) |
14 | SpringBoot面试题(44道含答案) | (点击查看) |
15 | SpringCloud面试题(49道含答案) | (点击查看) |
16 | SpringMVC面试题(29道含答案) | (点击查看) |
17 | Spring面试题(75道含答案) | (点击查看) |
18 | TCP、UDP、Socket、Http网络编程面试题(47道含答案) | (点击查看) |
19 | Tomcat面试题(15道含答案) | (点击查看) |
20 | Zookeeper面试题(28道含答案) | (点击查看) |
21 | 多线程面试题(60道含答案) | (点击查看) |
22 | 设计模式面试题(14道含答案) | (点击查看) |
23 | BIO、NIO、AIO、Netty面试题(35道含答案) | (点击查看) |
24 | Dubbo面试题(47道含答案) | (点击查看) |
25 | ElasticSearch面试题(31道含答案) | (点击查看) |
26 | Git常用命令(63条) | (点击查看) |