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完成


内部结构





双向链表构造



接口设计


事件传播机制

异常处理机制

总结

相关推荐
初晴~16 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
黑胡子大叔的小屋1 小时前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark1 小时前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
雷神乐乐2 小时前
Spring学习(一)——Sping-XML
java·学习·spring
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
V+zmm101343 小时前
基于小程序宿舍报修系统的设计与实现ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm
文大。3 小时前
2024年广西职工职业技能大赛-Spring
java·spring·网络安全
一只小小翠3 小时前
EasyExcel 模板+公式填充
java·easyexcel
m0_748256344 小时前
QWebChannel实现与JS的交互
java·javascript·交互
Jelena技术达人4 小时前
Java爬虫获取1688关键字 item_search接口返回值详细解析
java·开发语言·爬虫