这是我参与更文挑战的第1天,活动详情查看: 更文挑战
什么是Netty?
Netty是JBOSS提供的Java开源的网络应用框架,是异步和基于事件驱动,用于开发高性能,高可靠性的网络IO程序。
思考介绍中的关键词:
-
什么是异步?
-
什么是基于事件驱动?
-
怎么实现高性能和高可靠性?
为什么需要Netty?
- 分布式系统中,各个节点之间需要远程调用,高性能的RPC框架必不可少,netty作为异步高性能的通信框架,作为基础通信组件被使用。
- NIO类库和API复杂使用麻烦,很难编写出高质量的NIO程序,开发工作量和难度都很大,比如客户端面临断连重连,网络闪断等,还有出现NIO的EpollBug,导致Selector空轮询,导致CPU100%。而Netty可以快速简单的开发出一个网络应用。
使用场景有哪些?
- Elasticsearch,Dubbo框架内部实现,
- 游戏行业,大数据行业。
IO模型
要想了解netty,需要先了解网络IO模型,用什么样的通道进行数据的发送和接收,很大程度上决定了程序的通信性能。接下来逐步分析BIO,NIO。提前需要了解的知识点:1 同步与异步 2 阻塞与非阻塞 。
什么是BIO模型?
- 同步阻塞,服务器实现模式为一个连接一个线程,会造成线程不必要的浪费;
- cmd命令执行Telnet 127.0.0.1 6666 可以连接到代码服务端,每起一个客户端连接就会创建一个线程,客户端连接后阻塞在read上;并发数较大时,需要创建大量线程来处理现象,占用系统资源。如下代码验证
public static void main(String[] args) throws IOException {
ExecutorService executorService = Executors.newCachedThreadPool();
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动");
while (true){
//等待客户端连接
Socket accept = serverSocket.accept();
System.out.println("有客户端连接");
executorService.submit(new Runnable() {
@Override
public void run() {
handler(accept);
}
});
}
}
public static void handler(Socket socket){
System.out.println("等待客户端操作+"+ Thread.currentThread().getName());
byte[] bytes = new byte[1024];
try {
InputStream inputStream = socket.getInputStream();
//循环读取客户端发送数据
while (true){
System.out.println("客户端连接后,阻塞在这里,一直等待客户端发送");
int read = inputStream.read(bytes);
if (read != -1){
//字节转字符串
System.out.println(new String(bytes,0,read).toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
复制代码
3 画图理解
喜欢就支持一下吧
相关推荐