- 1.TCP为什么是四次挥手,而不是三次?
- 2.Java性能之优化RPC网络通信
- 3.深入了解NIO的优化实现原理
- 4.Epoll的本质(内部实现原理)
- 5.多路复用器Selector
- 6.多线程调优(上):哪些操作导致了上下文切换
- 7.深入理解 NioEventLoop启动流程
- 8.磨刀不误砍柴工:欲知JVM调优先了解JVM内存模型
- 9.TCP粘包,拆包及解决方法
- 10. ET/LT模式区别
- 12. Reactor模型
- 13. ServiceLoader使用看这一篇就够了
- 14.Netty解决粘包和拆包问题的四种方案
- 15.Netty源码(四):Netty的“二次解码器”MessageToMessageDecoder
- 16.Netty从入门到秃头(五):keepalive与idle
- 17.Netty精粹之轻量级内存池技术实现原理与应用
- 18.Netty学习—Selector
- 19.ServerSocket 与 Socket的区别
- 20. Netty 源码解析 ——— 基于 NIO 网络传输模式的 OP_ACCEPT、OP_CONNECT、OP_READ、OP_WRITE 事件处理流程
- 21.一道Netty面试题:boss线程池和worker线程池能不能合在一起?
- 22.Netty 核心组件 Pipeline 源码分析(一)之剖析 pipeline 三巨头
- 23.Netty内存管理器ByteBufAllocator及内存分配
- 24.Netty | 设置高低水位线避免 OOM
- 25.Netty如何发送消息(writeAndFlush)
- 26.Netty之ByteBuf介绍
- 27.ChannelFuture的用法
- 28.调优参数:权衡Netty核心参数
- 29.Netty中ChannelHandler共享数据的方式
- 30.netty 堆外内存泄露排查盛宴
- 31.Netty之内存泄露
- 32.优化使用:“整改”线程模型让”响应”健步如飞
- 33.Netty | 流量整形
- 33.《netty系列教程》 IP黑名单过滤
- 34. 安全增强:少不了的自定义授权
- 35.安全增强:拿来即用的SSL-轻松融入案例
1.TCP为什么是四次挥手,而不是三次?
https://www.zhihu.com/question/63264012
TCP 包含 三次握手 四次挥手
四次挥手
数据发起方发起的停止请求代表数据终止传输,接受方再发起关闭请求才是关闭请求
2.Java性能之优化RPC网络通信
https://blog.csdn.net/sevencuecue/article/details/101301381
RPC 包含 RMI
RMI jdk自带的RPC框架 使用短链接 默认的jdk序列化
RPC 关联 Netty
Netty 关联 主从Reactor多线程
3.深入了解NIO的优化实现原理
https://time.geekbang.org/column/article/100861
IO多路复用 包含 epoll select poll
4.Epoll的本质(内部实现原理)
https://zhuanlan.zhihu.com/p/63179839
epoll 关联 poll select
文件描述符fd(linux将所有外部设备看成文件)
select和poll 当有io准备完成,进程只知道有IO事件, 所以需要将当fd_set传入内核态遍历一遍才知道哪个IO准备就绪了.
fd_set 在poll是链表 select是数组
epoll通过epoll_ctl()将fd描述符注册在内核态的时间列表中(红黑树),数据准备就绪后修改rdlist中状态并唤醒进程,并返回rdist给进程
5.多路复用器Selector
https://www.jianshu.com/p/e8f76cef72ed
NIO
SelectorProvider 决定了使用哪种方式(select(windows),kqueue(mac),epoll(linux))作为默认的多路复用的方式
6.多线程调优(上):哪些操作导致了上下文切换
https://time.geekbang.org/column/article/102619
上下文切换 包含 自发性上下文切换 非自发性上下文切换
由程序主导如等待IO sleep yield等为自发性上下文切换
由cpu,或虚拟机主导的为非自发性上下文切换,如高并发下争抢cpu资源,虚拟机垃圾回收导致的stop-the-world
上下文切换
在低并发下,串行执行的效率大于并行的原因是因为上下文切换消耗资源
vmstat,pidstat查看上下文切换
7.深入理解 NioEventLoop启动流程
https://www.cnblogs.com/ZhuChangwu/p/11196791.html
netty 包含 NioEventLoop ioRatio
ioRatio用来控制 IO任务处理时间和非IO任务处理时间比例
epoll 关联 epoll空轮询bug
8.磨刀不误砍柴工:欲知JVM调优先了解JVM内存模型
JMM
1.JMM向操作系统申请内存,并根据配置分配堆栈,方法区大小
2.class文件加载,验证,准备,解析 为静态变量分配内存
3.执行构造器
4.启动并执行 main方法
9.TCP粘包,拆包及解决方法
https://www.cnblogs.com/panchanggui/p/9518735.html
TCP 包含 拆包 粘包
- 粘包是因为socket缓冲区大小太大, 导致一次发了两个包
- 拆包是因为socket缓冲区大小太小,一次包拆成了两次发送,或者发送的数据大小超过了协议的MTU
- 解决方案,为每个请求包设置边界,请求头包含请求包大小
10. ET/LT模式区别
https://blog.csdn.net/YMY_mine/article/details/81212731
epoll 包含 边缘触发 水平触发
水平触发: 调用epoll_wait()时只要pipe有数据,就会通知线程
边缘触发: 调用epoll_wait(), 一次请求只会触发一次读取,即使因为缓冲区大小导致一次没有读完,也不会触发读取. 所以为了防止没有后续数据导致无法读取完数据, 需要设置为非阻塞
12. Reactor模型
https://www.jianshu.com/p/da96ff9066a3
IO多路复用 包含 单线程Reactor 多线程Reactor 主从Reactor
主从reactor将 接受数据用一个单独线程reactor去接受数据,并将 decode compute encode 操作用一个线程池来处理 read send用reactor处理
13. ServiceLoader使用看这一篇就够了
https://www.jianshu.com/p/7601ba434ff4
SPI 包含 serviceLoader
查找并创建 META-INF/services 所有的对应名称的类
14.Netty解决粘包和拆包问题的四种方案
https://www.cnblogs.com/AIPAOJIAO/p/10631551.html
一次解码器 关联 粘包 拆包
接受数据的reactor用数据累积起累积获取的数据 FrameDecoder
netty使用 固定长度解码器(FixedLengthFrameDecoder) ,分隔符解码器(DelimiterBasedFrameDecoder),固定长度额外字段存长度信息(LengthFiledBasedFrameDecoder) 来处理粘包和拆包
固定长度解码器浪费空间,因为若长度不足,需要空白对齐
分隔符解码器 需要扫描内容
固定长度额外字段存长度信息解码器 实现比较复杂
15.Netty源码(四):Netty的“二次解码器”MessageToMessageDecoder
https://blog.csdn.net/qq_35688140/article/details/105483880
netty 包含 一次解码器 二次解码器
一次解码器 转成 字节数组(byteBuf)
二次解码器将 byteBuf 转为java对象
二次解码器
16.Netty从入门到秃头(五):keepalive与idle
https://blog.csdn.net/ShallDid/article/details/107597781
netty 关联 keepalive idle
idle检测数据是否有传输,减少keepalive包次数 IdleStateHandler
17.Netty精粹之轻量级内存池技术实现原理与应用
https://www.cnblogs.com/wxd0108/p/6681623.html?utm_source=itdadao&utm_medium=referral
netty 关联 内存池 堆外内存
18.Netty学习—Selector
https://www.jianshu.com/p/9b5138855891
netty 包含 selector channel
selector的作用是轮询channel的状态是否可读,并进行IO操作
selector是在 new NIOEventLoopGroup()的时候创建的
19.ServerSocket 与 Socket的区别
https://www.cnblogs.com/mareymarey111/archive/2011/12/08/2280253.html
serverSocket 关联 socket
serverSocket用于绑定固定端口,accept()客户端请求. accept()成功后转让处理权限,并返回一个socket用于与客户端进行通信
socket用来与客户端通信
serverSocketChannel 关联 socketChannel
serverSocketChannel用于绑定固定端口,accept()客户端请求. accept()成功后转让处理权限,并返回一个socketChannel用于与客户端进行通信
socketChannel用来与客户端通信
channel 包含 serverSocketChannel socketChannel
20. Netty 源码解析 ——— 基于 NIO 网络传输模式的 OP_ACCEPT、OP_CONNECT、OP_READ、OP_WRITE 事件处理流程
https://www.jianshu.com/p/12dd57758eb5
selector 包含 OP_ACCEPT OP_CONNECT OP_READ OP_WRITE
channel 注册到selector上返回selectionKey, 并用selectionKey订阅感兴趣的事件
selector 用 selector.select() / selectNow()/ select(timeoutMillis) 来发现OP_ACCEPT事件
ServerSocketChannel 关联 OP_ACCEPT
op_accept 指的是接受客户端请求 由 boss线程注册该事件
SocketChannel 关联 OP_CONNECT OP_READ OP_WRITE
OP_CONNECT 代表与客户端连接已经建立
OP_READ 有数据已经准备就绪, workerThread注册该事件,一次读事件可能包含多次读操作,最多连续读16次
OP_READ 当断开连接的时候,也会触发该事件,此时读取字节数为-1
OP_WRITE 表示当前能够写入数据的一个状态,而不是有数据要写, 当worker无法写入数据(数据已经写满)时注册该事件,等待通知再写入.所以一般情况下不用注册,否则会一直触发
21.一道Netty面试题:boss线程池和worker线程池能不能合在一起?
https://blog.csdn.net/u013374645/article/details/89006955
netty 包含 main线程 boss线程 worker线程
main线程 就是用来创建netty服务的线程
boos线程 用来绑定服务器端口,每绑定一个端口就创建一个boss线程
worker线程 为socketChannel提供读写io的服务, 与socketChannel为多对多的关系
22.Netty 核心组件 Pipeline 源码分析(一)之剖析 pipeline 三巨头
https://www.jianshu.com/p/18e53b6b224f
netty 包含 pipeline
pipeline用来串联channel的各个动作,如 一次解码,二次解码 类似于 tomcat中的过滤器
pipeline 关联 ChannelInBoundHandler
业务处理就是注册一个handler(实现ChannelInBoundHandler)到pipeline上 ,重写channelRead()
默认处理线程就是 NioEventLoop线程,也可以通过 pipeline.addLast(,)来设置线程
23.Netty内存管理器ByteBufAllocator及内存分配
https://www.cnblogs.com/wuzhenzhao/p/11287903.html
netty 包含 ByteBufAllocato
24.Netty | 设置高低水位线避免 OOM
https://www.jianshu.com/p/092ded8d1f8c
netty 包含 水位线
写入数据的时候若无法写入会放在channel的写缓冲区中, 当超过一定数量,触发高水位线
25.Netty如何发送消息(writeAndFlush)
https://www.jianshu.com/p/d1005f5375ea
netty
netty写数据时 write写入ChannelOutboundBuffer flush将ChannelOutboundBuffer的数据发送出去
26.Netty之ByteBuf介绍
https://www.jianshu.com/p/380a006a51e4
netty 包含 ByteBuf
netty中最基础的数据结构, 用来接收处理完半包拆包问题的tcp帧转成字节数组,最后转成java对象. (反过来转化是发送数据)
27.ChannelFuture的用法
https://www.jianshu.com/p/4835eb4e91ab
netty 包含 channelFuture
channelFuture用来保存channel异步操作的结果 .sync() 会使当前线程进入 wait状态
28.调优参数:权衡Netty核心参数
https://time.geekbang.org/course/detail/100036701-168359
netty 包含 netty调优系统参数 netty调优核心参数
netty调优系统参数
linux文件句柄最大数量 ulimit -n
TCP_NODELAY 是否禁用Nagle算法(小碎片合并发送)
SO_BACKLOG 最大等待连接数
SO_SNDBUF SO_RCVBUF—TCP发送接受缓冲区大小 SO_KEEPALIVE—默认关闭 不用开启,系统默认开启 SO_REUSEADDR—(不懂)多网卡绑定相同端口 SO_LINGER IP_TOS
netty调优核心参数
WRITE_BUFFER_WATER_MARK 高低水位线 [32k, 64k]
CONNECT_TIMEOUT_MILLIS 客户端(连接)服务器最大时间 (30s)
MAX_MESSAGE_PER_READ WRITE_SPIN_COUNT 连续读 连续写次数 (16)
ALLOCATOR RCVBUF_ALLOCATOR bytebuf分配器大小
29.Netty中ChannelHandler共享数据的方式
https://blog.csdn.net/u013721793/article/details/51204029
netty 包含 ChannelHandler
30.netty 堆外内存泄露排查盛宴
https://www.jianshu.com/p/4e96beb37935
netty 包含 内存泄漏
31.Netty之内存泄露
https://www.cnblogs.com/it-davidchen/p/11193961.html
内存泄漏
内存泄漏有 DISABLED SIMPLE(默认) ADVANCED PARANOID(偏执)四种
32.优化使用:“整改”线程模型让”响应”健步如飞
https://time.geekbang.org/course/detail/100036701-171284
netty
netty单独设置子线程线程池时,应当另外创建,而不是使用 NioEventGroupLoop
33.Netty | 流量整形
https://www.jianshu.com/p/27067b16f32e
netty 包含 流量整形
33.《netty系列教程》 IP黑名单过滤
https://www.jianshu.com/p/b5b89666e121
netty 包含 netty黑名单过滤
34. 安全增强:少不了的自定义授权
https://time.geekbang.org/course/detail/100036701-174511
netty 包含 netty授权
35.安全增强:拿来即用的SSL-轻松融入案例
https://time.geekbang.org/course/detail/100036701-174514
netty 包含 nettySSL加密
sslHandler
