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>)...表示一條新的連接進來之后,該怎么處理,也就是上面所說的,老板如何給工人配活。
我們帶著兩個問題來展開本章節的內容:
-
Channel如何被創建的?
-
Selector如何被創建的?
-
如何綁定端口?
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進行綁定端口


浙公網安備 33010602011771號