Netty结构

Netty结构

引导器Bootstrap

作为整个Netty客户端和服务端的程序入口

可以把netty的核心组件组装在一起

EventLoop是Netty Reactor线程模型的核心处理引擎

举例:一个简单的HTTP服务器

Netty也可以方便地开发一个HTTP服务器,Netty程序如何配置启动,以及引导器如何与核心组件产生联系

只需要两个类就可以完成一个最简单的HTTP服务器:服务器启动类和业务逻辑处理类

服务端启动类

所有服务端启动类都可以通过如下结构进行开发

java 复制代码
public class HttpServer {
  public void start(int port) throws Exception {
    EventLoopGroup bossGroup = new NioEventLoopGroup();
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    try {
      ServerBootstrap b = new ServerBootstrap();
      b.group(bossGroup, workerGroup)
          .channel(NioServerSocketChannel.class)
          .localAddress(new InetSocketAddress(port))
          .childHandler(new
              ChannelInitializer<SocketChannel>(){
            public void initChannel(SocketChannel ch) {
              ch.pipeline()
                  .addLast("codec", new HttpServerCodec())
                  .addLast("compressor", new HttpContentCompressor())
                  .addLast("aggregator", new HttpObjectAggregator(65536))
                  .addLast("handler", new HttpServerHandler());
            }
              })
          .childOption(ChannelOption.SO_KEEPALIVE, true);
      ChannelFuture f = b.bind().sync();
      System.out.println("Http Server started? Listening on" + port);
      f.channel().closeFuture().sync();
    } finally {
      workerGroup.shutdownGracefully();
      bossGroup.shutdownGracefully();
    }

  }
  public static void main(String[] args) throws Exception {
    new HttpServer().start(8088);
  }
}

服务端业务逻辑处理类

HttpServerHandler是业务自定义的逻辑处理类,它是入站ChannelInboundHandler类型的处理器,负责接收解码后的http请求数据,并将请求处理结果写回客户端

二级目录

通过上面两个类,可以完成Http服务最基本的请求响应流程

启动

通过请求

获取结果

采用主从多线程Reactor模型:

boss是主reactor,worker是从reactor,他们分别使用不同的NioEventLoopGroup,主reactor负责处理把channel注册到从reactor上,从reactor负责channel生命周期上的所有I/O事件

Channel初始化(设置Channel类型)

注册ChannelHandler

在Netty中可以通过ChannelPipeline去注册多个Channel Handler。

每个ChannelHandler各司其职,这样可以实现最大化的代码复用,充分体现了Netty设计的优雅之处

pipeline管理的多个channelHandler, I/O事件依次在多个channelHandler中传播,handler负责应用逻辑处理上述HTTP服务器示例当中使用链式的方式,加载了多个channelHandler,包含http编解码器,http content压缩处理器,http消息聚合处理器,自定义业务逻辑处理器

结合HTTP请求-响应,分析数据在ChannelPipeline中的流向


设置Channel参数


端口绑定

引导器实践流程

事件调度层

EventLoop的实现原理

Reactor线程模型

线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。

Reactor模式负责将读写事件分发给对应的读写事件处理者

单线程模型

所有I/O操作(连接建立、数据读写、事件分发)都是由一个线程完成的。

一个线程支持处理的连接数有限,CPU很容易打满,性能方面有明显瓶颈

当多个事件被同时触发,只要有一个事件没有处理完,其他后面的事件就无法执行

线程在处理I/O事件时,Select无法同时处理连接建立、事件分发等操作

如果I/O线程一直处于满负荷状态,可能造成服务端节点不可用

多线程模型

Reactor多线程模型将业务逻辑交给多个线程进行处理,除此之外多线程模型在其他方面与单线程模型保持一致

主从多线程模型

EventLoop是什么

是一种事件等待和处理的程序模型

可以解决多线程资源消耗高的问题

Netty如何实现EventLoop

Reactor线程模型的事件处理引擎

每个EventLoop线程都维护一个Selector选择器和任务队列taskQueue

主要负责处理I/O事件、普通任务和定时任务



事件处理机制

Channel生命周期的所有事件处理都是线程独立的,不同的NioEventLoop线程之间不会发生任何交集






EventLoop最佳实践

1.网络连接建立过程中三次握手、安全认证的过程,建议采用Boss和Worker两个EventLoopGroup

2.对于耗时较长的ChannelHandler可以考虑维护一个业务线程池

将编解码后的数据封装成Task进行异步处理

3.如果业务逻辑执行时间较短,建议直接在ChannelHandler中执行

4.不宜设计过多的ChannelHandler

服务编排层

eventLoop时Netty的调度中心,监听I/O事件、信号事件、定时事件是由ChannelPipeline中所定义的ChannelHandler完成


内部结构





双向链表构造



接口设计


事件传播机制

异常处理机制

总结

相关推荐
深入云栈5 分钟前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
wang_shu_mo_ran1 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
量化分析码农3 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
猫猫不是喵喵.3 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
瑞雪兆丰年兮3 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
曲径海盗3 小时前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
Cosolar4 小时前
极简智库:快速搭建你的开源项目教程阅读平台,让 docs/ 目录被更多人看见
java·架构·github
nice_lcj5204 小时前
【从零理解 Spring AI · 16】Agent 与工作流:什么该写死,什么该让模型决定
java·人工智能·后端·spring ai·ai应用开发
北京云帆互联科技5 小时前
云帆培训考试系统更新说明:v9.3.0
java·学习
学长毕设6 小时前
基于SpringBoot的景点管理系统-附源码
java·spring boot·后端