天天看點

遠端通信的幾種選擇(RPC,Webservice,RMI,JMS的差別)

轉自:http://blog.csdn.net/shan9liang/article/details/8995023

RPC(Remote Procedure Call Protocol)

RPC使用C/S方式,采用http協定,發送請求到伺服器,等待伺服器傳回結果。這個請求包括一個參數集和一個文本集,通常形成“classname.methodname”形式。優點是跨語言跨平台,C端、S端有更大的獨立性,缺點是不支援對象,無法在編譯器檢查錯誤,隻能在運作期檢查。

Web Service

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語言,客戶機與伺服器緊耦合。

JMS(Java Messaging Service)

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

幾者的差別與聯系

1、RPC與RMI

(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請求中的類型是比對的。一旦比對成功,這個方法就被調用了,其結果被編碼後傳回客戶方。

2、JMS和RMI

采用JMS 服務,對象是在實體上被異步從網絡的某個JVM 上直接移動到另一個JVM 上(是消息通知機制)

而RMI 對象是綁定在本地JVM 中,隻有函數參數和傳回值是通過網絡傳送的(是請求應答機制)。

RMI一般都是同步的,也就是說,當client調用Server的一個方法的時候,需要等到對方的傳回,才能繼續執行client端,這個過程調用本地方法感覺上是一樣的,這也是RMI的一個特點。

JMS 一般隻是一個點發出一個Message到Message Server,發出之後一般不會關心誰用了這個message。

是以,一般RMI的應用是緊耦合,JMS的應用相對來說是松散耦合應用。

3、Webservice與RMI

RMI是在tcp協定上傳遞可序列化的java對象,隻能用在java虛拟機上,綁定語言,用戶端和服務端都必須是java

webservice沒有這個限制,webservice是在http協定上傳遞xml文本檔案,與語言和平台無關

4、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的跨平台各有千秋吧。