本發(fā)明屬于計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種基于非阻塞通信的微服務(wù)系統(tǒng)設(shè)計(jì)方法。
背景技術(shù):
微服務(wù)作為軟件架構(gòu)領(lǐng)域的一次重要變革,被業(yè)界公認(rèn)為云計(jì)算時(shí)代應(yīng)用的主要構(gòu)建方式。它放棄傳統(tǒng)大規(guī)模的單塊集成應(yīng)用,改為細(xì)粒度、松耦合、可靈活組合的自治單元。微服務(wù)最早從Netflix、Amazon、Airbnb等公司的成功實(shí)踐開(kāi)始,因其高度的彈性、靈活性和效率的巨大提升,快速受到各領(lǐng)域架構(gòu)師和技術(shù)決策者的關(guān)注,成為當(dāng)今IT領(lǐng)域最受關(guān)注的技術(shù)潮流之一。
微服務(wù)系統(tǒng)是一種輕量級(jí)的,自我托管的服務(wù)系統(tǒng),因此通信模式是微服務(wù)系統(tǒng)中比較重要的模塊。傳統(tǒng)的通信模型是Client/Server模型,也就是兩個(gè)進(jìn)程之間進(jìn)行相互通信,其中,服務(wù)端提供位置(IP)信息,客戶端通過(guò)連接操作向服務(wù)端監(jiān)聽(tīng)的地址發(fā)起連接請(qǐng)求,通過(guò)三次握手建立連接,如果連接建立成功,雙方就可以通過(guò)網(wǎng)絡(luò)套接字(Socket)進(jìn)行通信。服務(wù)通信端口負(fù)責(zé)綁定IP地址,啟動(dòng)監(jiān)聽(tīng)端口;Socket負(fù)責(zé)發(fā)起連接操作。連接成功之后,雙方通過(guò)輸入和輸出流進(jìn)行同步阻塞式通信?;谶@個(gè)模型,雖然有各種不同的偽異步通信模型的出現(xiàn),從一定程度上能提高系統(tǒng)的并發(fā)和負(fù)載能力,但是不能從根本上解決系統(tǒng)的非阻塞的這一問(wèn)題,缺乏彈性伸縮能力。
有鑒于上述的缺陷,本設(shè)計(jì)人,積極加以研究創(chuàng)新,以期創(chuàng)設(shè)一種基于非阻塞通信的微服務(wù)系統(tǒng)設(shè)計(jì)方法,使其更具有產(chǎn)業(yè)上的利用價(jià)值。
技術(shù)實(shí)現(xiàn)要素:
為解決上述技術(shù)問(wèn)題,本發(fā)明的目的是提供一種高負(fù)載、高并發(fā)且完全非阻塞的基于非阻塞通信的微服務(wù)系統(tǒng)設(shè)計(jì)方法。
本發(fā)明的基于非阻塞通信的微服務(wù)系統(tǒng)設(shè)計(jì)方法,包括步驟:
(1)構(gòu)建三層網(wǎng)絡(luò)架構(gòu)的服務(wù)端:包括由下至上的反應(yīng)通信調(diào)度層、職責(zé)鏈管道層和業(yè)務(wù)邏輯處理層,其中
-所述反應(yīng)通信調(diào)度層監(jiān)聽(tīng)網(wǎng)絡(luò)的讀寫(xiě)和連接操作,負(fù)責(zé)將網(wǎng)絡(luò)層的數(shù)據(jù)讀取到內(nèi)存緩沖區(qū)中,然后觸發(fā)各種網(wǎng)絡(luò)事件,將這些事件觸發(fā)到管道中,由管道充當(dāng)?shù)穆氊?zé)鏈來(lái)進(jìn)行后續(xù)的處理;
-所述職責(zé)鏈管道層負(fù)責(zé)事件在職責(zé)鏈中的有序傳播,同時(shí)負(fù)責(zé)動(dòng)態(tài)的編排職責(zé)鏈,職責(zé)鏈選擇監(jiān)聽(tīng)和處理自己關(guān)心的事件、攔截處理和向后/向前傳播事件;
-所述業(yè)務(wù)邏輯處理層負(fù)責(zé)業(yè)務(wù)邏輯處理與應(yīng)用層協(xié)議管理;
(2)客戶端通過(guò)API透明地與所述服務(wù)端發(fā)送和接收信息。
進(jìn)一步的,所述服務(wù)端的實(shí)現(xiàn)步驟為:
A、創(chuàng)建一個(gè)服務(wù)的實(shí)例,所述服務(wù)為服務(wù)入口,通過(guò)消息循環(huán)等待客戶端的信息;
B、綁定一個(gè)事件循環(huán)的線程池,通過(guò)一事件循環(huán)的數(shù)值來(lái)實(shí)現(xiàn),用于處理選擇器產(chǎn)生的事件通道通道,由事件來(lái)實(shí)現(xiàn)對(duì)選擇器的輪詢,每個(gè)事件處理網(wǎng)絡(luò)的消息和系統(tǒng)自定義的任務(wù);
C、設(shè)置并綁定服務(wù)端的IO通道非阻塞服務(wù)端口通道,通過(guò)通道的類(lèi)型決定提供服務(wù)的模式;
D、注冊(cè)和創(chuàng)建通信鏈路,用于處理網(wǎng)絡(luò)事件,負(fù)責(zé)管理和執(zhí)行通道處理模塊,網(wǎng)絡(luò)事件以事件流的形式在通道管線中流轉(zhuǎn),由通道管線根據(jù)通道處理模塊的執(zhí)行策略調(diào)度通道處理模塊的執(zhí)行。
進(jìn)一步的,所述網(wǎng)絡(luò)事件的處理方法為:
a、建立系統(tǒng)編解碼框架;
b、建立通用的基于長(zhǎng)度的半包解碼器;
c、打印碼流日志;
d、對(duì)SSL進(jìn)行安全認(rèn)證;
e、進(jìn)行鏈路空閑檢測(cè);
f、流量整形;
g、采用Base64編解碼;
h、系統(tǒng)初始化并檢測(cè)工作,然后綁定并啟動(dòng)監(jiān)聽(tīng)端口,并將IO通道注冊(cè)到選擇器上監(jiān)聽(tīng)客戶端連接;
i、選擇器輪詢:由調(diào)度系統(tǒng)負(fù)責(zé)調(diào)度和執(zhí)行選擇器輪詢操作,選擇準(zhǔn)備就緒的通道集合;
j、當(dāng)輪詢到準(zhǔn)備就緒的通道之后由消息事件執(zhí)行通道鏈路的相應(yīng)方法,最終調(diào)度并執(zhí)行通道處理方法;
k、執(zhí)行用戶自定義的通道處理方法,完成整個(gè)服務(wù)端的任務(wù)。
進(jìn)一步的,所述編解碼框架為T(mén)hrift的壓縮二進(jìn)制編解碼框架或Google的Protobuf二進(jìn)制序列化框架或基于系統(tǒng)自身提供的編解碼框架。
進(jìn)一步的,所述網(wǎng)絡(luò)事件包括鏈路注冊(cè)、鏈路激活、鏈路斷開(kāi)、接收到請(qǐng)求消息、請(qǐng)求消息接收并處理完畢、發(fā)送應(yīng)答消息、鏈路發(fā)生異常、用戶自定義事件中的一種或多種。
進(jìn)一步的,所述客戶端的實(shí)現(xiàn)步驟如下:
1)創(chuàng)建處理客戶端連接、I/O讀寫(xiě)的反應(yīng)線程組非阻塞事件輪詢模塊,通過(guò)構(gòu)造函數(shù)指定I/O線程的個(gè)數(shù),默認(rèn)為CPU內(nèi)核數(shù)的2倍;
2)用戶指定的通道類(lèi)型創(chuàng)建用于客戶端連接的非阻塞端口通道;
3)創(chuàng)建默認(rèn)的通道處理模塊,用于調(diào)度和執(zhí)行網(wǎng)絡(luò)事件;
4)異步發(fā)起TCP連接,判斷連接是否成功,如果成功,則直接將非阻塞端口通道注冊(cè)到多路復(fù)用器上,監(jiān)聽(tīng)讀操作位,用于數(shù)據(jù)報(bào)讀取和消息發(fā)送;如果沒(méi)有立即連接成功,則注冊(cè)連接監(jiān)聽(tīng)位到多路復(fù)用器,等待連接結(jié)果;
5)注冊(cè)對(duì)應(yīng)的網(wǎng)絡(luò)監(jiān)聽(tīng)狀態(tài)位到多路復(fù)用器;
6)由多路復(fù)用器在I/O現(xiàn)場(chǎng)中輪詢各通道,處理連接結(jié)果;
7)如果連接成功,設(shè)置Future結(jié)果,發(fā)送連接成功事件,觸發(fā)通道管線執(zhí)行;
8)由通道管線調(diào)度執(zhí)行系統(tǒng)和用戶的通道處理模塊,執(zhí)行業(yè)務(wù)邏輯。
借由上述方案,本發(fā)明至少具有以下優(yōu)點(diǎn):
1、非阻塞模型(Non-block I/O,簡(jiǎn)稱NIO)是一種新的通信模式,完全非阻塞,非常適合微服務(wù)系統(tǒng)通信,本發(fā)明設(shè)計(jì)的基于NIO的微服務(wù)系統(tǒng)解決了客戶端和服務(wù)器高效通信的問(wèn)題,使該系統(tǒng)具備高負(fù)載、高并發(fā)性;
2、本發(fā)明的客戶端與服務(wù)端同時(shí)基于同一通信方式(非阻塞),實(shí)現(xiàn)了完全無(wú)阻塞通信。
上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,并可依照說(shuō)明書(shū)的內(nèi)容予以實(shí)施,以下以本發(fā)明的較佳實(shí)施例并配合附圖詳細(xì)說(shuō)明如后。
附圖說(shuō)明
圖1是本發(fā)明的基于非阻塞模式的服務(wù)架構(gòu)圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說(shuō)明本發(fā)明,但不用來(lái)限制本發(fā)明的范圍。
本發(fā)明的基于非阻塞通信的微服務(wù)系統(tǒng)設(shè)計(jì)方法,使服務(wù)端與客戶端同時(shí)基于非阻塞通信方式實(shí)現(xiàn)無(wú)阻塞通信。由于本發(fā)明的代碼實(shí)現(xiàn)基于JDK來(lái)實(shí)現(xiàn),因此下面實(shí)現(xiàn)描述的是基于JDK的術(shù)語(yǔ)來(lái)進(jìn)行。
服務(wù)端的架構(gòu)和基本原理如圖1所示,本發(fā)明采用了比較典型的三層網(wǎng)絡(luò)架構(gòu)進(jìn)行設(shè)計(jì):
第一層:反應(yīng)通信調(diào)度層,它由一系列輔助類(lèi)完成,包括反應(yīng)線程非阻塞事件輪詢以及其父類(lèi)、非阻塞端口通道/非阻塞服務(wù)端口通道以及其父類(lèi)、字節(jié)流緩沖以及由其衍生出來(lái)的各種緩沖、Unsafe以及其衍生出的各種內(nèi)部類(lèi)等。該層的主要職責(zé)就是監(jiān)聽(tīng)網(wǎng)絡(luò)的讀寫(xiě)和連接操作,負(fù)責(zé)將網(wǎng)絡(luò)層的數(shù)據(jù)讀取到內(nèi)存緩沖區(qū)中,然后觸發(fā)各種網(wǎng)絡(luò)事件,例如連接創(chuàng)建、連接激活、讀事件、寫(xiě)事件等等,將這些事件觸發(fā)到管道中,由管道充當(dāng)?shù)穆氊?zé)鏈來(lái)進(jìn)行后續(xù)的處理。
第二層:職責(zé)鏈管道層,它負(fù)責(zé)事件在職責(zé)鏈中的有序傳播,同時(shí)負(fù)責(zé)動(dòng)態(tài)的編排職責(zé)鏈,職責(zé)鏈可以選擇監(jiān)聽(tīng)和處理自己關(guān)心的事件,它可以攔截處理和向后/向前傳播事件,不同的應(yīng)用的處理模塊節(jié)點(diǎn)的功能也不同,通常情況下,往往會(huì)開(kāi)發(fā)編解碼處理模塊用于消息的編解碼,它可以將外部的協(xié)議消息轉(zhuǎn)換成內(nèi)部的對(duì)象,這樣上層業(yè)務(wù)側(cè)只需要關(guān)心處理業(yè)務(wù)邏輯即可,不需要感知底層的協(xié)議差異和線程模型差異,實(shí)現(xiàn)了架構(gòu)層面的分層隔離。
第三層:業(yè)務(wù)邏輯處理層,可以分為兩類(lèi):
1)純粹的業(yè)務(wù)邏輯處理,例如訂單處理;
2)應(yīng)用層協(xié)議管理,例如HTTP協(xié)議、FTP協(xié)議等。
服務(wù)端的實(shí)現(xiàn)步驟:
1)創(chuàng)建一個(gè)服務(wù)的實(shí)例,該服務(wù)為服務(wù)入口,只是簡(jiǎn)單的服務(wù)容器,通過(guò)消息循環(huán)等待客戶端的信息;
2)綁定一個(gè)事件循環(huán)的線程池,它是通過(guò)一事件循環(huán)的數(shù)值來(lái)實(shí)現(xiàn),它的功能主要是處理選擇器產(chǎn)生的事件通道通道,由事件來(lái)實(shí)現(xiàn)對(duì)選擇器的輪詢,每個(gè)事件不僅要處理網(wǎng)絡(luò)的消息,同時(shí)還處理系統(tǒng)自定義的任務(wù),這樣統(tǒng)一了整個(gè)事件的啟動(dòng)順序,避免了多線程調(diào)度而產(chǎn)生的死鎖;
3)設(shè)置并綁定服務(wù)端的IO通道非阻塞服務(wù)端口通道,該通道的主要的類(lèi)型決定了服務(wù)器以什么模式提供服務(wù);
4)注冊(cè)和創(chuàng)建通信鏈路,它是一個(gè)負(fù)責(zé)處理網(wǎng)絡(luò)事件的職責(zé)鏈,負(fù)責(zé)管理和執(zhí)行通道處理模塊,網(wǎng)絡(luò)事件以事件流的形式在通道管線中流轉(zhuǎn),由通道管線根據(jù)通道處理模塊的執(zhí)行策略調(diào)度通道處理模塊的執(zhí)行,典型的網(wǎng)絡(luò)事件如下:
a)鏈路注冊(cè);
b)鏈路激活;
c)鏈路斷開(kāi);
d)接收到請(qǐng)求消息;
e)請(qǐng)求消息接收并處理完畢;
f)發(fā)送應(yīng)答消息;
g)鏈路發(fā)生異常;
h)發(fā)生用戶自定義事件。
設(shè)置事件處理的方法,這是服務(wù)端程序最重要的一部分,它提供給用戶定制和擴(kuò)展的關(guān)鍵接口。利用通道處理接口用戶可以完成大多數(shù)的功能定制,例如消息編解碼、心跳、安全認(rèn)證、TSL/SSL認(rèn)證、流量控制和流量整形等。事件處理方法為:
(1)建議系統(tǒng)編解碼框架;
(2)建立通用基于長(zhǎng)度的半包解碼器;
(3)打印碼流日志;
(4)進(jìn)行SSL安全認(rèn)證;
(5)進(jìn)行鏈路空閑檢測(cè);
(6)流量整形;
(7)采用Base64編解碼;
(8)綁定并啟動(dòng)監(jiān)聽(tīng)端口,在綁定監(jiān)聽(tīng)端口之前系統(tǒng)會(huì)做一系列的初始化和檢測(cè)工作,完成之后,會(huì)啟動(dòng)監(jiān)聽(tīng)端口,并將IO通道注冊(cè)到選擇器上監(jiān)聽(tīng)客戶端連接;
(9)選擇器輪詢,由調(diào)度系統(tǒng)負(fù)責(zé)調(diào)度和執(zhí)行選擇器輪詢操作,選擇準(zhǔn)備就緒的通道集合;
(10)當(dāng)輪詢到準(zhǔn)備就緒的通道之后就由消息事件執(zhí)行通道鏈路的相應(yīng)方法,最終調(diào)度并執(zhí)行通道處理方法;
(11)執(zhí)行用戶自定義的通道處理方法,完成整個(gè)服務(wù)端的任務(wù)。
本發(fā)明的服務(wù)端核心功能點(diǎn):
選擇器提供選擇已經(jīng)就緒的任務(wù)的能力。簡(jiǎn)單來(lái)講,選擇器會(huì)不斷地輪詢注冊(cè)在其上的通道,如果某個(gè)通道上面有新的TCP連接接入、讀和寫(xiě)事件,這個(gè)通道就處于就緒狀態(tài),會(huì)被選擇器輪詢出來(lái),然后通過(guò)選擇關(guān)鍵字可以獲取就緒通道的集合,進(jìn)行后續(xù)的I/O操作。
為了盡可能提升性能,本發(fā)明采用了串行無(wú)鎖化設(shè)計(jì),在I/O線程內(nèi)部進(jìn)行串行操作,避免多線程競(jìng)爭(zhēng)導(dǎo)致的性能下降。表面上看,串行化設(shè)計(jì)似乎CPU利用率不高,并發(fā)程度不夠。但是,通過(guò)調(diào)整非阻塞線程池的線程參數(shù),可以同時(shí)啟動(dòng)多個(gè)串行化的線程并行運(yùn)行,這種局部無(wú)鎖化的串行線程設(shè)計(jì)相比一個(gè)隊(duì)列-多個(gè)工作線程模型性能更優(yōu)。
本發(fā)明的序列化方式:
影響序列化性能的關(guān)鍵因素總結(jié)如下:
1)序列化后的碼流大小(網(wǎng)絡(luò)帶寬占用);
2)序列化&反序列化的性能(CPU資源占用);
3)并發(fā)調(diào)用的性能表現(xiàn):穩(wěn)定性、線性增長(zhǎng)、偶現(xiàn)的時(shí)延毛刺等。
本發(fā)明默認(rèn)提供了對(duì)Google Protobuf的支持,通過(guò)擴(kuò)展的編解碼接口,用戶可以實(shí)現(xiàn)其它的高性能序列化框架,如Thrift的壓縮二進(jìn)制編解碼框架。
不同的應(yīng)用場(chǎng)景對(duì)序列化框架的需求也不同,對(duì)于高性能應(yīng)用場(chǎng)景本發(fā)明默認(rèn)提供了Google的Protobuf二進(jìn)制序列化框架,如果用戶對(duì)其它二進(jìn)制序列化框架有需求,也可以基于系統(tǒng)自身提供的編解碼框架擴(kuò)展實(shí)現(xiàn)。
架構(gòu)的不同層面,需要關(guān)心和處理的對(duì)象都不同,通常情況下,對(duì)于業(yè)務(wù)開(kāi)發(fā)者,只需要關(guān)心職責(zé)鏈的攔截和業(yè)務(wù)處理模塊的編排。因?yàn)閼?yīng)用層協(xié)議棧往往是開(kāi)發(fā)一次,到處運(yùn)行,所以實(shí)際上對(duì)于業(yè)務(wù)開(kāi)發(fā)者來(lái)說(shuō),只需要關(guān)心服務(wù)層的業(yè)務(wù)邏輯開(kāi)發(fā)即可。各種應(yīng)用協(xié)議以插件的形式提供,只有協(xié)議開(kāi)發(fā)人員需要關(guān)注協(xié)議插件,對(duì)于其他業(yè)務(wù)開(kāi)發(fā)人員來(lái)說(shuō),只需關(guān)心業(yè)務(wù)邏輯定制。這種分層的架構(gòu)設(shè)計(jì)理念實(shí)現(xiàn)了非阻塞框架各層之間的解耦,便于上層業(yè)務(wù)協(xié)議棧的開(kāi)發(fā)和業(yè)務(wù)邏輯的定制。
客戶端的實(shí)現(xiàn)原理:
客戶端可以通過(guò)API,透明地發(fā)送和接收信息,它的實(shí)現(xiàn)步驟如下:
1)創(chuàng)建處理客戶端連接、I/O讀寫(xiě)的反應(yīng)線程組非阻塞事件輪詢模塊,可以通過(guò)構(gòu)造函數(shù)指定I/O線程的個(gè)數(shù),默認(rèn)為CPU內(nèi)核數(shù)的2倍;
2)用戶指定的通道類(lèi)型創(chuàng)建用于客戶端連接的非阻塞端口通道;
3)創(chuàng)建默認(rèn)的通道處理模塊,用于調(diào)度和執(zhí)行網(wǎng)絡(luò)事件;
4)異步發(fā)起TCP連接,判斷連接是否成功,如果成功,則直接將非阻塞端口通道注冊(cè)到多路復(fù)用器上,監(jiān)聽(tīng)讀操作位,用于數(shù)據(jù)報(bào)讀取和消息發(fā)送;如果沒(méi)有立即連接成功,則注冊(cè)連接監(jiān)聽(tīng)位到多路復(fù)用器,等待連接結(jié)果;
5)注冊(cè)對(duì)應(yīng)的網(wǎng)絡(luò)監(jiān)聽(tīng)狀態(tài)位到多路復(fù)用器;
6)由多路復(fù)用器在I/O現(xiàn)場(chǎng)中輪詢各通道,處理連接結(jié)果;
7)如果連接成功,發(fā)送連接成功事件,觸發(fā)通道管線執(zhí)行;
8)由通道管線調(diào)度執(zhí)行系統(tǒng)和用戶的通道處理模塊,執(zhí)行業(yè)務(wù)邏輯。
非阻塞模型是一種新的通信模式,完全非阻塞,非常適合微服務(wù)系統(tǒng)通信,基于這個(gè)模型,本文設(shè)計(jì)的微服務(wù)系統(tǒng)具有高負(fù)載、高并發(fā)性,本發(fā)明的高性能方面體現(xiàn)如下:
綜上所述,本發(fā)明通過(guò)無(wú)阻塞的通信模式實(shí)現(xiàn)了客戶端和服務(wù)端的高效通信。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,并不用于限制本發(fā)明,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明技術(shù)原理的前提下,還可以做出若干改進(jìn)和變型,這些改進(jìn)和變型也應(yīng)視為本發(fā)明的保護(hù)范圍。