目录
Netty 官网地址:http://netty.io/
GitHub 托管地址:https://github.com/netty/netty
Netty 用户指南官网地址:https://netty.io/wiki/user-guide.html
Netty 4.0 官网开发文档地址:https://netty.io/4.0/api/index.html
Netty 4.1 官网开发文档地址:https://netty.io/4.1/api/index.html
本文环境:Java jdk 1.8 + Netty-all 4.1.30.Final + Spring boot 2.3.5.RELEASE
Netty 网络框架概述
1、Netty 是 JBoss 公司用 Java 写的一个 Jar 包(库),目的是快速开发高性能、高可靠性的网络服务器和客户端程序
2、Netty 提供异步、无阻塞、事件驱动的网络应用程序框架和工具
4、Netty 是目前公认的网络编程最好的框架,官网地址:http://netty.io/
5、GitHub 托管地址:https://github.com/netty/netty
6、Netty 底层封装的也是 Java 的 NIO,所以也叫 NIO 框架,常用于开发分布式系统。
7、《Netty 权威指南》下载地址:https://download.csdn.net/download/wangmx1993328/10717896.
Netty Features( 特色)
Design( 设计) | 统一的 API,适用于不同的协议(阻塞和非阻塞) 基于灵活、可扩展的事件驱动模型 高度可定制的线程模型,单线程、多线程池 可靠的无连接数据Socket支持(UDP) |
Ease of use( 易用性) | 丰富的 JavaDoc(开发文档)、用户指南、以及示例 最早 Java 网络编程:使用 java.net + java.io,熟悉的 Socket API 就是在 java.net 包中。 |
Performance( 性能) | 更好的吞吐量,低延迟 (Better throughput, lower latency) 更省资源 (Less resource consumption) 尽量减少不必要的内存拷贝 (Minimized unnecessary memory copy) 不再因过快、过慢或超负载连接导致 OutOfMemoryError 不再有在高速网络环境下 NIO 读写频率不一致的问题 |
Security( 安全) | 完整的 SSL/TLS 和 STARTTLS 的支持 (Complete SSL/TLS and StartTLS support) 能在 Applet 与 Android 的限制环境运行良好 |
Netty VS Mina
1、JBOOS 的 Netty 与 Apache 的 Mima 都是目前 Java 网络编程主流的框架之一。
2、Mina 将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比之下性能会有所下降,而 Netty解决了这个设计问题
3、Netty 的文档更清晰,很多 Mina 的特性在 Netty 里都有
4、Netty 更新周期更短,新版本的发布比较快
5、两者架构差别不大,Mina 靠 apache生存,而 Netty 靠 jboss,和 jboss 的结合度非常高,Netty 有对 google protocal buf 的支持,有更完整的 ioc 容器支持( spring,guice,jbossmc 和 osgi);
6、Netty 比 Mina 使用起来更简单,Netty 中可以自定义的处理 upstream events 和 downstream events,可以使用 decoder 和encoder 来解码和编码发送内容
7、Netty 和 Mina 在处理 UDP 时有一些不同,Netty 将 UDP 无连接的特性暴露出来;而 Mina 对 UDP 进行了高级层次的抽象,可以把 UDP 当成"面向连接"的协议,而要 Netty 做到这一点比较困难。
应用领域
一:互联网行业
1、随着网站规模的不断扩大,系统并发访问量也越来越高,传统基于 Tomcat 等 Web 容器的垂直架构已经无法满足需求,需要拆分应用进行服务化,以提高开发和维护效率。从组网情况看,垂直的架构拆分之后,系统采用分布式部署,各个节点之间需要远程服务调用,高性能的 RPC(Remote Procedure Call Protocol-远程过程调用协议) 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。
2、典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信,它的架构图如下:
3、其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用 Netty 进行异步/同步通信。
4、除了 Dubbo 之外,淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通信。
5、除了阿里系和淘宝系之外,很多其它的大型互联网公司或者电商内部也已经大量使用 Netty 构建高性能、分布式的网络服务器。
二:游戏行业
1、无论是手游服务端、还是大型的网络游戏,Java 语言得到了越来越广泛的应用。Netty 作为高性能的基础通信组件,它本身提供了 TCP/UDP 和 HTTP 协议栈,非常方便定制和开发私有协议栈。
2、账号登陆服务器、地图服务器之间可以方便的通过 Netty 进行高性能的通信,架构示意图如下:
三:大数据领域
1、经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通信,它的 Netty Service 基于 Netty 框架二次封装实现。
2、大数据计算往往采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。由于 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,因此,往往会被选中用作大数据各节点间的通信。
四:通信行业
1、Netty 的异步高性能、高可靠性和高成熟度的优点,使它在通信行业得到了大量的应用。
Netty 编码快速入门
1、进入 Netty 官网,鼠标悬停在 "Downloads" 上,可以下载二进制 Jar 包,其中有一个 netty-example-x.x.x.Final.jar 的示例包,其中提供了大量的示例,非常适合学习。
2、如果使用 Maven 进行项目开发管理,则可以从 Netty 官网下载页中获取,或者从 Maven 官方仓库获取。
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.30.Final</version>
</dependency>
3、先实现一个简单收发消息:开启服务器->开启客户端->给服务器发送一条消息->服务器接收消息并回复->客户端收到回复然后关闭退出(暂时不考虑读半包情况)。
4、在线演示源码:
https://gitee.com/wangmx1993/java-se/tree/master/src/main/java/org/example/netty/helloWorld
5、先运行服务端,再运行客户端:
Spring boot + Netty 发送消息
1、在上面的基础上稍作修改,实现从页面输入消息内容,然后调用 Controller 接口,接着连接 Netty 服务器并发送消息,然后收到回复,关闭连接,返回给页面.
2、在启动类 @SpringBootApplication 的 main 方法中启动 Netty 服务。
在线演示源码:
https://gitee.com/wangmx1993/java-se/blob/master/src/main/java/org/example/JavaseApplication.java
https://gitee.com/wangmx1993/java-se/blob/master/src/main/java/org/example/netty/springBoot