阿古达芝麻开门 - 博客园

Netty之服务端启动流程

Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理

 

首先来一段Netty Server的sample:

 

 

ServerBootstrap是一个启动辅助类;

group(bossGroup, workerGroup) 我们需要两种类型的人干活,一个是老板,一个是工人,老板负责从外面接活,接到的活分配给工人干,放到这里,bossGroup的作用就是不断地accept到新的连接,将新的连接丢给workerGroup来处理;

.channel(NioServerSocketChannel.class) 表示服务端启动的是nio相关的channel,可以理解为一条channel就是一个连接;

.handler(new EchoServerHandler()),消息处理器

.childHandler(new ChannelInitializer<SocketChannel>)...表示一条新的连接进来之后,该怎么处理,也就是上面所说的,老板如何给工人配活。

 

我们带着两个问题来展开本章节的内容:

  1. Channel如何被创建的?

  2. Selector如何被创建的?

  3. 如何绑定端口?


ChannelFuture f = b.bind(PORT).sync(),我们主要深入了解bind方法。

 

AbstractBootstrap#bind->AbstractBootstrap#doBind-->AbstractBootstrap#ReflectiveChannelFactory#initAndRegister中,通过反射创建NioServerSocketChannel.class

 

 

 

 

用户调用方法 Bootstrap.bind(port) 第一步就是通过反射的方式new一个NioServerSocketChannel对象,并且在new的过程中创建了一系列的核心组件(Channel,ChannelConfig,ChannelId,Unsafe,Pipeline,ChannelHander),真正的启动我们还需要继续跟。

 

接着看ServerBootstrap#init(Channel channel),这里比较主要的就是把Handler加入到了Pipeline

 

 接着看AbstractBootstrap#ChannelFuture regFuture = config().group().register(channel)把channel注册到EventLoopGroup中去,最终会调用register0

 

 

2中的pipeline.invokeHandlerAddedIfNeeded()大概是把自定义的Handler添加到Pipeline中

 

最后返回到AbstractBootstrap#doBind0进行绑定端口

 

posted @   阿古达芝麻开门  阅读(93)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示