1.前言
之前学的Netty,后面全忘了... 最近复习一下,把笔记总结温习一遍~ 这里把几种线程模型也总结了,相当于是一步一步,推出Netty底层线程模型的由来
2.Netty是什么?
Netty是一个基于事件驱动的 异步的网络模型; 其次Netty是主从Reactor的基础上改进了,加了Selector等(之前没学明白的时候一直被Selector和Reactor搞迷糊)
有了NIO为什么还要有netty?
原来的NIO比较复杂,而且NIO涉及到Reactor模式,必须对多线程比较熟悉,开发工作量比较大;还有NIO里面可能会导致Selector空轮询,导致CPU 100%;
3.Netty底层原理是什么?(线程模型)
1.传统的阻塞I/O服务
针对这种传统的IO阻塞模型解决办法:
1.基于io复用模型,每个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象中等待,无需阻塞等待所有的连接,当某个连接有新的数据可以处理时,操作系统就通知对应的程序 从阻塞状态返回,分给后面的线程去处理
**2.基于线程池复用线程资源,**不必为每个连接创建线程,将连接完成的业务处理分配给线程池处理,一个线程可以处理多个连接的业务
2.单Reactor单线程
弊端:
单线程是可能阻塞的,只能处理一个
3.单Reactor多线程
这个他的接收分发还是一个主线程下的,还是单线程处理的,高并发下也会出现问题
4.多Reactor多线程
5.Netty模型
pipeline获取到对应的管道channle, 最后处理数据会使用到pipeline,里面包含了channle,pipeline里面有很多的处理器!自定义的,编码器解码器 自定义处理器等
boosGroup只是处理连接请求,真正处理业务的是workerGroup
私聊聊天系统的实现,用一个map去存,然后发送消息的时候,把map里存的channel取出来
protobuf和那个序列化器是什么关系?
服务器端和客户端可以共用一个编码器和解码器,但是不是说inhandler和outhandler不一样吗 ! 难道是因为 其实还是一条线上的,只不过对应不同的输入和输出,两个编码器解码器的状态不一样,可以改变状态