Netty源码解析-服务启动过程

文章目录

  • 前言
  • 简单Netty服务器启动代码示例
  • 主线
  • NioEventLoopGroup初始化
  • 关键代码


前言

Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。它的服务启动过程涉及多个组件和步骤,下面我将对Netty的服务启动过程进行详细的源码解析。

简单Netty服务器启动代码示例

public class NettyServer {
    public void start() throws Exception {
        // 初始化BossGroup和WorkerGroup线程池
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            // 初始化ServerBootstrap
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     // 添加自定义的ChannelHandler处理业务逻辑
                     ch.pipeline().addLast(new MyChannelHandler());
                 }
             })
             .option(ChannelOption.SO_BACKLOG, 128)
             .childOption(ChannelOption.SO_KEEPALIVE, true);
 
            // 绑定端口并启动服务
            ChannelFuture f = b.bind(8080).sync();
 
            // 等待服务关闭
            f.channel().closeFuture().sync();
        } finally {
            // 释放资源
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
 
    public static void main(String[] args) throws Exception {
        NettyServer server = new NettyServer();
        server.start();
    }
}
 
class MyChannelHandler extends SimpleChannelInboundHandler<ByteBuf> {
    // 实现相关的事件处理逻辑
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
        // 处理接收到的数据
    }
}

主线

在这里插入图片描述

main线程:

  • 创建NioEventLoopGroup、创建NioEventLoop
  • 创建 selector
  • 创建 server socket channel
  • 初始化 server socket channel
  • 给 server socket channel 从 boss group 中选择一个 NioEventLoop

boss 线程

  • 将 server socket channel 注册到选择的 NioEventLoop 的 selector
  • 绑定地址启动
  • 注册接受连接事件(OP_ACCEPT)到 selector 上

NioEventLoopGroup初始化

NioEventLoopGroup 初始化的基本过程:

  • EventLoopGroup(其实是MultithreadEventExecutorGroup)内部维护一个类为EventExecutor[] children 数组,其大小是nThreads;
  • 在MultithreadEventExecutorGroup 中会调用newChild()抽象方法来初始化children 数组;
  • 在NioEventLoopGroup 中具体实现newChild()方法,该方法返回一个NioEventLoop 实例。
    初始化NioEventLoop 主要属性:
    provider:在NioEventLoopGroup 构造器中通过SelectorProvider 的provider()方法获取SelectorProvider。
    selector:在NioEventLoop 构造器中调用selector = provider.openSelector()方法获取Selector 对象。

关键代码

 EventLoop eventLoop = EventLoopGroup.newChild(Executor executor, Object... args)  
Selector selector = sun.nio.ch.SelectorProviderImpl.openSelector()
ServerSocketChannel serverSocketChannel = provider.openServerSocketChannel()
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);
javaChannel().bind(localAddress, config.getBacklog());
selectionKey.interestOps(OP_ACCEPT);
  • Selector 是在 new NioEventLoopGroup()(创建一批 NioEventLoop)时创建。
  • 第一次 Register 并不是监听 OP_ACCEPT,而是 0:
    selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this) 。
  • 最终监听 OP_ACCEPT 是通过 bind 完成后的 fireChannelActive() 来触发的。
  • NioEventLoop 是通过 Register 操作的执行来完成启动的。
  • 类似 ChannelInitializer,一些 Hander 可以设计成一次性的,用完就移除,例如授权。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…

腾讯云向量数据库——RAG七天入门课笔记

目录 前言一、RAG介绍1-0、引言-大语言模型的不足1-1、向量数据库定义1-2、工作原理1-3、优点1-4、与传统数据库的区别1-5、RAG应用痛点 二、数据处理的难点——解析和拆分2-1、复杂文档格式-解析过程中的问题2-2、复杂文档解决流程2-3、Chunk拆分的问题以及如何改进 三、相似性…

【GitHub技术全面解析及游戏开发者的应用】

GitHub技术全面解析及游戏开发者的应用 GitHub作为全球最大的开源代码托管平台&#xff0c;不仅为软件开发者提供了一个强大的工具&#xff0c;也为游戏开发者带来了前所未有的便利。在游戏开发领域&#xff0c;GitHub的技术可以帮助开发者更高效地管理代码、协作开发、分享资…

10 - 镜像管理之:部署高可用harbor

之前介绍了部署单点harbor&#xff0c;这里重点说下Harbor高可用集群方案的部署&#xff0c;目前主要有两种主流的Harbor高可用集群方案&#xff1a; 1&#xff09;双主复制 2&#xff09;多harbor实例共享后端存储 1 Harbor双主复制高可用集群 1.1 主从同步 harbor官方默认提供…

arm64位系统中编译ffmpeg

大致过程仍然和x86平台一致&#xff1a; ./configure xxxxmakemake install 所需要变化的是需要在 ./configure xxxx 后面多加几个编译选项 cd ffmpeg ./configure (x64下的依赖配置&#xff1a;......)--prefixbin --archaarch64 --target-oslinux --enable-cross-compile …

redis的客户端操作

文章目录 前言Java客户端Jedis准备工作引入JedisJedis的基本使用方法String类型的操作List类型操作Hash类型操作Set类型操作Zet类型的操作 JavaSpring客户端创建项目引入SpringDataRedis配置 redis 服务地址创建 Controller具体实例 前言 Redis是用单线程来处理多个客户端的访…

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.理解软硬链接1.1 操作观…

Linux_网络编程套接字_2

文章目录 一、预备知识认识端口认识TCP协议认识UDP协议网络字节序 二、socket编程接口1.socket常见API2.socket结构总结 3.其他接口1.IP地址《》整数 inet_addr等等2.读取报文 - recvfrom 三、简单的UDP网络程序 - 聊天室1.源代码展示 四、TCP1.编写TCP服务器程序1.创建套接字 …

三行命令解决Ubuntu Linux联网问题

本博客中Ubuntu版本为23.10.1最新版本&#xff0c;后续发现了很多问题我无法解决&#xff0c;已经下载了另外一个版本22.04&#xff0c;此版本自带网络 一开始我找到官方文档描述可以通过命令行连接到 WiFi 网络&#xff1a;https://cn.linux-console.net/?p10334#google_vig…

网络协议——RSTP(快速生成树)与MSTP(多实例生成树)

一. RSTP 1. STP的不足 1、依靠计时器超时的方式进行收敛导致它的收敛时间需要30到50秒 2、端口状态和端口角色没有细致区分&#xff0c;指导数据转发依靠的不是端口状态而是端口所扮演角色。 3、如果拓扑频繁变化导致用户通信质量差&#xff0c;甚至通信中断&#xf…

【THM】What the Shell?(什么是壳?)-初级渗透测试

什么是shell? 在我们深入了解发送和接收 shell 的复杂性之前,了解 shell 的实际含义非常重要。用最简单的术语来说,shell 是我们与命令行环境 (CLI) 交互时使用的工具。换句话说,Linux中常见的 bash 或 sh 程序都是 shell 的例子,Windows 上的 cmd.exe 和 Powershell 也是…

简单了解JVM

一.JVM简介 jvm及Java virtual machineJava虚拟机&#xff0c;它是一个虚构出来的计算机&#xff0c;一种规范。其实抛开这么专业的句子不说&#xff0c;就知道 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互&#…

BUUCTF---misc--snake

1.下载附件&#xff0c;解压后是一张蛇的图片 2.查看属性&#xff0c;没有有用信息&#xff0c;用winhex打开&#xff0c;在文末找到了PK字样&#xff0c;图片被压缩了。 3.用binwalk命令&#xff0c;查看&#xff0c;有压缩包 4.用foremost命令分离&#xff0c;将文件保存到te…

repl_backlog原理

2.2.3.repl_backlog原理 master怎么知道slave与自己的数据差异在哪里呢? 这就要说到全量同步时的repl_baklog文件了。 这个文件是一个固定大小的数组&#xff0c;只不过数组是环形&#xff0c;也就是说角标到达数组末尾后&#xff0c;会再次从0开始读写&#xff0c;这样数组…

基因查询常用汇总网(自备)

目录 NCBI genecards HPA数据库 gepia2 cbioporta kmplot生存分析 ualcan ​​​​​​​ 进行一些常用的基因功能蛋白及表达的网站查询汇总&#xff0c;方便个人使用 NCBI National Center for Biotechnology Information (nih.gov) 查询基因的曾用名和其他ID&…

kubernetes有ingress-controler以及没有外部loadbalancer 的情况下使用istio-gateway.

那就配置一个ingress-使用已有ingress-controler代理istio-gateway class创建的gateway svc来公开。

day8 nest商业项目初探·四(java转ts全栈/3R教室)

背景&#xff1a;从头一点点学起太慢了&#xff0c;直接看几个商业项目吧&#xff0c;看看根据Java的经验&#xff0c;自己能看懂多少&#xff0c;然后再系统学的话也会更有针对性。今天看下一个项目 【加拿大 | 7.8w】TS全栈&#xff1a;Youni校园社交网络 (2022.10) - 3R酷 |…

嵌入式网线连接——笔记本电脑设置

一、需求 我们调试很多设备经常需要用到网线去调试&#xff0c;当然主流是USB&#xff0c;和网线。 二、笔记本电脑端设备 有网口的&#xff0c;非常方便&#xff0c;如果没有网口&#xff0c;则需要用到USB转网口 连接指示灯&#xff1a; 绿色&#xff1a;灯亮表示连接正常…

Python+Selenium+Unittest 之Unittest5(常用装饰器-跳过用例执行)

目录 1、unittest.skip()&#xff08;跳过该装饰器下的用例&#xff09; 2、unittest.skipIf()&#xff08;跳过该装饰器下判断条件为True的用例&#xff09; 3、unittest.skipUnless()&#xff08;跳过该装饰器下判断条件为False的用例&#xff09; 4、unittest.expectedF…

【java探索之旅】走进循环结构 深入解析while、for和do while的用法

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、循环结构1.1 while循环1.2 while代码示例1.3 break1.4 continue 二、for循环2.1 基…