1. 程式人生 > >分散式架構之間的通訊

分散式架構之間的通訊

紅日懸天

隨筆 - 10  文章 - 0  評論 - 1
    </div><!--end: blogStats -->
</div><!--end: navigator 部落格導航欄 -->

分散式通訊的幾種方式

目前的分散式架構主要由corba和JavaEE搭建,JavaEE優點是跨平臺,開發成本低、週期短,不需要學習IDL語言;CORBA的優點是伺服器響應速度更快。決定這些架構優缺點的,主要就是通訊方式。

在分散式服務框架中,一個最基礎的問題就是遠端服務是怎麼通訊的,特別是在Java領域 中有很多可實現遠端通訊的技術,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什麼 關係呢,它們背後到底是基於什麼原理實現的呢,瞭解這些是實現分散式服務框架的基礎知識,而如果在效能上有高的要求的話,那深入瞭解這些技術背後的機制就 是必須的了。

基本原理
要實現網路機器間的通訊,首先得來看看計算機系統網路通訊的基本原理,在底層層面去看,網路通訊需要做的就是將流從一臺計算機傳輸到另外一臺計算機,基於 傳輸協議和網路IO來實現,其中傳輸協議比較出名的有http、tcp、udp等等,http、tcp、udp都是在基於Socket概念上為某類應用場 景而擴展出的傳輸協議,網路IO,主要有bio、nio、aio三種方式,所有的分散式應用通訊都基於這個原理而實現,只是為了應用的易用性,各種語言通 常都會提供一些更為貼近應用易用的應用層協議。

應用級協議
遠端服務通訊,需要達到的目標是在一臺計算機發起請求,另外一臺機器在接收到請求後進行相應的處理並將結果返回給請求端,這其中又會有諸如one way request、同步請求、非同步請求等等請求方式,按照網路通訊原理,需要實現這個需要做的就是將請求轉換成流,通過傳輸協議傳輸至遠端,遠端計算機在接 收到請求的流後進行處理,處理完畢後將結果轉化為流,並通過傳輸協議返回給呼叫端。

但為了應用的方便,業界推出了很多基於此原理之上的應用級的協議,使得大家可以不用去直接操作這麼底層的東西,通常應用級的遠端通訊協議會提供:
1、為了避免直接做流操作的麻煩,提供一種更加易用或符合語言的標準傳輸格式;
2、網路通訊機制的實現,就是替你完成了將傳輸格式轉化為流,通過某種傳輸協議傳輸至遠端計算機,遠端計算機在接收到流後轉化為傳輸格式,並進行儲存或以某種方式通知遠端計算機。
所以在學習應用級的遠端通訊協議時,我們可以帶著這幾個問題進行學習:
1、傳輸的標準格式是什麼?
2、怎麼樣將請求轉化為傳輸的流?
3、 怎麼接收和處理流?
4、傳輸協議是?
不過應用級的遠端通訊協議並不會在傳輸協議上做什麼多大的改進,主要是在流操作方面,讓應用層生成流和處理流的這個過程更加的符合所使用的語言或標準,至 於傳輸協議則通常都是可選的,在java領域中知名的有:RMI、XML-RPC、Binary- RPC、SOAP、CORBA、JMS,來具體的看看這些遠端通訊的應用級協議:

RPC(Remote Procedure Call Protocol)
RPC使用C/S方式,採用http協議,傳送請求到伺服器,等待伺服器返回結果。優點是跨語言跨平臺,C端、S端有更大的獨立性,缺點是不支援物件,不支援非同步呼叫,無法在編譯器檢查錯誤,只能在執行期檢查。

它是早期的支援分散式一種,缺點rpc是面向過程的遠端呼叫,不支援面向物件,所以現在用的人就少了。不支援非同步呼叫

WebService
Web Service提供的服務是基於web容器的,底層使用http協議,類似一個遠端的服務提供者,比如天氣預報服務,對各地客戶端提供天氣預報,是一種請求應答的機制,是跨系統跨平臺的。就是通過一個servlet,提供服務出去。

首先客戶端從伺服器的到WebService的WSDL,同時在客戶端聲稱一個代理類(Proxy Class) 這個代理類負責與WebService伺服器進行Request 和Response 當一個數據(XML格式的)被封裝成SOAP格式的資料流傳送到伺服器端的時候,就會生成一個程序物件並且把接收到這個Request的SOAP包進行解 析,然後對事物進行處理,處理結束以後再對這個計算結果進行SOAP包裝,然後把這個包作為一個Response傳送給客戶端的代理類(Proxy Class),同樣地,這個代理類也對這個SOAP包進行解析處理,繼而進行後續操作。這就是WebService的一個執行過程。

Web Service大體上分為5個層次:
1. Http傳輸通道
2. XML的資料格式
3. SOAP封裝格式
4. WSDL的描述方式
5. UDDI UDDI是一種目錄服務,企業可以使用它對Webservices進行註冊和搜尋

RMI (Remote Method Invocation)
這裡寫圖片描述
RMI 採用stubs 和 skeletons 來進行遠端物件(remote object)的通訊。stub 充當遠端物件的客戶端代理,有著和遠端物件相同的遠端介面,遠端物件的呼叫實際是通過呼叫該物件的客戶端代理物件stub來完成的,通過該機制RMI就好 比它是本地工作,採用tcp/ip協議,客戶端直接呼叫服務端上的一些方法。優點是強型別,編譯期可檢查錯誤,缺點是隻能基於JAVA語言,客戶機與服務 器緊耦合;

JRMP是Java持有的,基於流的協議,完成一個物件的Java到Java的遠端呼叫;IIOP是CORBA物件請求代理之間交流的協議,Java中使得程式可以和其他語言的CORBA實現互操作性的協議,和JRMP互補。

優點:支援分散式物件、跨平臺,stubs/skeletons機制;缺點:不能跨語言。

JMS(Java Messaging Service)
JMS是Java的訊息服務,JMS的客戶端之間可以通過JMS服務進行非同步的訊息傳輸。JMS支援兩種訊息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即點對點和釋出訂閱模型。

優點:支援非同步通訊、訊息produce和recept鬆耦合。

EJB(enterprise java bean)
EJB是javaEE中的一個規範,該規範描述了分散式應用程式需要解決的問題,例如事務處理、安全、日誌、分散式等,而同時呢,sun公司也實現了自己定義的這一個標準,相當於自己頒佈一個標準然後,又給出了實現供別人使用,實現以很多API的方式提供給用的人。
EJB是按照java伺服器介面定義的java類,可以理解為一個特殊的java類,放在容器裡容器可以幫助該類管理事務、分散式、安全等,一般小的程式 不會用到,只有大型分散式系統才會用到EJB,既然ejb是一個java類或是一個元件,顆粒較小,這也是與Webservice的區別之一,下面會說 到,它就可以被其它一個或多個模組呼叫。
包含了三種類型的Bean,可以通過註釋JPA一個規範來標記,其中有一種Bean,叫MDB訊息驅動bean,它的通訊機制涉及到了JMS協議。
EJB可以進行遠端呼叫,但是不能夠跨語言,ejb是同步呼叫,而平時我們說的的ejb非同步呼叫指的是ejb的MDB非同步通訊。

JNDI(Java naming and Directory Interface)
Java命名與目錄介面,包含兩個服務,命名服務獎名稱和物件聯絡起來,使得我們可以用名稱訪問物件,目錄服務是一種命名服務,在這種服務裡,物件不但有名稱,還有屬性。

使用JNDI,一個J2EE應用程式可以儲存和動態獲取任何型別的命名Java物件。因為JNDI不依賴於任何特定的執行,應用程式可以使用 JNDI訪問各種命名目錄服務,包括現有的諸如LDAP、NDS、DNS、NIS、COS命名和RMI註冊等服務。這使得J2EE應用程式可以和傳統的應 用程式和系統共存。
這裡寫圖片描述
從JNDI的架構中可以看出,JNDI分為三部分,應用程式程式設計介面(API)和服務供應商介面(SPI),前者Java應用程式訪問各種命名和目錄服 務,開發上層應用的程式設計師就不必去關心底層具體的技術細節,後者則是設計來供任意一種服務的供應商(也包括目錄服務供應商)使用,這一層一般由供應商去完 成。

EJB與JMS
它們其實是沒有多大關係的,它們都是javaEE的規範,EJB的一種類MDB實現了JMS規範,當然是先JMS規範的不止有ejb的mdb,比如apache ActiveMQ也是

WebService與EJB
對這兩個常常有點迷惑人,因為他們都實現了分散式應用呼叫,雖然他們很相似但是還是有很多區別的,首先通訊協議是不一樣的,EJB採用rmi-iiop協 議,Web service利用http協議傳輸資料,優點,http協議支援的較廣泛,從這點來看Web Service層次要高一些、俗話說站得高看得遠。

WebService主要關注於解決異構系統、不同語言系統通訊,其關注的是分散式服務開發、著手點要高、站的角度高,而EJB可以看做是分散式程式設計平臺,通過容器和元件,簡化了程式開發、除錯和部署等它關注的是分散式元件開發,粒度小。
WebService可以看做是異構系統、異構語言系統間通訊的一個標準,而EJB只屬於J2EE規範的一部分。
EJB底層用rmi-iiop協議進行通訊,防火牆會阻止;WebService是基於http協議進行通訊,防火牆不會阻止。

RPC與RMI

RPC和RMI之間的一個重要差別是RPC用快速而不夠可靠的UDP協議,RMI用低速而可靠的TCP/IP協議

(1)RPC 跨語言,而 RMI只支援Java。
(2)RMI 呼叫遠端物件方法,允許方法返回 Java 物件以及基本資料型別,而RPC 不支援物件的概念,傳送到 RPC服務的訊息由外部資料表示 (External Data Representation, XDR) 語言表示,這種語言抽象了位元組序類和資料型別結構之間的差異。只有由 XDR 定義的資料型別才能被傳遞, 可以說 RMI 是面向物件方式的 Java RPC 。
(3)在方法呼叫上,RMI中,遠端介面使每個遠端方法都具有方法簽名。如果一個方法在伺服器上執行,但是沒有相匹配的簽名被新增到這個遠端介面上,那麼這個新方法就不能被RMI客戶方所呼叫。
在RPC中,當一個請求到達RPC伺服器時,這個請求就包含了一個引數集和一個文字值,通常形成“classname.methodname”的形式。這 就向RPC伺服器表明,被請求的方法在為 “classname”的類中,名叫“methodname”。然後RPC伺服器就去搜索與之相匹配的類和方法,並把它作為那種方法引數型別的輸入。這裡 的引數型別是與RPC請求中的型別是匹配的。一旦匹配成功,這個方法就被呼叫了,其結果被編碼後返回客戶方。

JMS與RMI
JMS 服務,物件是在物理上被非同步從網路的某個JVM 上直接移動到另一個JVM 上(是訊息通知機制)
而RMI 物件是繫結在本地JVM 中,只有函式引數和返回值是通過網路傳送的(是請求應答機制)。

RMI一般都是同步的,也就是說,當client呼叫Server的一個方法的時候,需要等到對方的返回,才能繼續執行client端,這個過程呼叫本地方法感覺上是一樣的,這也是RMI的一個特點。
JMS 一般只是一個點發出一個Message到Message Server,發出之後一般不會關心誰用了這個message。
所以,一般RMI的應用是緊耦合,JMS的應用相對來說是鬆散耦合應用。

WebService與JMS
WebService專注於遠端服務呼叫,JMS專注於資訊交換。
大多數情況下WebService是兩系統間的直接互動(Consumer <–> Producer),而大多數情況下JMS是三方系統互動(Consumer <- Broker -> Producer)。當然,JMS也可以實現request-response模式的通訊,只要Consumer或Producer其中一方兼任 broker即可。

JMS可以做到非同步呼叫完全隔離了客戶端和服務提供者,能夠抵禦流量洪峰; WebService服務通常為同步呼叫,需要有複雜的物件轉換,相比SOAP,現在JSON,rest都是很好的http架構方案;(舉一個例子,電子 商務的分散式系統中,有支付系統和業務系統,支付系統負責使用者付款,在使用者在銀行付款後需要通知各個業務系統,那麼這個時候,既可以用同步也可以用非同步, 使用非同步的好處就能抵禦網站暫時的流量高峰,或者能應對慢消費者。)

JMS是java平臺上的訊息規範。一般JMS訊息不是一個xml,而是一個java物件,很明顯,jms沒考慮異構系統,說白了,JMS就沒考慮 非java的東西。但是好在現在大多數的jms provider(就是JMS的各種實現產品)都解決了異構問題。相比WebService的跨平臺各有千秋吧。

RMI與JNDI
RMI是一個能夠建立一個N層應用,擴充套件中間層,將屬於不同應用的分佈物件包容起來,使用跨過中間層來共享資料和邏輯,能真正實現分散式的解決方案。通過 它能夠在執行時,通過網路發現不同機器的服務程式,並對應用間的通訊進行管理,能確保像本地一樣使用遠端物件。在RMI中使用rmiregistry時存 在一定的問題,rmiregistry只是用作測試基於RMI的應用程式的一種方法,當停止並重新啟動rmiregistry時,需要中心註冊其中的所有 物件,針對這種情況,一般會使用JNDI為遠端物件使用一個命名和目錄服務,使用LDAP來儲存遠端物件。RMI只是一種遠端物件訪問的介面規範,遵循此 規範的物件可被遠端訪問,但是要使用rmi的服務註冊程式註冊之後才能夠被遠端呼叫。JNDI是Java命名和目錄服務訪問介面,通過JNDI,可以訪問 已經在命名和目錄伺服器中註冊的服務物件,因此,可以把RMI物件註冊在Ldap命名目錄伺服器中,然後使用JNDI對遠端物件進行訪問和呼叫各個物件都 有側重點,作為架構師(技術選型)、效能優化都需要基本知識給予強大的理論支援,各有千秋,充分結合專案的實際情況做出選擇。

好文要頂 關注我 收藏該文 紅日懸天
關注 - 2
粉絲 - 1 +加關注 0 0 currentDiggType = 0; » 下一篇: IDL簡介與corba入門案例
posted @ 2016-09-23 11:08 紅日懸天 閱讀( 3235) 評論( 0) 編輯 收藏 重新整理評論 重新整理頁面 返回頂部 註冊使用者登入後才能發表評論,請 登入註冊訪問網站首頁。 【推薦】超50萬VC++原始碼: 大型組態工控、電力模擬CAD與GIS原始碼庫!
【前端】SpreadJS表格控制元件,可嵌入應用開發的線上Excel
【免費】程式設計師21天搞定英文文件閱讀
【推薦】如何快速搭建人工智慧應用?
qcloud0814 最新IT新聞:
· 賈躍亭感動到流淚? 樂視電視下半年將重回市場
· 淘汰雞肋 微軟公佈Win8軟體商店關閉時間表
· 北汽董事長徐和誼:董明珠玩不轉銀隆 北汽不做全才
· 中國郵政董事長劉愛力:EMS明年引入戰略投資者啟動IPO
· 鬥士陸奇: 一直向前 從未停歇
» 更多新聞… 華為雲HC 最新知識庫文章:
· 一個故事看懂“區塊鏈”
· 被踢出去的使用者
· 成為一個有目標的學習者
· 歷史轉折中的“杭派工程師”
· 如何提高程式碼質量?
» 更多知識庫文章… fixPostBody(); setTimeout(function () { incrementViewCount(cb_entryId); }, 50); deliverAdT2(); deliverAdC1(); deliverAdC2(); loadNewsAndKb(); loadBlogSignature(); LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid); GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType); loadOptUnderPost(); GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);

</div><!--end: forFlow -->
</div><!--end: mainContent 主體內容容器-->

<div id="sideBar">
    <div id="sideBarMain">

公告

暱稱: 紅日懸天
園齡: 2年
粉絲: 1
關注: 2 +加關注
        <div id="blog-calendar" style=""><table id="blogCalendar" class="Cal" cellspacing="0" cellpadding="0" title="Calendar">
<tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0">
    <tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar('2018/07/01');return false;">&lt;</a></td><td align="center">2018年8月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar('2018/09/01');return false;">&gt;</a></td></tr>
</tbody></table></td></tr><tr><th class="CalDayHeader" align="center" abbr="日" scope="col">日</th><th class="CalDayHeader" align="center" abbr="一" scope="col">一</th><th class="CalDayHeader" align="center" abbr="二" scope="col">二</th><th class="CalDayHeader" align="center" abbr="三" scope="col">三</th><th class="CalDayHeader" align="center" abbr="四" scope="col">四</th><th class="CalDayHeader" align="center" abbr="五" scope="col">五</th><th class="CalDayHeader" align="center" abbr="六" scope="col">六</th></tr><tr><td class="CalOtherMonthDay" align="center">29</td><td class="CalOtherMonthDay" align="center">30</td><td class="CalOtherMonthDay" align="center">31</td><td align="center">1</td><td align="center">2</td><td align="center">3</td><td class="CalWeekendDay" align="center">4</td></tr><tr><td class="CalWeekendDay" align="center">5</td><td align="center">6</td><td align="center">7</td><td align="center">8</td><td align="center">9</td><td align="center">10</td><td class="CalWeekendDay" align="center">11</td></tr><tr><td class="CalWeekendDay" align="center">12</td><td align="center">13</td><td align="center">14</td><td align="center">15</td><td align="center">16</td><td align="center">17</td><td class="CalWeekendDay" align="center">18</td></tr><tr><td class="CalWeekendDay" align="center">19</td><td align="center">20</td><td class="CalTodayDay" align="center">21</td><td align="center">22</td><td align="center">23</td><td align="center">24</td><td class="CalWeekendDay" align="center">25</td></tr><tr><td class="CalWeekendDay" align="center">26</td><td align="center">27</td><td align="center">28</td><td align="center">29</td><td align="center">30</td><td align="center">31</td><td class="CalOtherMonthDay" align="center">1</td></tr><tr><td class="CalOtherMonthDay" align="center">2</td><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td><td class="CalOtherMonthDay" align="center">5</td><td class="CalOtherMonthDay" align="center">6</td><td class="CalOtherMonthDay" align="center">7</td><td class="CalOtherMonthDay" align="center">8</td></tr>

        <div id="leftcontentcontainer">
            <div id="blog-sidecolumn"><div id="sidebar_search" class="sidebar-block">

搜尋

   

常用連結

隨筆檔案

最新評論


閱讀排行榜

評論排行榜

推薦排行榜

Copyright ©2018 紅日懸天