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


内部结构





双向链表构造



接口设计


事件传播机制

异常处理机制

总结

相关推荐
Dxxyyyy14 小时前
零基础学JAVA--Day27(注释+异常+异常处理方法)
java·开发语言
Craaaayon14 小时前
如何选择两种缓存更新策略(写缓存+异步写库;写数据库+异步更新缓存)
java·数据库·redis·后端·缓存·mybatis
AAA卷不动了14 小时前
JVM(二)------ 类加载、初始化与单例模式的联系
java·jvm·单例模式
一 乐14 小时前
点餐|智能点餐系统|基于java+ Springboot的动端的点餐系统小程序(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·小程序·论文
少许极端15 小时前
算法奇妙屋(十)-队列+宽搜(BFS)
java·数据结构·算法·bfs·宽度优先·队列
程序员卷卷狗15 小时前
JVM 内存结构与 GC 调优全景图
java·开发语言·jvm
foxbillcsdn16 小时前
《Redis应用实例》Java实现(28):栈
java·redis
serendipity_hky16 小时前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud
Geoking.16 小时前
【Java】Java 中 @Resource 与 @Autowired 的区别详解
java·开发语言