日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

服务端_说说Netty服务端启动流程

發(fā)布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 服务端_说说Netty服务端启动流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
點(diǎn)擊上方?SpringForAll社區(qū)?輕松關(guān)注!及時獲取有趣有料的技術(shù)文章

本文來源:http://yeming.me/2016/03/12/netty1/

netty服務(wù)端代碼分析

服務(wù)端啟動配置

對于 ServerBootstrap:ServerBootstrap繼承于 AbstractBootstrap,它從父類繼承了 EventLoopGroupgroup, ChannelFactoryextendsC>channelFactory,自己新增了 EventLoopGroupchildGroup, ChannelHandlerchildHandler。上面 b.group開始的鏈?zhǔn)酱a就是初始化上面這些屬性的值的。

bossgroup和 workergroup:可以看到都是 NioEventLoopGroup,可以理解成2個線程池。從 bossgroup中隨便選一個作為 Reactor模型中的 acceptor,監(jiān)聽客戶端連接,創(chuàng)建 socketChannel,然后從 workergroup選取一個io線程來處理 socketChannel的讀取事件。

對于 NioEventLoopGroup和 NioEventLoop:先看下類圖

可以看到 NioEventLoopGroup繼承了 EventLoopGroupNioEventLoop實(shí)現(xiàn)了EventLoop,而EventLoop又繼承自EventLoopGroup。eventloopgroup.next()又可以返回一個eventloop。可以看到EventLoop最終繼承于線程池Executor。而最終NioEventLoopGroup又實(shí)現(xiàn)了EventLoop,接下來我們還會分析下NioEventLoopGroup

服務(wù)端注冊感興趣事件和監(jiān)聽端口

注冊感興趣事件

b.bind最終調(diào)用到AbstractBootstrop的以下方法

final ChannelFuture initAndRegister() {

this.group().register(channel);(中間省略)

}

這個this.group就是一開始設(shè)置的bossgroup(NioEventLoopGroup),看到這個方法基本可以想到這個應(yīng)該是把channel注冊到某個選擇器上

MultithreadEventLoopGroup

public ChannelFuture register(Channel channel) {

return this.next().register(channel);

}

上面的類圖已經(jīng)可以看出 NioEventLoopGroup繼承自 MultithreadEventLoopGroup,最終 this.next()又會返回 NioEventLoop,所以也就是可以理解是把 channel注冊到 NioEventLoop上(我們猜想 NioEventLoop可以想象成封裝了一個 selector)

this.next()返回 NioEventLoop繼承于 SingleThreadEventLoopchannel.unsafe().register(this,promise);最終調(diào)用到 AbstractUnsafe的 register方法

eventLoop.execute(new OneTimeTask() {

public void run() {

AbstractUnsafe.this.register0(promise);

}

});

這里通過 bossgroup啟動一個線程

最終調(diào)用到

protected void doRegister() throws Exception {

boolean selected = false;

while(true) {

try {

this.selectionKey = this.javaChannel().register(this.eventLoop().selector, 0, this);

return;

} catch (CancelledKeyException var3) {

if(selected) {

throw var3;

}

this.eventLoop().selectNow();

selected = true;

}

}

}

監(jiān)聽端口

可以看到第四張截圖

ChannelFuture regFuture = this.initAndRegister();

if(regFuture.cause() != null) {

return regFuture;

} else if(regFuture.isDone()) {

doBind0(regFuture, channel, localAddress, promise1); return promise1;

} else {

AbstractBootstrap.doBind0(regFuture, channel, localAddress, promise); } }); return promise;

}

可以看到 initAndRegister()這個方法就是上面我們說的注冊感興趣的事件。后面的 elseif和 else都有 dobind0 方法,這個方法也是通過之前的線程池啟動一個線程去監(jiān)聽一個端口。

參考

netty api說明http://www.boyunjian.com/javadoc/io.netty/netty-transport/4.0.0.Alpha7//io/netty/channel/DefaultChannelFuture.htmlNetty 4源碼解析:服務(wù)端啟動http://blog.csdn.net/dc726/article/details/47858077Netty 4源碼解析:請求處理http://blog.csdn.net/dc726/article/details/48084367Netty系列之Netty線程模型(http://www.infoq.com/cn/articles/netty-threading-model?utmsource=infoq&utmmedium=popularlinks_homepage

●?Spring IOC流程清楚不?聊聊看

●?面試官:ScheduleThreadPoolExecutor了解不?

●?配置中心只有Apollo么?看看點(diǎn)評的Lion

●?面試官說從源碼角度說說Java線程池

●?JedisPool連接池相關(guān)配置

●?Hystrix初探

●?別再關(guān)注刪庫跑路了,談?wù)剶?shù)據(jù)庫架構(gòu)

●?那些年非常火的MyCAT是什么?

●?Java14帶來了許多新功能

●?關(guān)于爛代碼的那些事(上)

●?關(guān)于整潔代碼的那些事(中)

●?關(guān)于整潔代碼的那些事(下)

●?面試官說Spring AOP 實(shí)現(xiàn)原理給我說說

●?深入理解JVM - 方法調(diào)用

●?Spring Boot神操作-多個數(shù)據(jù)源Service層封裝

●?Lombok經(jīng)常用,但是你知道它的原理是什么嗎?

總結(jié)

以上是生活随笔為你收集整理的服务端_说说Netty服务端启动流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。