netty

Netty4.x 学习

Netty特点

  • 设计优雅--适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池;真正的无连接数据报套接字支持
  • 高性能,高吞吐,低延迟,零拷贝
  • 支持SSL/TSL 和 StartTLS,安全协议
  • 使用场景
    • 分布式系统中,远程服务相互通信如:分布式服务框架Dubbo, spark,hadoop

基础组件 -- 测试代码

  • ChannelInboundHandlerAdapter : 各种事件处理接口实现
    • channelRead -- 从客户端接收到消息的时候调用,处理消息
    • channelActive -- 连接建立完成,可以发送消息
  • NioEventLoopGroup : 是用来处理I/O操作的多线程事件循环器,Netty 提供了许多不同的 EventLoopGroup 的实现用来处理不同的传输
    • 第一个经常被叫做‘boss’,用来接收进来的连接。
    • 第二个经常被叫做‘worker’,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。
  • ServerBootstrap : 是一个启动 NIO 服务的辅助启动类
  • NioServerSocketChannel: 用来实例化新的channel,接收新来的连接
  • ChannelInitializer: 是一个特殊的处理类,他的目的是帮助使用者配置一个新的 Channel。

基本流程

Client流程
  • 1,初始化b = Bootstrap,服务辅助启动类
  • 2,初始化工作组,workGroup = NioEventLoopGroup,并设定到Bootstrap,b.group(workGruop)
    • 是用来处理I/O操作的多线程事件循环器
    • 每次connect的时候开启一个线程,NioEventLoop
    • 默认16个NioEventLoop,需要的时候启动线程
  • 3,设定channel类型,NioSocketChannel.class
  • 4,channel的参数设置
  • 5,指定处理器
    • 解码处理器TimeDecoder
    • 消息处理器TimeClientHandler
  • 6,通过Bootstrap,连接指定的服务器,b.connect(host,port)
    • 6.1, 新建NioSocketChannel : channel
    • 6.2, 初始化channel,
      • 默认handler添加
      • 设置channel的一些参数
    • 6.3, 从workGroup获取一个NioEventLoop,并启动线程,run循环运行,处理task
    • 6.4, 给eventloop添加一个registTask
    • 6.5, eventloop线程异步执行registTask
      • 在eventloop的Selector上注册,不关注任何事件,返回selectionKey给channel,channel就可以通过selectionKey注册自己感兴趣的事件
      • 更新bootStartp的注册状态,标记已经注册完成
      • 给eventLoop添加一个连接任务connectTask
      • channel的pipeline上添加的handler 链式调用handler的channelRegistered
        • TimeDecoder.channelRegistered,没有处理
        • TimeClientHandler.channelRegistered
    • 6.6, eventloop线程异步执行connectTask
      • Channel 通过socket连接服务器
      • 在eventloop上注册selectKey 添加连接connect事件
    • 6.7 connect 就绪事件,eventloop线程异步执行
      • SocketChannelImpl调用finishConnect _ 6.8, read 就绪事件,eventloop线程异步执行
      • TimeDecode handler的channelRead,将输入字节转换时间对象
      • TimeClientHandler的channelRead,读取信息消费,打印服务器发送过来的内容
channel 读写处理流程--服务端
  • 服务端,serverSocketChannel accept客户端SocketChannel
  • 给NioServerSocketChannel的pipeline触发一个读取事件,fireChannelRead,把客户端连接传输给pipeline的handler处理链一个个处理
  • 首先进入ServerBootstrap的channelRead
    • 分配一个workGroup的eventloop
    • 把accept的客户单channel注册到workGroup的eventloop
    • 启动eventloop线程,准备接受和处理客户单channel的读写请求
  • socketChannel的pipeline触发fireChannelActive
  • 链式调用handler的channelActive
    • TimeEncoder.channelActive,默认实现
    • TimeServerHandler.channelActive,写一个时间对象,ctx.writeAndFlush(new UnixTime())
  • ctx.writeAndFlush触发invokeWrite0,链式调用handler的write
    • TimeServerHandler context的write,默认实现
    • TimeEncoder context的write, 最终调用TimeEncoder的重写的encode方法实现编码
  • channel将信息返回
DefaultChannelPromise 异步处理协调
  • 应用场景
    • 1,promise添加listener,ChannelFutureListener,观察者模式
    • 2,主线程promise.sync,线程等待wait()
    • 3,eventloop异步处理,channel 注册到eventloop的selector完成
    • 4,eventloop异步处理,safeSetSuccess,调用所有注册的listener的operationComplete,
    • 5,eventloop异步处理,建立连接完成后,promise.trySuccess,主线程唤醒
    • 6,主线程从promise获取连接完成的channel
netty 心跳处理 TODO

参考资料

07-15
Netty 是一个基于 Java NIO 的异步事件驱动的网络应用框架,用于快速开发高性能、可维护的网络服务器和客户端。它提供了简单易用的 API,使得网络编程更加轻松[^3]。 ### Netty 使用指南 #### 基础知识准备 在开始学习 Netty 之前,建议掌握以下基础知识: - **Java 基础**:包括面向对象编程、集合框架、泛型、异常处理等。 - **网络编程基础**:理解 TCP/IP 协议栈、Socket 编程、HTTP 协议等。 - **I/O 模型**:了解阻塞 I/O (BIO)、非阻塞 I/O (NIO) 和异步 I/O (AIO) 的区别和应用场景[^1]。 #### 官方文档和教程 阅读 Netty 的官方文档是了解其设计理念和架构的最佳途径。此外,查阅 Netty 的 API 文档可以帮助熟悉类和接口的使用。对于初学者来说,可以从 优快云、博客园等技术社区寻找 Netty 的入门教程和示例代码。参考书籍如《Netty in Action》或《Netty权威指南》也是不错的选择[^1]。 #### 动手实践 通过编写简单的 Netty 服务器和客户端程序开始,例如 Echo Server。实践 Netty 的核心组件,如 Channel、ChannelHandlerContext、EventLoop、ChannelPipeline 筜[^1]。 #### 深入理解 学习 Netty 的事件模型和线程模型,理解其高并发的实现原理。阅读 Netty 的源代码,深入理解其内部工作流程和优化技巧。性能优化方面,学习 Netty 的性能调优,包括零拷贝、内存管理、线程池配置等。使用监控工具,如 Netty 自带的 metrics,分析和优化应用性能[^1]。 #### 项目实践 构建实际的网络应用,如聊天室、文件传输服务、微服务通信等。参与开源项目,贡献代码或修复问题,提升实战经验。加入 Netty 的官方论坛、GitHub 社区或相关技术群组,参与讨论,解决问题。关注 Netty 的更新动态,跟踪最新的特性和最佳实践。 ### 最新版本文档 Netty 的最新版本文档可以在其官方网站找到。这些文档详细介绍了 Netty 的核心组件,例如 Channel、EventLoop、ByteBuf、Handler 和 Pipeline,以及 Netty-SocketIO 特有的客户端和服务器接口,如 SocketIOClient 和 SocketIOServer。此外,还包括了 Socket.IO 的核心组件 EventEmitter、消息类型 Message、Namespace 特性等关键知识点。文档还提供了错误处理、连接管理、心跳机制、房间与群组功能、与其他协议集成的示例和指导,为构建高性能实时应用提供了宝贵资源[^4]。 ### 示例代码 下面是一个简单的 Netty 服务器端代码示例: ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; public class NettyServer { public static void main(String[] args) throws Exception { // 创建两个线程组 bossGroup 和 workerGroup EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { // 创建服务器端启动助手来配置参数 ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) // 设置通道为NIO .option(ChannelOption.SO_BACKLOG, 128) // 设置线程队列等待连接个数 .childOption(ChannelOption.SO_KEEPALIVE, true) // 设置保持活动连接状态 .childHandler(new ChannelInitializer<SocketChannel>() { // 创建一个通道初始化对象 @Override protected void initChannel(SocketChannel ch) throws Exception { // 向pipeline中添加解码器 ch.pipeline().addLast(new MyServerHandler()); } }); System.out.println("netty server is starting..."); // 绑定端口并启动服务器 ChannelFuture future = bootstrap.bind(8080).sync(); // 关闭服务器 future.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } } ``` 这是一个简单的 Netty 客户端代码示例: ```java import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; public class NettyClient { public static void main(String[] args) throws Exception { // 创建一个线程组 EventLoopGroup group = new NioEventLoopGroup(); try { // 创建客户端启动助手 Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) // 设置通道为NIO .option(ChannelOption.SO_KEEPALIVE, true) // 设置保持活动连接状态 .handler(new ChannelInitializer<SocketChannel>() { // 创建一个通道初始化对象 @Override protected void initChannel(SocketChannel ch) throws Exception { // 向pipeline中添加编码器 ch.pipeline().addLast(new MyClientHandler()); } }); System.out.println("netty client is starting..."); // 连接服务器 ChannelFuture future = bootstrap.connect("127.0.0.1", 8080).sync(); // 关闭客户端 future.channel().closeFuture().sync(); } finally { group.shutdownGracefully(); } } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值