1、课程背景
现在的互联网环境下,分布式系统大行其道,而分布式系统的根基于网络编程,而netty恰恰是java领域编程的王者。如果要致力于开发高性能的服务器程序,高性能的客户端程序,必须掌握netty,而本课程就是带领你进入基于netty的网络编程世界。
2、课程概述
本课程从基础nio编程开如,从netty入门到进创,参数优化到源码分析,由浅入深,为netty学习打下坚实基础。本课程的目标带你netty入门,理解基本原理和高效原因,并具务一定的netty编码能力。
3、主要内容
第一部分NIO编程,会详细讲解nio的Selector,bytebuffer,channel三大组件,建议即便之前有nio基础的同学也不错这一部分的学习。
第二部分进入netty入门学习,会介绍eventLoop,channel,future,pipline,handler,bytebuffer等重要组件。
第三部分是netty进阶学习,会介绍粘包半包的解决方法,协议的设计,序列化知识,使用聊天室案例将这些知识点串起来,为了大家专注学习netty编程,并没有引入第三方的框架,如spring,websocket等,免得分散注意力。
第四部分netty常见参数的学习及优化。
第五部分是源码分析,这里的源码分析侧重netty的服务启动,建立连接,读取数据,eventLoop处理事件的流程,不牵扯更多的源码。
NIO基础:non blocking io非阻塞性IO
1、三大组件channel&buffer
channel有一点类似于Stream,它就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer的数据写入channel,而之前的Stream要么是输入,要么是输出,channel比stream更为底层。
常见的channel有
filechannel : 文件的channel
datagramchannel :udpchannel
socketchannel:tcpchannel
serversocketchannel:socketchannel
buffer则用来缓冲读写数据,常见的buffer有
Bytebuffer
mappedByteBuffer
DirectByteBuffer
HeapByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
1.2Selector
selector单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途。
多线程设计:
多线程的缺点:
内存占用高
线程上下文切换成本高
只适合连接少的场景
线程池版设计:
线程池的缺点
阻塞模式下,线程仅能处理一个socket连接
仅适合短连接场景。
selector版本设计
select版本作用就是配合一个线程来管理多个channel,获取这些channel上发生的事件,这些channel工作在非阻塞模式下,不会让线程死在一个Channel上,适合连接数特别多,但流量多的场景。
调用selector的Select会阻塞到channel发生读写就绪的事件,这些事件发生select方法就会返回这些事件交给thread来处理。
2.2ByteBuffer结构:
byteBuffer有以下属性
capacity ---容量
position -- 读写指针
limit--读写限制
一开始
position limit写入限制 capacity容量
写模式,position是写入位置,limit等于容量,下图表示写入4个字节后的状态。
当发生flip的时候,positon切换为读取位置,limit切换为读取限制。
读取4个字节后,状态