Netty如何支持Reactor模式?
? 點(diǎn)擊上方“JavaEdge”,關(guān)注公眾號(hào)
| BIO | NIO | AIO |
|---|---|---|
| Thread-Per-Connection | Reactor | Proactor |

什么是Reactor

Reactor是一種開發(fā)模式,模式的核心流程:
注冊(cè)感興趣的事件->掃描是否有感興趣的事件發(fā)生->事件發(fā)生后做出相應(yīng)的處理。

三種版本

Thread-Per-Connection模式
注意到每個(gè) handler 里的 read 和 send都是阻塞操作,那用線程池不就行了?但那只是避免了線程數(shù)量無(wú)限增長(zhǎng)而已,依舊無(wú)法避免等待線程的阻塞。
Reactor 模式 V1:?jiǎn)尉€程,一個(gè)線程太累啦,而且他一旦掛了,整個(gè)系統(tǒng)掛了。相當(dāng)于創(chuàng)業(yè)初期,老板就是個(gè)全干工程師。
Reactor 模式 V2:多線程,老板開始招合伙人了,大家一起干!
Reactor 模式 V3:主從多線程。對(duì)于服務(wù)器來(lái)說(shuō),最重要的莫過(guò)于接收連接,使用主線程做這些事。老板真的成為資本家了,開始招聘打工人啦!老板只負(fù)責(zé)最關(guān)鍵的事情即可。
在 netty 中使用 reactor 模式
EventLoopGroup eventGroup = new NioEventLoopGroup(1);ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(eventGroup);EventLoopGroup eventGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();I serverBootstrap.group eventGroup);EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group( bossGroup, workerGroup);

源碼解析

跨平臺(tái)實(shí)現(xiàn)的根本
public static SelectorProvider provider() {
synchronized (lock) {
if (provider != null)
return provider;
return AccessController.doPrivileged(
new PrivilegedAction<SelectorProvider>() {
public SelectorProvider run() {
if (loadProviderFromProperty())
return provider;
if (loadProviderAsService())
return provider;
provider = sun.nio.ch.DefaultSelectorProvider.create();
return provider;
}
});
}
}

往期推薦

目前交流群已有?800+人,旨在促進(jìn)技術(shù)交流,可關(guān)注公眾號(hào)添加筆者微信邀請(qǐng)進(jìn)群
喜歡文章,點(diǎn)個(gè)“在看、點(diǎn)贊、分享”素質(zhì)三連支持一下~
評(píng)論
圖片
表情
