5.Neety入门
什么是Netty
Netty
是一个基于Java NIO
的异步事件驱动的网络应用框架
。它被广泛用于开发高性能
、高可靠性的网络通信程序
,特别是服务器端和客户端程序。Netty提供了简洁而强大的API,使得开发者能够轻松地构建各种网络应用,包括实时通信系统、游戏服务器、分布式系统等。Netty的主要特点包括:
- 异步和事件驱动:
Netty基于事件驱动模型
,使用异步的方式处理网络IO操作
,可以处理大量的并发连接而不需要大量的线程。- 高性能:Netty采用了高效的NIO模型,以及优化的数据结构和算法,能够实现出色的性能表现。
- 可定制性:Netty提供了丰富的组件和可定制的API,使得开发者可以根据自己的需求对网络通信进行灵活的定制和扩展。
- 多协议支持:Netty支持多种常见的网络协议,包括
HTTP
、WebSocket
、TCP
、UDP
等,使得开发者可以轻松地实现各种类型的网络应用。
Netty的地位
以下是一些使用Netty框架的知名项目和框架:
- Apache Kafka:Kafka是一个分布式流处理平台,它使用Netty来处理网络通信,实现高效的消息传输。
- Elasticsearch:Elasticsearch是一个分布式搜索引擎,它使用Netty作为其节点之间通信的底层框架。
- gRPC:gRPC是一个高性能的远程过程调用框架,它使用Netty来实现底层的网络通信。
- Apache Dubbo:Dubbo是一个高性能的分布式服务框架,它使用Netty作为其网络通信的实现方式。
- RocketMQ:RocketMQ是一个开源的分布式消息队列,它使用Netty来实现消息的传输和通信。
- Spring 5:Spring 5 引入了对反应式编程的支持,使得开发人员可以更轻松地构建异步和非阻塞的应用程序,而 Netty 作为其底层的网络通信实现之一。Flux API完全抛弃Tomcat 使用Netty作为服务端
- Zookeeper:Zookeeper 是一个开源的分布式协调服务,用于管理和协调分布式系统中的各种信息,比如配置管理、命名服务、分布式锁等。
Netty的优势
Netty相对于Java NIO具有以下优势:
- 简化的编程模型:Netty提供了更高级别的抽象,使得开发者可以更轻松地编写网络应用程序。Netty隐藏了许多底层细节,提供了易于理解和使用的API,使得开发者能够更专注于业务逻辑的实现。
- 丰富的功能和组件:Netty提供了许多预置的编解码器、处理器和插件,涵盖了各种常见的网络通信场景,例如HTTP、WebSocket、UDP等。开发者可以直接使用这些组件,而无需重复实现相同的功能,大大加速了开发过程。
- 高性能和可靠性:Netty在底层实现了高效的事件驱动模型和异步IO机制,能够实现更高的吞吐量和更低的延迟。开发者可以借助Netty的优秀性能,构建高性能、高可靠性的网络应用程序。
- 可扩展性和灵活性:Netty的组件化设计使得它具有很好的可扩展性和灵活性。开发者可以根据自己的需求选择合适的组件和插件,或者自行扩展和定制特定的功能,从而更好地满足业务需求。
- 文档和社区支持:Netty拥有丰富的文档和活跃的社区支持,提供了大量的教程、示例代码和问题解答,帮助开发者快速上手并解决问题。开发者可以通过文档和社区获取到丰富的资源和支持,加速开发过程。
5.1.Hello World
5.1.1.目标
开发一个简单的服务器端 和 客户端
- 客户端向服务器端发送 Hello,World
- 服务器仅接收,不返回
implementation 'io.netty:netty-codec-http:4.1.106.Final'
5.1.2.服务器端的代码实现
public class HelloServer {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
public static void main(String[] args) {
// ServerBootstrap 是一个启动 NIO 服务的辅助启动类
// 1.负责组装Netty组装组件,启动服务器
new ServerBootstrap()
// 2。配置两个NioEventLoopGroup,一个用于接收客户端连接,另一个用于处理客户端读写
// NioEventLoopGroup 是一个处理I/O操作的多线程事件循环 NioEventLoopGroup(selector,thread)(包含 选择器 和 线程 )
.group(new NioEventLoopGroup())
// 3.Netty 支持多种协议,这里是 NIO 的实现 还有OIO BIO ,EPOLL 等
.channel(NioServerSocketChannel.class)
// 4.配置ServerSocketChannel的选项 将来处理褚时间的一个分工,决定了worker(child)能执行哪些操作(handler)
.childHandler(
// 5.channel代表和客户进行数据读写的通道 Initializer代表初始化器 负责添加别的handler
new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) throws Exception {
// 6.添加具体的handler
// 6.1.添加StringDecoder解码器 数据传输过来的时候,会先经过这个解码器(数据传输的时候都是ByteBuf) 解码成String
ch.pipeline().addLast(new StringDecoder());
// 6.2.添加ChannelInboundHandlerAdapter处理器(自定义的业务处理器)
ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 读时间处理器
logger.info("server receive msg: {}", msg);
}
});
}
// 7.绑定的监听端口
}).bind(8080);
}
}
5.1.3.客户端代码实现
public class HelloClient {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()