官术网_书友最值得收藏!

第1章 分布式Java應(yīng)用

大型應(yīng)用通常會(huì)拆分為多個(gè)子系統(tǒng)來實(shí)現(xiàn),對(duì)于Java來說,這些子系統(tǒng)可能部署在同一臺(tái)機(jī)器的多個(gè)不同的JVM中,也可能部署在不同的機(jī)器上,但這些子系統(tǒng)又不是完全獨(dú)立的,要相互通信來共同實(shí)現(xiàn)業(yè)務(wù)功能,對(duì)于此類Java應(yīng)用,我們稱之為分布式Java應(yīng)用。

Martin Fowler在《企業(yè)應(yīng)用架構(gòu)模式》一書中曾經(jīng)說過:“能不用分布式的情況下就不要用分布式”,當(dāng)應(yīng)用變?yōu)榉植际絁ava應(yīng)用時(shí),會(huì)很大程度地增加應(yīng)用實(shí)現(xiàn)的技術(shù)復(fù)雜度,對(duì)于分布式Java應(yīng)用,通常有兩種典型的方法來實(shí)現(xiàn)。

1. 基于消息方式實(shí)現(xiàn)系統(tǒng)間的通信

當(dāng)系統(tǒng)之間要通信時(shí),就向外發(fā)送消息,消息可以是字節(jié)流、字節(jié)數(shù)組,甚至是Java對(duì)象,其他系統(tǒng)接收到消息后則進(jìn)行相應(yīng)的業(yè)務(wù)處理。

消息方式的系統(tǒng)間通信,通常基于網(wǎng)絡(luò)協(xié)議來實(shí)現(xiàn),常用的實(shí)現(xiàn)系統(tǒng)間通信的協(xié)議有:TCP/IP和UDP/IP。

TCP/IP是一種可靠的網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)膮f(xié)議。TCP/IP要求通信雙方首先建立連接,之后再進(jìn)行數(shù)據(jù)的傳輸。TCP/IP負(fù)責(zé)保證數(shù)據(jù)傳輸?shù)目煽啃裕〝?shù)據(jù)的可到達(dá)、數(shù)據(jù)到達(dá)的順序等,但由于TCP/IP需要保證連接及數(shù)據(jù)傳輸?shù)目煽浚虼丝赡軙?huì)犧牲一些性能。

UDP/IP是一種不保證數(shù)據(jù)一定到達(dá)的網(wǎng)絡(luò)數(shù)據(jù)傳輸協(xié)議。UDP/IP并不直接給通信的雙方建立連接,而是發(fā)送到網(wǎng)絡(luò)上進(jìn)行傳遞。由于UDP/IP不建立連接,并且不能保證數(shù)據(jù)傳輸?shù)目煽浚虼诵阅苌媳憩F(xiàn)相對(duì)較好,但可能會(huì)出現(xiàn)數(shù)據(jù)丟失以及數(shù)據(jù)亂序的現(xiàn)象。

TCP/IP和UDP/IP可用于完成數(shù)據(jù)的傳輸,但要完成系統(tǒng)間通信,還需要對(duì)數(shù)據(jù)進(jìn)行處理。例如讀取和寫入數(shù)據(jù),按照POSIX標(biāo)準(zhǔn)分為同步IO和異步IO兩種,其中同步IO中最常用的是BIO(Blocking IO)和NIO(Non-Blocking IO)。

從程序角度而言,BIO就是當(dāng)發(fā)起IO的讀或?qū)懖僮鲿r(shí),均為阻塞方式,只有當(dāng)程序讀到了流或?qū)⒘鲗懭氩僮飨到y(tǒng)后,才會(huì)釋放資源。

NIO是基于事件驅(qū)動(dòng)思想http://en.wikipedia.org/wiki/Event-driven_programming的,實(shí)現(xiàn)上通常采用Reactor模式http://en.wikipedia.org/wiki/Reactor_pattern,從程序角度而言,當(dāng)發(fā)起IO的讀或?qū)懖僮鲿r(shí),是非阻塞的;當(dāng)Socket有流可讀或可寫入Socket時(shí),操作系統(tǒng)會(huì)相應(yīng)地通知應(yīng)用程序進(jìn)行處理,應(yīng)用再將流讀取到緩沖區(qū)或?qū)懭氩僮飨到y(tǒng)。對(duì)于網(wǎng)絡(luò)IO而言,主要有連接建立、流讀取及流寫入三種事件,Linux 2.6以后的版本采用epollhttp://lse.sourceforge.net/epoll/index.html方式來實(shí)現(xiàn)NIO。

下面再來看看另一種方式——AIO。AIO為異步IO方式,同樣基于事件驅(qū)動(dòng)思想,實(shí)現(xiàn)上通常采用Proactor模式http://en.wikipedia.org/wiki/Proactor_pattern。從程序角度而言,和NIO不同,當(dāng)進(jìn)行讀寫操作時(shí),只須直接調(diào)用API的read或write方法即可。這兩種方法均為異步的,對(duì)于讀操作而言,當(dāng)有流可讀取時(shí),操作系統(tǒng)會(huì)將可讀的流傳入read方法的緩沖區(qū),并通知應(yīng)用程序;對(duì)于寫操作而言,當(dāng)操作系統(tǒng)將write方法傳遞的流寫入完畢時(shí),操作系統(tǒng)主動(dòng)通知應(yīng)用程序。較之NIO而言,AIO一方面簡(jiǎn)化了程序的編寫,流的讀取和寫入都由操作系統(tǒng)來代替完成;另一方面省去了NIO中程序要遍歷事件通知隊(duì)列(Selector)的代價(jià)。Windows基于IOCPhttp://en.wikipedia.org/wiki/Input/output_completion_port實(shí)現(xiàn)了AIO,Linux目前只有基于epoll模擬實(shí)現(xiàn)的AIO。

Java對(duì)TCP/IP和UDP/IP均支持,在網(wǎng)絡(luò)IO的操作上,Java 7以前的版本僅支持BIO和NIO兩種方式,對(duì)AIO方式感興趣的讀者可自行下載Sun JDK 7進(jìn)行嘗試。

2. 基于遠(yuǎn)程調(diào)用方式實(shí)現(xiàn)系統(tǒng)間的通信

當(dāng)系統(tǒng)之間要通信時(shí),可通過調(diào)用本地的一個(gè)Java接口的方法,透明地調(diào)用遠(yuǎn)程的Java實(shí)現(xiàn)。具體的細(xì)節(jié)則由Java或框架來完成,這種方式在Java中主要用來實(shí)現(xiàn)基于RMI和WebService的應(yīng)用。

本章通過舉例來介紹如何基于Java的包及開源的產(chǎn)品來實(shí)現(xiàn)以上兩種方式的系統(tǒng)間通信,這些是實(shí)現(xiàn)分布式Java應(yīng)用的基礎(chǔ)和必備知識(shí),采用的例子如下。

示例程序由一個(gè)服務(wù)器端程序和一個(gè)客戶端程序構(gòu)成,是典型的請(qǐng)求-響應(yīng)機(jī)制,即客戶端發(fā)送請(qǐng)求,服務(wù)端響應(yīng)。客戶端讀取用戶的輸入,并將輸入的字符串信息發(fā)送給服務(wù)器端,服務(wù)器端接收到信息后響應(yīng),當(dāng)客戶端輸入的是quit字符串時(shí),則停止客戶端和服務(wù)器端的程序。

主站蜘蛛池模板: 吴堡县| 新平| 丹寨县| 临邑县| 日土县| 西乌珠穆沁旗| 登封市| 双桥区| 南丹县| 金寨县| 松潘县| 黔东| 兴化市| 阜城县| 栾川县| 化隆| 平邑县| 玛多县| 大余县| 仪陇县| 常山县| 樟树市| 健康| 元阳县| 永年县| 乐亭县| 武义县| 讷河市| 浦县| 东莞市| 英德市| 甘谷县| 桃源县| 阜康市| 廉江市| 扎兰屯市| 太白县| 饶平县| 叙永县| 昂仁县| 长兴县|