性能主題Netty原理和使用 Netty是一個(gè)高性能 事件驅(qū)動(dòng)的異步的非堵塞的IO(NIO)框架,用于建立TCP等底層的連接,基于Netty可以建立高性能的Http服務(wù)器。支持HTTP、 WebSocket 、Protobuf、
Binary
TCP |和UDP,Netty已經(jīng)被很多高性能項(xiàng)目作為其Socket底層基礎(chǔ),如HornetQ Infinispan Vert.x 傳統(tǒng)堵塞的IO讀取如下: InputStream is = new FileInputStream("input.bin"); 而使用NIO如下: while (true) { 堵塞與非堵塞原理傳統(tǒng)硬件的堵塞如下,從內(nèi)存中讀取數(shù)據(jù),然后寫到磁盤,而CPU一直等到磁盤寫完成,磁盤的寫操作是慢的,這段時(shí)間CPU被堵塞不能發(fā)揮效率。 使用非堵塞的DMA如下圖:CPU只是發(fā)出寫操作這樣的指令,做一些初始化工作,DMA具體執(zhí)行,從內(nèi)存中讀取數(shù)據(jù),然后寫到磁盤,當(dāng)完成寫后發(fā)出一個(gè)中斷事件給CPU。這段時(shí)間CPU是空閑的,可以做別的事情。這個(gè)原理稱為Zero.copy零拷貝。 Netty底層基于上述Java NIO的零拷貝原理實(shí)現(xiàn): 比較
演示Netty的使用代碼如下: Channel channel = ... 通過引入觀察者監(jiān)聽,當(dāng)有數(shù)據(jù)時(shí),將自動(dòng)激活監(jiān)聽者中的代碼運(yùn)行。 我們使用Netty建立一個(gè)服務(wù)器代碼: public class EchoServer { private final int port; public EchoServer(int port) { public void run() throws Exception { // Start the server. // Wait until the server socket is closed. 這段代碼調(diào)用:在9999端口啟動(dòng) new EchoServer(9999).run(); 我們需要完成的代碼是EchoServerHandler: public class EchoServerHandler extends ChannelInboundHandlerAdapter { private static final Logger logger = Logger.getLogger(EchoServerHandler.class.getName()); @Override @Override @Override 原理一個(gè)Netty服務(wù)器的原理如下: 圖中每次請求的讀取是通過UpStream來實(shí)現(xiàn),然后激活我們的服務(wù)邏輯如EchoServerHandler,而服務(wù)器向外寫數(shù)據(jù),也就是響應(yīng)是通過DownStream實(shí)現(xiàn)的。每個(gè)通道Channel包含一對UpStream和DownStream,以及我們的handlers(EchoServerHandler),如下圖,這些都是通過channel pipeline封裝起來的,數(shù)據(jù)流在管道里流動(dòng),每個(gè)Socket對應(yīng)一個(gè)ChannelPipeline。
CHANNELPIPELINE是關(guān)鍵,它類似Unix的管道,有以下作用:
客戶端代碼前面我們演示了服務(wù)器端代碼,下面是客戶端代碼: public class EchoClient { public EchoClient(String host, int port, int firstMessageSize) { public void run() throws Exception { // Start the client. // Wait until the connection is closed. 客戶端的應(yīng)用邏輯EchoClientHandler: public class EchoClientHandler extends ChannelInboundHandlerAdapter { private static final Logger logger = Logger.getLogger(EchoClientHandler.class.getName()); private final ByteBuf firstMessage; /** @Override @Override @Override @Override }
banq
2014-07-22
![]() Orleans 是微軟推出的類似Scala Akka的Actor模型,可用于實(shí)現(xiàn) DDD +EventSourcing/CQRS系統(tǒng)。 Orlea....
banq
2014-07-20
![]() 國內(nèi)大部分號稱 云計(jì)算 的產(chǎn)品基本是主機(jī)托管+數(shù)據(jù)中心,很多人認(rèn)為 ....
banq
2014-07-16
![]() 這是一篇討論客戶端MVC和服務(wù)器端MVC的比較文章。 首先分離關(guān)注是架構(gòu)設(shè)計(jì)的一個(gè)基本原則,多層架構(gòu)中:數(shù)據(jù)存儲 服務(wù)層 API層和表現(xiàn)層各層之間應(yīng)該最小依賴,服務(wù)層只需要知道在哪里存儲數(shù)據(jù),A....
banq
2014-07-08
![]() 一位Node.js guru大牛 TJ Holowaychuk最近發(fā)表了 再會Node.js ,他曾經(jīng)是Empress, Mocha, Jade, Stylus Koa等參與者,TJ在這篇宣言中首先強(qiáng)....
banq
2014-07-05
![]() 這是來自ScalaDays 2014大會上有關(guān)如何使用 DDD EventSourcing/CQRS和Akka構(gòu)建一個(gè)reactive的微服務(wù)應(yīng)用系統(tǒng)的演講,大意如下, ..
|
|