netty概要

netty是一个异步非阻塞的通信框架(类似的框架还有mina,grizzly)。

底层封装了NIO2.0模块,即AIO。

好处:使用起来无需关注如何连接,只需关注业务逻辑处理代码,而且性能高效。遵循servlet3.0标准规范的,和tomcat等web容器不同的是异步非阻塞。tomcat容器支持最大并发量大概在800左右。而且netty也不算是web容器。

使用流程:
服务端:配置端口,长连接还是短连接(针对业务,比如聊天一般用长连接,和客户端保持连接,短连接是针对是数据量大连接次数少的情况,比如一小时上传文件4到5次),最后要调用下异步关闭,否则服务端会关闭的,一般我们是不允许服务端关闭的。

应用场景:作为路由网关、文件上传和下载,消息通信,心跳检测等。

拆包粘包问题:设置定长(一次只能传输200K以下的数据,小于200k的后面以空格补全)、设置特殊分割符(编解码)、自定义协议(实现编解码的接口,进行扩展而已)。

编解码(序列化):传输数据如果为对象,实体类必须要实现serialable接口,但java序列化码流大,传输慢,性能低。可以使用joss框架Marshalling+压缩解压缩这样的方式实现。

业务问题:
1、若客户端和服务端为短连接,规定时间内(比如5秒)不传输数据默认断开,如何实现?
调用readTimeoutHandler(5)。
2、若客户端和服务端断开连接后,客户端再次发送请求,如何才能保证服务端接收到数据?
在客户端初始化的时候,判断下客户端是否服务端保持连接,如果没有,重新连接下。

摘自:https://github.com/ouzhrm/netty_study/blob/master/README.md

组件

8d62e892-ccd1-49e4-8944-a23665e2d9f3-image.png

ByteBuf

Channel 和 Unsafe

OioServerSocketChannel 和 OioSocketChannel

NioServerSocketChannel 和 NioSocketChannel

ChannelPipeline 和 ChannelHandler

Future 和 Promise

EventLoop 和 EventLoopGroup

ServerBootstrap 和 Bootstrap

启动类

Encode 和 Decoder

协议~