j2ee高級開發技術課程第十四周

RPC(Remote Procedure Call Protocol)

       RPC使用C/S方式,採用http協議,發送請求到服務器,等待服務器返回結果。這個請求包括一個參數集和一個文本集,一般造成「classname.methodname」形式。優勢是跨語言跨平臺,C端、S端有更大的獨立性,缺點是不支持對象,不支持異步調用,沒法在編譯器檢查錯誤,只能在運行期檢查。java

 

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

 

Web Service大致上分爲5個層次:apache

 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是java EE 中的一個規範,該規範描述了分佈式應用程序須要解決的問題,例如事務處理、安全、日誌、分佈

式等,而同時呢,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的關係

 

它們實際上是沒有多大關係的,它們都是java EE的規範,ejb的一種類MDB實現了JMS規範,固然是先JMS規範的

不止有ejb的mdb,好比apache  ActiveMQ也是

 

Web service與EJB

 

對這兩個經常有點迷惑人,由於他們都實現了分佈式應用調用,雖然他們很類似可是仍是有不少區別的,首先通

信協議是不同的,ejb採用rmi-iiop協議,Web service利用http協議傳輸數據,優勢常識的都知道http協議支持的較廣

泛,從這點來看Web Service層次要高一些、俗話說站得高看得遠。


Webservice主要關注於解決異構系統、不一樣語言系統通訊,其關注的是分佈式服務開發、着手點要高、站的角度高,

而ejb能夠看作是分佈式編程平臺,經過容器和組件,簡化了程序開發、調試和部署等它關注的是分佈式組件開發,粒

度小。
 Web service能夠看作是異構系統、異構語言系統間通訊的一個標準,而ejb只屬於J2EE規範的一部分。
ejb底層用rmi-iiop協議進行通訊,防火牆會阻止;web service是基於http協議進行通訊,防火牆不會阻止。

幾者的區別與聯繫

 

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

  

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對遠程對象進行訪問和調用

 

       各個對象都有側重點,做爲架構師(技術選型)、性能優化都須要基本知識給予強大的理論支持,各有千秋,充

分結合項目的實際狀況作出選擇。

相關文章
相關標籤/搜索