Netty在Dubbo中使用實(shí)例分析

本篇內(nèi)容主要講解“Netty在Dubbo中使用實(shí)例分析”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Netty在Dubbo中使用實(shí)例分析”吧!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、東港網(wǎng)站維護(hù)、網(wǎng)站推廣。

當(dāng)配置如下信息時(shí)

<dubbo:application name="infuq-dubbo-provider" /><dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" check="false" /><dubbo:protocol name="dubbo" port="20880" threads="200"/><dubbo:service ref="queryUserInfoFacade" interface="com.infuq.facade.QueryUserInfoFacade" version="1.0.0" /><bean id="queryUserInfoFacade" class="com.infuq.facade.impl.QueryUserInfoFacadeImpl" />

Spring在啟動(dòng)的過(guò)程中,通過(guò)DubboNamespaceHandler解析上面的標(biāo)簽.

將每個(gè)標(biāo)簽與之對(duì)應(yīng)的BeanDefinition注冊(cè)到BeanFactory中.

Spring再根據(jù)BeanDefinition生成對(duì)應(yīng)的Bean實(shí)例.

上面的<dubbo:service />標(biāo)簽最終會(huì)生成對(duì)應(yīng)的ServiceBean實(shí)例.

// 源碼位置: com.alibaba.dubbo.config.spring.ServiceBeanpublic class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,        ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware,        ApplicationEventPublisherAware {          }

ServiceBean實(shí)現(xiàn)了ApplicationListener<ContextRefreshedEvent>接口.

在Spring創(chuàng)建完所有的Bean之后,最后會(huì)發(fā)布一個(gè)ContextRefreshedEvent事件.

因此ServiceBean的onApplicationEvent()方法會(huì)被執(zhí)行.

public void onApplicationEvent(ContextRefreshedEvent event) {    if (isDelay() && !isExported() && !isUnexported()) {        if (logger.isInfoEnabled()) {            logger.info("The service ready on spring started. service: " + getInterface());        }        // 暴露服務(wù)        export();    }}

接下來(lái)就進(jìn)入到了服務(wù)暴露的過(guò)程.

服務(wù)暴露會(huì)完成兩件事情. 第一件事情是通過(guò)Netty開(kāi)啟服務(wù),監(jiān)聽(tīng)端口.

第二件事情是將服務(wù)注冊(cè)到注冊(cè)中心.

跟進(jìn)export()方法, 最后會(huì)來(lái)到DubboProtocol類.

大體看下它是如何開(kāi)啟服務(wù),監(jiān)聽(tīng)端口? 留意下,有個(gè)屬性requestHandler.

public class DubboProtocol extends AbstractProtocol {  private ExchangeHandler requestHandler = new ExchangeHandlerAdapter() { ... };
  private ExchangeServer createServer(URL url) {    // 綁定    server = Exchangers.bind(url, requestHandler);  }
}

跟進(jìn)bind()方法,最后會(huì)來(lái)到NettyServer的doOpen()方法. 

留意下,有個(gè)屬性nettyServerHandler.

// 源碼位置: com.alibaba.dubbo.remoting.transport.netty4.NettyServerprotected void doOpen() throws Throwable {    bootstrap = new ServerBootstrap();
   bossGroup = new NioEventLoopGroup(1, new DefaultThreadFactory("NettyServerBoss", true));    workerGroup = new NioEventLoopGroup(getUrl().getPositiveParameter(Constants.IO_THREADS_KEY, Constants.DEFAULT_IO_THREADS), new DefaultThreadFactory("NettyServerWorker", true));
    // 重要的Handler    final NettyServerHandler nettyServerHandler = new NettyServerHandler(getUrl(), this);    channels = nettyServerHandler.getChannels();
   bootstrap.group(bossGroup, workerGroup)            .channel(NioServerSocketChannel.class)            .childOption(ChannelOption.TCP_NODELAY, Boolean.TRUE)            .childOption(ChannelOption.SO_REUSEADDR, Boolean.TRUE)            .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)            .childHandler(new ChannelInitializer<NioSocketChannel>() {                @Override                protected void initChannel(NioSocketChannel ch) throws Exception {                    NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec(), getUrl(), NettyServer.this);                    ch.pipeline()                            .addLast("decoder", adapter.getDecoder())                            .addLast("encoder", adapter.getEncoder())                            .addLast("handler", nettyServerHandler);// 處理請(qǐng)求和響應(yīng)的Handler                }            });    // bind    ChannelFuture channelFuture = bootstrap.bind(getBindAddress());    channelFuture.syncUninterruptibly();    channel = channelFuture.channel();
}

從DubboProtocol類的requestHandler屬性到NettyServer的nettyServerHandler屬性. 

這一路會(huì)經(jīng)歷很多Handler,經(jīng)過(guò)層層封裝,最后才封裝成NettyServerHandler.

它會(huì)經(jīng)歷如下Handler

NettyServerHandler
-> NettyServer
-> MultiMessageHandler
-> HeartbeatHandler
-> AllChannelHandler
-> DecodeHandler
-> HeaderExchangeHandler
-> ExchangeHandler

Netty在Dubbo中使用實(shí)例分析

當(dāng)客戶端連接服務(wù)端,或者發(fā)送數(shù)據(jù)到服務(wù)端的時(shí)候, 

首先會(huì)由NettyServerHandler處理請(qǐng)求,然后依次將請(qǐng)求傳遞下去,最后到ExchangeHandler.

那么這些Handler是否都由同一個(gè)線程執(zhí)行的嗎? 并不是

Netty在Dubbo中使用實(shí)例分析

如上圖, 在AllChannelHandler中有個(gè)executor屬性,它是一個(gè)線程池.

NettyServerHandler
-> NettyServer
-> MultiMessageHandler
-> HeartbeatHandler
-> AllChannelHandler

以上這幾個(gè)Handler是由同一個(gè)線程執(zhí)行的, 是由Netty的IO線程執(zhí)行的, 名稱類似NettyServerWorker-5-7

-> DecodeHandler
-> HeaderExchangeHandler
-> ExchangeHandler

以上這幾個(gè)Handler是由另一類線程執(zhí)行的, 是由AllChannelHandler中的線程池執(zhí)行的, 名稱類似DubboServerHandler-2.0.1.15:20880-thread-57

也就是說(shuō), Netty的IO線程在接收到請(qǐng)求后, 先依次執(zhí)行

NettyServerHandler -> NettyServer ->

MultiMessageHandler -> HeartbeatHandler

-> AllChannelHandler 這五個(gè)Handler.

之后會(huì)由AllChannelHandler中的線程池執(zhí)行后面的DecodeHandler
-> HeaderExchangeHandler -> ExchangeHandler 這三個(gè)Handler.

Netty在Dubbo中使用實(shí)例分析

<dubbo:protocol name="dubbo" port="20880" threads="200" threadpool="fixed"  />

使用threads=200, threadpool=fixed 就是在配置圖中紅色區(qū)域的線程池. 線程池也是調(diào)優(yōu)的一個(gè)地方.

到此,相信大家對(duì)“Netty在Dubbo中使用實(shí)例分析”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文名稱:Netty在Dubbo中使用實(shí)例分析
標(biāo)題鏈接:http://muchs.cn/article30/ghidso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、標(biāo)簽優(yōu)化、外貿(mào)建站、企業(yè)建站企業(yè)網(wǎng)站制作、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)