Netty结构

news2024/12/29 13:14:42

Netty结构

  • 引导器Bootstrap
    • 举例:一个简单的HTTP服务器
      • 服务端启动类
      • 服务端业务逻辑处理类
    • 二级目录
      • Channel初始化(设置Channel类型)
      • 注册ChannelHandler
        • 结合HTTP请求-响应,分析数据在ChannelPipeline中的流向
      • 设置Channel参数
      • 端口绑定
    • 引导器实践流程
  • 事件调度层
    • Reactor线程模型
    • EventLoop是什么
      • Netty如何实现EventLoop
      • 事件处理机制
    • EventLoop最佳实践
  • 服务编排层
    • 内部结构
      • 双向链表构造
    • 接口设计
      • 事件传播机制
      • 异常处理机制
    • 总结

引导器Bootstrap

作为整个Netty客户端和服务端的程序入口
可以把netty的核心组件组装在一起

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

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

Netty也可以方便地开发一个HTTP服务器,Netty程序如何配置启动,以及引导器如何与核心组件产生联系
在这里插入图片描述
只需要两个类就可以完成一个最简单的HTTP服务器:服务器启动类和业务逻辑处理类

服务端启动类

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

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完成
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内部结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

双向链表构造

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接口设计

在这里插入图片描述
在这里插入图片描述

事件传播机制

在这里插入图片描述

异常处理机制

在这里插入图片描述

总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java互联网医院智能导诊系统源码,Uniapp前端开发框架,支持一次编写,多端运行

智慧导诊系统源码&#xff0c;java源码&#xff0c;大屏机自动导诊&#xff0c;互联网医院智能导诊系统源码 老是全身无力&#xff0c;挂什么科&#xff1f; 经常头痛&#xff0c;挂什么科&#xff1f; 总是失眠&#xff0c;又得挂哪个科&#xff1f; 世界上最遥远的距离再加…

初识git · 多人协作

目录 前言&#xff1a; 多人协作一 多人协作二 前言&#xff1a; git从发布以来&#xff0c;强大的功能有版本回退以及分支管理&#xff0c;那么分支管理用来不仅是为了维护master的&#xff0c;更多的是多人协作的一种代表&#xff0c;所以多人协作这一章节&#xff0c;基…

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序

2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂&#xff0c;同时在铁路线上增建一个车站&#xff0c;用来运送成品油。由于这种模式具有一定的普遍性&#xff0c;油田设计院希望建立管线建设费用最省的一般数学模型与方法。   1. 针对两炼…

基于SpringBoot农场管理平台【附源码】

基于SpringBoot农场管理平台 效果如下&#xff1a; 系统首页界面 系统注册页面 农业生产资料详细页面 个人中心界面 管理员登录界面 管理员主界面 用户管理界面 资料分类管理界面 方法分类管理界面 计划分类管理界面 农业生产资料管理界面 研究背景 农业是人类社会发展的基石…

实现vlan间的通信

方法一&#xff1a;单臂路由 概述 单臂路由是一种网络配置&#xff0c;它允许在路由器的一个物理接口上通过配置多个子接口来处理不同VLAN的流量&#xff0c;从而实现VLAN间的通信。 原理 路由器重新封装MAC地址&#xff0c;转换Vlan标签 基础模型 1、配置交换机的链…

【openGL学习笔记】----GLFW、GLAD环境配置

glew、glad、freeglut、glfw的区别&#xff1f; glew&#xff08;The OpenGL Extension Wrangler Library&#xff09;是对底层OpenGL接口的封装&#xff0c;可以让你的代码跨平台。glad与glew作用相同&#xff0c;可以看作它的升级版。Freeglut&#xff08;OpenGL Utility To…

H5开发指南|掌握核心技术,玩转私域营销利器

随着互联网技术的不断发展和用户需求的日益增长&#xff0c;H5页面逐渐成为了企业和个人展示信息、吸引用户关注的重要手段。具有跨平台兼容性强、网页链接分享、更新迭代方便快捷、低开发成本、可搜索和优化、数据分析与追踪、灵活性与扩展性以及无需下载安装等特点。不仅可以…

pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover&#xff08;悬停&#xff09; 定义&#xff1a;发起交互的对象停留在可交互对象的交互区域。例如&#xff0c;当手触摸到物品表面&#xff08;可交互区域&#xff09;时&#xff0c;视为触发了Hover。 Grab&#xff08;抓取&#xff09; 概念&#xff…

Redis 三 Redis分布式锁

Redis 实战应用 文章目录 Redis 实战应用Redis 实现全局唯一IDRedis解决购物秒杀思路超卖问题一人一单集群并发的问题分布式锁Redis分布式锁的实现核心思路实现分布式锁版本一Redis分布式锁误删情况Redis分布式锁原子性问题 Redis 实现全局唯一ID 全局ID生成器&#xff0c;是一…

【排序】——1.冒泡排序法(含优化)

冒泡排序 1.原理 左边大于右边交换一趟排下来最大的交换到右边来(接下来所以文章用升序举例) 从左到右&#xff0c;相邻元素进行比较。 每次比较一轮&#xff0c;就会找到序列中最大的一个&#xff08;最小的一个——降序&#xff09;。这个数就会从序列的最右边冒出来。 以…

NetSarang Xshell v8.0060 Linux终端管理器个人免费版

NetSarang Xshell 官方个人完全免费中文版&#xff0c;Xshell特别版&#xff0c;Xshell 个人完全免费&#xff0c;Xshell 是一款最好用的Linux远程连接工具&#xff0c;免费SSH客户端、主机服务器远程管理客户端 。Xshell&#xff0c;轻松管理远程服务器&#xff0c;会话管理器…

16进制数据如何得到奇偶校验位??

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

详解mac系统通过brew安装mongodb与使用

本文目录 一、通过brew安装MongoDB二、mongodb使用示例1、启动数据库2、创建/删除数据库3、创建/删除集合 三、MongoDB基本概念1&#xff09;数据库 (database)2&#xff09;集合 &#xff08;collection&#xff09;3) 文档&#xff08;document&#xff09;4&#xff09;mong…

海博思创神秘股东捡漏入股,是否存利益输送?关联交易信披不一致

作者&#xff1a;Eric 来源&#xff1a;IPO魔女 今日&#xff0c;北京海博思创科技股份有限公司&#xff08;简称海博思创&#xff09;上会&#xff0c;将冲刺科创板。海博思创是储能设备生产集成商&#xff0c;处于产业链的中游&#xff0c;主要产品为电化学储能系统。 IPO魔…

护眼台灯横评:书客、柏曼、明基哪款使用体验好,又能护眼?

如果你使用过护眼台灯&#xff0c;就太能理解为什么护眼台灯会诞生了。护眼台灯确实有一定的护眼作用&#xff0c;光线柔和不刺眼&#xff0c;许多护眼台灯还有智能调光、定时休息等人性化功能。在当今这个数字化时代&#xff0c;长时间面对电脑屏幕或埋头于书本已成为许多人的…

美国的云服务器什么价格能买到?

美国的云服务器什么价格能买到&#xff1f;美国的云服务器价格月租费用一般在70元至数千元人民币不等&#xff0c;基础配置的云服务器月租金可能在20至50美元之间&#xff0c;而高端配置的云服务器月租金可能达到150至500美元。美国的云服务器价格因多个因素而异&#xff0c;包…

web前端网页用户注册页面

源码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户注册</title> </head> <body><form action"#" metho…

2. MySQL数据库基础

一、数据库的操作 1. 显示当前的数据库 SHOW DATABASES;2. 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification...];//create_specification包括&#xff1a;[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_n…

TemporalBench:一个专注于细粒度时间理解的多模态视频理解的新基准。

2024-10-15&#xff0c;由威斯康星大学麦迪逊分校、微软研究院雷德蒙德等机构联合创建了TemporalBench&#xff0c;它通过大约10K个视频问答对&#xff0c;提供了一个独特的测试平台&#xff0c;用以评估各种时间理解和推理能力&#xff0c;如动作频率、运动幅度、事件顺序等。…

物联网的应用以及优势

物联网智能项目涵盖了多个行业领域&#xff0c;随着技术的不断进步和普及&#xff0c;越来越多的应用案例成为主流趋势。此篇文章将概述一些主要的物联网智能项目类别及其优势和日常使用场景&#xff1a; 主流物联网智能项目 1. 智能家居: •优势: 提升居住体验&#xff0c;…