最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty分布式Server啟動流程服務(wù)端初始化源碼分析

 更新時間:2022年03月25日 08:34:31   作者:向南是個萬人迷  
本章主要講解server啟動的關(guān)鍵步驟,?讀者只需要了解server啟動的大概邏輯,?知道關(guān)鍵的步驟在哪個類執(zhí)行即可,?并不需要了解每一步的運作機制,?之后會對每個模塊進行深度分析

第一節(jié):服務(wù)端初始化

首先看下在我們用戶代碼中netty的使用最簡單的一個demo:

//創(chuàng)建boss和worker線程(1)
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
//創(chuàng)建ServerBootstrap(2)
ServerBootstrap b = new ServerBootstrap();
//初始化boss和work線程化兩個線程(3)
b.group(bossGroup, workerGroup)
        //聲明NioServerSocketChannel(4)
        .channel(NioServerSocketChannel.class)
        //初始化客戶端Handler(5)
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            public void initChannel(SocketChannel ch) {
                ch.pipeline().addLast(new StringDecoder());
                ch.pipeline().addLast(new StringEncoder());
                ch.pipeline().addLast(new ServerHandler());
            }
        });
//綁定端口(6)
ChannelFuture f = b.bind(8888).sync();
f.channel().closeFuture().sync();

相信這段代碼使用過netty的同學(xué)應(yīng)該都不陌生.這里每一步都用了注釋和步驟序號進行標(biāo)注, 為了方便學(xué)習(xí)過程中更容易的定位.每一步的講解, 盡量自己也去跟到源碼中, 這樣會有個更深刻的理解

第一步, 創(chuàng)建兩個線程組:

其中會調(diào)用NioEventLoopGroup()的構(gòu)造方法, 其中的創(chuàng)建邏輯, 并不是這章的重點, 在這里大家只需要知道這里創(chuàng)建了兩個線程組

第二步, 創(chuàng)建ServerBootstrap, 我們發(fā)現(xiàn), 這里創(chuàng)建只調(diào)用了其無參的構(gòu)造方法, 原因很簡單, 就是參數(shù)太多, 盡量要用構(gòu)造方法去初始化, 而是使用后面的build的方式

第三步, 初始化boss和work線程化兩個線程

group方法

我們跟到group方法中去看:

public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
    //設(shè)置線程池組
    super.group(parentGroup);
    this.childGroup = childGroup;
    return this;
}

為了代碼可讀性, 去掉非關(guān)鍵代碼(以后不再贅述), 我們看到這里初始化了自家的屬性childGroup, 而這個屬性就是我們傳入的worker線程組, 而boss線程組則交給了其父類的group方法去做處理

我們點進去super.group(parentGroup), 進入到ServerBootstroop的父類AbstractBootstrap的group()方法:

public B group(EventLoopGroup group) {
    this.group = group;
    return (B) this;
}

看到在其父類初始化了boss線程

我們看到這個方法返回了this, 也就是ServerBootstroop自身, 這樣通過自身對象不斷的build進行屬性初始化, 之后的方法也是如此

至此, worker和boss兩個線程組初始化完畢

初始化成員變量

回到最開始的第四步, 再點進到channel(ServerSocketChannel.class)方法當(dāng)中, 

我們看到AbsractServerBootstrap的channel(Class<? extends C> channelClass)方法:

public B channel(Class<? extends C> channelClass) {
    return channelFactory(new ReflectiveChannelFactory<C>(channelClass));
}

我們看到這個這返回的是channelFactory(new ReflectiveChannelFactory<C>(channelClass))方法, 并且傳入一個ReflectiveChannelFactory對象的實例,

我們可以跟進去看下ReflectiveChannelFactory的構(gòu)造方法:

public ReflectiveChannelFactory(Class<? extends T> clazz) {
    this.clazz = clazz;
}

這里初始化了一個成員變量clazz, 而這個clazz就是用戶代碼調(diào)用channel(NioServerSocketChannel.class)傳入的NioServerSocketChannel的class對象

回到channelFactory(new ReflectiveChannelFactory<C>(channelClass))方法, 點進去, 我們看到:

public B channelFactory(io.netty.channel.ChannelFactory<? extends C> channelFactory) {
    return channelFactory((ChannelFactory<C>) channelFactory);
}

繼續(xù)跟:

public B channelFactory(io.netty.channel.ChannelFactory<? extends C> channelFactory) {
    return channelFactory((ChannelFactory<C>) channelFactory);
}

跟到最后:

public B channelFactory(ChannelFactory<? extends C> channelFactory) {
    this.channelFactory = channelFactory;
    return (B) this;
}

這里初始化了channelFactory, 而這個channelFactory就是剛才創(chuàng)建的ReflectiveChannelFactory對象, 這里我們記住這個對象中初始化了我們的NioServerSocket的class對象

至此, 我們的ServerSocketChannel的class對象初始化完成

初始化客戶端Handler

我們跟到最開始的第五步, 初始化客戶端Handler:

.childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            public void initChannel(SocketChannel ch) {
                ch.pipeline().addLast(new StringDecoder());
                ch.pipeline().addLast(new StringEncoder());
                ch.pipeline().addLast(new ServerHandler());
            }
        });

childHandler()方法比看起來比較復(fù)雜, 其實不難理解, 就是傳入ChannelInitializer類子類的一個對象(有關(guān)匿名內(nèi)部類不知道的同學(xué)可以找下相關(guān)資料學(xué)習(xí)下), 也就是一個Handler, 這個Handler是做什么的, 目前不需要關(guān)心, 以后會講到, 這里我們只需知道這個方法傳入一個handler對象

我們點進childHandler這個方法:

public ServerBootstrap childHandler(ChannelHandler childHandler) {
    this.childHandler = childHandler;
    return this;
}

發(fā)現(xiàn)同樣非常簡單的初始化了handler屬性

這一小節(jié)至此結(jié)束, 只是初始化了ServerBootstrap的各個屬性, 是不是非常簡單

我們可以看到, 通過對象build的方式, 可以初始化非常多的屬性, 并且代碼要比構(gòu)造方法的方式可讀性要好的多, 同學(xué)們可以將這種思想用在自己的代碼當(dāng)中...

以上就是Netty源碼分析Server啟動流程的詳細(xì)內(nèi)容,更多關(guān)于NettyServer啟動流程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于IDEA配置Hibernate中遇到的問題解決

    關(guān)于IDEA配置Hibernate中遇到的問題解決

    這篇文章主要給大家介紹了關(guān)于IDEA配置Hibernate中遇到的問題,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • javaWeb傳收參數(shù)方式總結(jié)示例分析

    javaWeb傳收參數(shù)方式總結(jié)示例分析

    這篇文章主要為大家介紹了javaWeb傳收參數(shù)方式總結(jié)示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • SpringBoot基于HttpMessageConverter實現(xiàn)全局日期格式化

    SpringBoot基于HttpMessageConverter實現(xiàn)全局日期格式化

    這篇文章主要介紹了SpringBoot基于HttpMessageConverter實現(xiàn)全局日期格式化,使用Jackson消息轉(zhuǎn)換器,非常具有實用價值,需要的朋友可以參考下
    2018-12-12
  • Swagger2配置Security授權(quán)認(rèn)證全過程

    Swagger2配置Security授權(quán)認(rèn)證全過程

    這篇文章主要介紹了Swagger2配置Security授權(quán)認(rèn)證全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java中內(nèi)部類使用方法實戰(zhàn)案例分析

    Java中內(nèi)部類使用方法實戰(zhàn)案例分析

    這篇文章主要介紹了Java中內(nèi)部類使用方法,結(jié)合具體案例形式分析了Java內(nèi)部類原理、調(diào)用方法及相關(guān)使用注意事項,需要的朋友可以參考下
    2019-09-09
  • JavaWeb入門:ServletContext詳解和應(yīng)用

    JavaWeb入門:ServletContext詳解和應(yīng)用

    這篇文章主要介紹了Java ServletContext對象用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-07-07
  • 使用SpringBoot內(nèi)置web服務(wù)器

    使用SpringBoot內(nèi)置web服務(wù)器

    這篇文章主要介紹了使用SpringBoot內(nèi)置web服務(wù)器操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java解析Excel的方法(xls、xlsx兩種格式)

    java解析Excel的方法(xls、xlsx兩種格式)

    這篇文章主要介紹了java解析Excel的方法(xls、xlsx兩種格式),需要的朋友可以參考下
    2018-04-04
  • SpringBoot擴展點EnvironmentPostProcessor實例詳解

    SpringBoot擴展點EnvironmentPostProcessor實例詳解

    這篇文章主要介紹了SpringBoot擴展點EnvironmentPostProcessor的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • spring boot下mybatis配置雙數(shù)據(jù)源的實例

    spring boot下mybatis配置雙數(shù)據(jù)源的實例

    這篇文章主要介紹了spring boot下mybatis配置雙數(shù)據(jù)源的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

南靖县| 文水县| 崇礼县| 建平县| 房山区| 阆中市| 合川市| 姚安县| 甘孜县| 青铜峡市| 太康县| 嵊泗县| 长春市| 伊春市| 汉沽区| 教育| 新郑市| 丰镇市| 政和县| 海原县| 西安市| 成安县| 郎溪县| 溧水县| 菏泽市| 肇源县| 溧水县| 冕宁县| 海口市| 峨眉山市| 祁东县| 临颍县| 崇义县| 乌苏市| 水城县| 平阳县| 肃北| 东城区| 潼关县| 萍乡市| 嘉黎县|