一、为什么使用Netty做为网路通信

Netty 官方介绍

https://netty.io/

Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.

Netty 是一个异步事件驱动的网络应用框架。
用于快速开发可维护的高性能协议服务器和客户端。

Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.

'Quick and easy' doesn't mean that a resulting application will suffer from a maintainability or a performance issue. Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, Netty has succeeded to find a way to achieve ease of development, performance, stability, and flexibility without a compromise.

Netty 是一个 NIO 客户服务器框架，它能够快速和容易地开发网络应用，如协议服务器和客户端。它大大简化和精简了网络编程，如 TCP 和 UDP 套接字服务器。

快速和简单 " 并不意味着开发出来的应用程序会出现可维护性或性能问题。Netty 的设计是经过精心设计的，其经验来自于许多协议的实施，如 FTP、SMTP、HTTP 以及各种基于二进制和文本的遗留协议。因此，Netty 成功地找到了一种方法来实现开发的简易性、性能、稳定性和灵活性，而没有任何妥协。

为什么要学习 Netty?

Netty 已经是行业内网络通信编程的标准，广泛应用于通信领域和很多其他中间件技术的底层。

应用非常广泛

游戏行业

很多框架的通信底层，解决进程间通信。
Spring WebFlux、storm、rocketMQ、dubbo 等，是分布式系统，通信的核心。

传统 io 有何问题？

1、多线程网络编程

1.1 线程创建开销

传统 io 通信使用多线程，每一个客户端连接在服务器程序中都会开启一个线程，开启一个线程和关闭一个线程都是有开销的。

2.2 CPU 使用率高

假设 1000 个线程同时存在，每个线程的时间片用完后，上下文的切换 (上文切换可以理解为操作系统会保存时间片用完时所执行到的地方以便下次获得时间片时可以继续从这个地方开始执行)，都会有开销。

2.3 内存占用率高，不可能无限创建线程
硬件资源是很珍贵的，一个线程在 java 中大约占 1MB，大量的创建会导致内存不足。

2、线程池网络编程

池化思想解决了无限创建线程的问题，且在代码中可以利用多核 cpu 的优势。
但是有一个新的问题会出现，即 假设有 100 线程进来，但是线程池中只有 10 个可以处理请求，多余的 90 个线程只能够在队列中排队等待线程的处理，就造成了阻塞的问题。
上面的例子还只是比较理想的状况，假设 进来的 10 个线程都因为某个原因一直阻塞在那里，则线程池中的 10 个线程都必须等待处理完这个 10 个请求才能去处理剩下的 90 个请求，阻塞的问题就非常严重了，就造成了有限资源的浪费。

总结

为什么使用 Netty，因为 Netty 底层使用了 NIO ，解决了上诉通信的问题。

完！！！