本發(fā)明涉及一種數(shù)據(jù)轉(zhuǎn)發(fā)方法,特別是一種基于netty的大規(guī)模并發(fā)數(shù)據(jù)轉(zhuǎn)發(fā)方法。
背景技術(shù):
在當(dāng)前,物聯(lián)網(wǎng)技術(shù)已經(jīng)廣泛的應(yīng)用到環(huán)保、消防、交通、測(cè)繪等多個(gè)領(lǐng)域。在這些應(yīng)用中,傳感器數(shù)據(jù)的傳輸起到了至關(guān)重要的作用。傳感器數(shù)據(jù)一般通過(guò)無(wú)線網(wǎng)絡(luò)發(fā)送到主機(jī)的TCP端口,并以一種固定的協(xié)議來(lái)規(guī)范傳感器與主機(jī)之間的信息傳輸。
在多種應(yīng)用場(chǎng)景下需要主機(jī)實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)發(fā),例如不同通訊協(xié)議之間的數(shù)據(jù)格式轉(zhuǎn)換或者多服務(wù)器之間的數(shù)據(jù)透?jìng)?。而在上述?yīng)用中,如果接入的客戶(hù)端較多,則有可能會(huì)造成多線程并發(fā)所導(dǎo)致的服務(wù)器崩潰的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種基于netty的大規(guī)模并發(fā)數(shù)據(jù)轉(zhuǎn)發(fā)方法。
為解決上述技術(shù)問(wèn)題,本發(fā)明所采用的技術(shù)方案是:
一種基于netty的大規(guī)模并發(fā)數(shù)據(jù)轉(zhuǎn)發(fā)方法,其特征在于:
步驟一:初始化類(lèi)型為NioEventLoopGroup的線程組clientLoopGroup,啟動(dòng)類(lèi)型為Bootstrap的數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器并進(jìn)行相關(guān)設(shè)置;
步驟二:構(gòu)建一個(gè)用于I/O事件處理的內(nèi)隱類(lèi),并將其掛接到數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程的主通道內(nèi);
步驟三:利用步驟一中啟動(dòng)的數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器,向接收轉(zhuǎn)發(fā)數(shù)據(jù)的遠(yuǎn)程主機(jī)進(jìn)行N次預(yù)連接,并將生成的N個(gè)連接通道保存在類(lèi)型為ArrayBlockingQueue的通道隊(duì)列queue中,同時(shí)初始化一個(gè)類(lèi)型為HashMap的哈希表hash來(lái)存儲(chǔ)已被使用的通道;
步驟四:初始化類(lèi)型為NioEventLoopGroup的主線程組與從線程組bossLoopGroup和workLoopGroup;
步驟五:?jiǎn)?dòng)類(lèi)型為ServerBootstrap的數(shù)據(jù)接收器進(jìn)程引導(dǎo)器,并進(jìn)行相關(guān)設(shè)置;
步驟六:構(gòu)造主攔截器,用于接收數(shù)據(jù)進(jìn)行處理,并利用步驟三中所創(chuàng)建的通道,將數(shù)據(jù)轉(zhuǎn)發(fā)給數(shù)據(jù)接收主機(jī);
步驟七:構(gòu)建一個(gè)用于I/O事件處理的內(nèi)隱類(lèi),并將其掛接到數(shù)據(jù)接收器進(jìn)程的主通道內(nèi);
步驟八:利用步驟五中所構(gòu)建的數(shù)據(jù)接收器引導(dǎo)器來(lái)綁定數(shù)據(jù)接收器進(jìn)程端口,監(jiān)聽(tīng)TCP端口發(fā)送過(guò)來(lái)的數(shù)據(jù)。
進(jìn)一步地,所述步驟一中相關(guān)設(shè)置具體包括:
a) 將線程組clientLoopGroup與數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器進(jìn)行關(guān)聯(lián);
b) 設(shè)置clientLoopGroup的通道類(lèi)型為NioSocketChannel;
c) 設(shè)置參數(shù)SO_KEEPALIVE, TCP_NODELAY的值為true。
進(jìn)一步地,所述步驟二中內(nèi)隱類(lèi)的構(gòu)造方法具體為:繼承類(lèi)型為ChannelInitializer<SocketChannel>的類(lèi),并重載其方法 initChannel。在該方法中對(duì)所在通道添加類(lèi)型為ChannelInboundHandlerAdapter的攔截器。
進(jìn)一步地,所述步驟三中通道隊(duì)列queue所存儲(chǔ)的對(duì)象為通道對(duì)象, 哈希表hash所存儲(chǔ)的對(duì)象為一組<Key,Value>鍵值對(duì),其中Key對(duì)應(yīng)使用該通道的主機(jī)標(biāo)示信息,Value對(duì)應(yīng)被使用的通道對(duì)象。
進(jìn)一步地,所述步驟三中N設(shè)置為100000。
進(jìn)一步地,所述步驟五中相關(guān)設(shè)置具體包括:
a) 將主、從線程組bossLoopGroup和workLoopGroup與數(shù)據(jù)接收器進(jìn)程引導(dǎo)器進(jìn)行關(guān)聯(lián);
b) 設(shè)置主、從線程組的通道類(lèi)型為NioServerSocketChannel。
進(jìn)一步地,所述步驟六中的主攔截器構(gòu)造方法具體為:創(chuàng)建一個(gè)派生自ChannelInboundHandlerAdapter的新類(lèi),并重載channelRead方法來(lái)實(shí)現(xiàn)數(shù)據(jù)讀取之后的轉(zhuǎn)發(fā)操作。
進(jìn)一步地,所述步驟六中channelRead方法的重載步驟為:
根據(jù)所讀取的信息來(lái)提取發(fā)送信息的標(biāo)示信息,并根據(jù)所獲取的主機(jī)標(biāo)示信息,從哈希表的鍵值對(duì)中查找對(duì)應(yīng)的傳輸通道;
a)若能夠根據(jù)主機(jī)標(biāo)示信息找到對(duì)應(yīng)的通道對(duì)象,則將該通道返回;
b)若不能根據(jù)主機(jī)標(biāo)示信息找到對(duì)應(yīng)的通道對(duì)象,則從預(yù)連接的通道隊(duì)列queue中提取一個(gè)新的通道,將其與主機(jī)標(biāo)示信息組成鍵值對(duì)加入哈希表hash,并將該通道返回;
c)根據(jù)所選取的通道,將現(xiàn)有數(shù)據(jù)轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器。
進(jìn)一步地,所述步驟七中內(nèi)隱類(lèi)的構(gòu)造方法具體為:派生類(lèi)型為ChannelInitializer<SocketChannel>的類(lèi),并重載其函數(shù)initChannel;在該函數(shù)中對(duì)所在通道的管道內(nèi)添加字符串解碼器、分隔符解碼器以及步驟六中所構(gòu)造的主攔截器等對(duì)象。
進(jìn)一步地,所述的 類(lèi)型NioServerSocketChannel、NioEventLoopGroup、ServerBootstrap、Bootstrap、NioSocketChannel和ChannelInitializer<SocketChannel>均為Netty程序類(lèi)庫(kù)中自帶的類(lèi)型。
本發(fā)明與現(xiàn)有技術(shù)相比,具有以下優(yōu)點(diǎn)和效果:適合于物聯(lián)網(wǎng)環(huán)境下大量傳感器數(shù)據(jù)的透?jìng)骰蛘邆鬏攨f(xié)議轉(zhuǎn)換等相關(guān)的應(yīng)用。能夠在一臺(tái)主機(jī)上同時(shí)承擔(dān)數(shù)據(jù)接收器與數(shù)據(jù)轉(zhuǎn)發(fā)器的功能,并能夠?qū)崿F(xiàn)數(shù)據(jù)在接收器與轉(zhuǎn)發(fā)器之間的無(wú)縫轉(zhuǎn)接。在一臺(tái)高性能服務(wù)器上,能夠模擬十萬(wàn)級(jí)別的通道來(lái)接收遠(yuǎn)程主機(jī)發(fā)送的原始數(shù)據(jù),且能夠模擬十萬(wàn)級(jí)別的通道與數(shù)據(jù)接收主機(jī)連接,實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)發(fā)或透?jìng)鳌?/p>
附圖說(shuō)明
圖1是本發(fā)明的一種基于netty的大規(guī)模并發(fā)數(shù)據(jù)轉(zhuǎn)發(fā)方法的框架圖。
圖2是本發(fā)明的一種基于netty的大規(guī)模并發(fā)數(shù)據(jù)轉(zhuǎn)發(fā)方法的流程圖。
具體實(shí)施方式
下面結(jié)合附圖并通過(guò)實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明,以下實(shí)施例是對(duì)本發(fā)明的解釋而本發(fā)明并不局限于以下實(shí)施例。
如圖所示,本發(fā)明的一種基于netty的大規(guī)模并發(fā)數(shù)據(jù)轉(zhuǎn)發(fā)方法,包含以下步驟:
步驟一:初始化類(lèi)型為NioEventLoopGroup的線程組clientLoopGroup,啟動(dòng)類(lèi)型為Bootstrap的數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器并進(jìn)行相關(guān)設(shè)置;相關(guān)設(shè)置具體包括:
a) 將線程組clientLoopGroup與數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器進(jìn)行關(guān)聯(lián);
b) 設(shè)置clientLoopGroup的通道類(lèi)型為NioSocketChannel;
c) 設(shè)置參數(shù)SO_KEEPALIVE, TCP_NODELAY的值為true。
步驟二:構(gòu)建一個(gè)用于I/O事件處理的內(nèi)隱類(lèi),并將其掛接到數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程的主通道內(nèi);內(nèi)隱類(lèi)的構(gòu)造方法具體為:繼承類(lèi)型為ChannelInitializer<SocketChannel>的類(lèi),并重載其方法 initChannel。在該方法中對(duì)所在通道添加類(lèi)型為ChannelInboundHandlerAdapter的攔截器。
步驟三:利用步驟一中啟動(dòng)的數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器,向接收轉(zhuǎn)發(fā)數(shù)據(jù)的遠(yuǎn)程主機(jī)進(jìn)行N次預(yù)連接,并將生成的N個(gè)連接通道保存在類(lèi)型為ArrayBlockingQueue的通道隊(duì)列queue中,同時(shí)初始化一個(gè)類(lèi)型為HashMap的哈希表hash來(lái)存儲(chǔ)已被使用的通道;通道隊(duì)列queue所存儲(chǔ)的對(duì)象為通道對(duì)象, 哈希表hash所存儲(chǔ)的對(duì)象為一組<Key,Value>鍵值對(duì),其中Key對(duì)應(yīng)使用該通道的主機(jī)標(biāo)示信息,Value對(duì)應(yīng)被使用的通道對(duì)象??筛鶕?jù)實(shí)際的應(yīng)用需求設(shè)置預(yù)連接的連接通道總數(shù)N。默認(rèn)情況下,N設(shè)置為100000。
步驟四:初始化類(lèi)型為NioEventLoopGroup的主線程組與從線程組bossLoopGroup和workLoopGroup;
步驟五:?jiǎn)?dòng)類(lèi)型為ServerBootstrap的數(shù)據(jù)接收器進(jìn)程引導(dǎo)器,并進(jìn)行相關(guān)設(shè)置;相關(guān)設(shè)置具體包括:
a) 將主、從線程組bossLoopGroup和workLoopGroup與數(shù)據(jù)接收器進(jìn)程引導(dǎo)器進(jìn)行關(guān)聯(lián);
b) 設(shè)置主、從線程組的通道類(lèi)型為NioServerSocketChannel。
步驟六:構(gòu)造主攔截器,用于接收數(shù)據(jù)進(jìn)行處理,并利用步驟三中所創(chuàng)建的通道,將數(shù)據(jù)轉(zhuǎn)發(fā)給數(shù)據(jù)接收主機(jī);主攔截器構(gòu)造方法具體為:創(chuàng)建一個(gè)派生自ChannelInboundHandlerAdapter的新類(lèi),并重載channelRead方法來(lái)實(shí)現(xiàn)數(shù)據(jù)讀取之后的轉(zhuǎn)發(fā)操作。channelRead方法的重載步驟為:
根據(jù)所讀取的信息來(lái)提取發(fā)送信息的標(biāo)示信息,并根據(jù)所獲取的主機(jī)標(biāo)示信息,從哈希表的鍵值對(duì)中查找對(duì)應(yīng)的傳輸通道;
a)若能夠根據(jù)主機(jī)標(biāo)示信息找到對(duì)應(yīng)的通道對(duì)象,則將該通道返回;
b)若不能根據(jù)主機(jī)標(biāo)示信息找到對(duì)應(yīng)的通道對(duì)象,則從預(yù)連接的通道隊(duì)列queue中提取一個(gè)新的通道,將其與主機(jī)標(biāo)示信息組成鍵值對(duì)加入哈希表hash,并將該通道返回;
c)根據(jù)所選取的通道,將現(xiàn)有數(shù)據(jù)轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器。
步驟七:構(gòu)建一個(gè)用于I/O事件處理的內(nèi)隱類(lèi),并將其掛接到數(shù)據(jù)接收器進(jìn)程的主通道內(nèi);內(nèi)隱類(lèi)的構(gòu)造方法具體為:派生類(lèi)型為ChannelInitializer<SocketChannel>的類(lèi),并重載其函數(shù)initChannel;在該函數(shù)中對(duì)所在通道的管道內(nèi)添加字符串解碼器、分隔符解碼器以及步驟六中所構(gòu)造的主攔截器等對(duì)象。
步驟八:利用步驟五中所構(gòu)建的數(shù)據(jù)接收器引導(dǎo)器來(lái)綁定數(shù)據(jù)接收器進(jìn)程端口,監(jiān)聽(tīng)TCP端口發(fā)送過(guò)來(lái)的數(shù)據(jù)。
上述步驟所有類(lèi)型NioServerSocketChannel、NioEventLoopGroup、ServerBootstrap、Bootstrap、NioSocketChannel和ChannelInitializer<SocketChannel>均為Netty程序類(lèi)庫(kù)中自帶的類(lèi)型。
本發(fā)明公開(kāi)了一種基于Netty的大規(guī)模并發(fā)數(shù)據(jù)轉(zhuǎn)發(fā)方法,適合于物聯(lián)網(wǎng)環(huán)境下大量傳感器數(shù)據(jù)的透?jìng)骰蛘邆鬏攨f(xié)議轉(zhuǎn)換等相關(guān)的應(yīng)用。
該方法包括數(shù)據(jù)轉(zhuǎn)發(fā)器與數(shù)據(jù)接收器的構(gòu)建。其中,數(shù)據(jù)接收器主要接收遠(yuǎn)程主機(jī)的數(shù)據(jù)信息,將其進(jìn)行解析后查找數(shù)據(jù)轉(zhuǎn)發(fā)器中的合適通道進(jìn)行轉(zhuǎn)發(fā);數(shù)據(jù)轉(zhuǎn)發(fā)器主要負(fù)責(zé)向遠(yuǎn)程接收主機(jī)進(jìn)行數(shù)據(jù)傳輸,針對(duì)接收到的數(shù)據(jù),模擬多個(gè)通道向遠(yuǎn)程主機(jī)發(fā)送數(shù)據(jù)。數(shù)據(jù)轉(zhuǎn)發(fā)器的構(gòu)建流程主要包括線程組的初始化,引導(dǎo)器的初始化,傳輸通道的參數(shù)設(shè)置,內(nèi)隱類(lèi)的構(gòu)造以及遠(yuǎn)程接收主機(jī)連接通道的創(chuàng)建等步驟。數(shù)據(jù)接收器的構(gòu)建流程主要包括主、從線程組的初始化、主攔截器的構(gòu)造、內(nèi)隱類(lèi)的構(gòu)造以及數(shù)據(jù)監(jiān)聽(tīng)等步驟。
本發(fā)明中所描述內(nèi)容適合基于本框架的數(shù)據(jù)轉(zhuǎn)發(fā)與透?jìng)?,相關(guān)技術(shù)人員可以根據(jù)具體應(yīng)用場(chǎng)景來(lái)進(jìn)行修改。若為數(shù)據(jù)透?jìng)?,可將?shù)據(jù)原樣轉(zhuǎn)發(fā);若為協(xié)議轉(zhuǎn)換后的數(shù)據(jù)轉(zhuǎn)發(fā),則可編寫(xiě)協(xié)議轉(zhuǎn)換的具體代碼后,將數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā)。本發(fā)明所描述的方法可支持十萬(wàn)級(jí)別并發(fā)量的數(shù)據(jù)轉(zhuǎn)發(fā)。
本說(shuō)明書(shū)中所描述的以上內(nèi)容僅僅是對(duì)本發(fā)明所作的舉例說(shuō)明。本發(fā)明所屬技術(shù)領(lǐng)域的技術(shù)人員可以對(duì)所描述的具體實(shí)施例做各種修改或補(bǔ)充或采用類(lèi)似的方式替代,只要不偏離本發(fā)明說(shuō)明書(shū)的內(nèi)容或者超越本權(quán)利要求書(shū)所定義的范圍,均應(yīng)屬于本發(fā)明的保護(hù)范圍。