幾種遠程監控通信方式的介紹
? ? ? ?一.RPC
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封裝格式(soap用來描述傳遞信息的格式)
4. WSDL的描述方式
5. UDDI UDDI是一種目錄服務,企業可以使用它對Webservices進行注冊和搜索
三.RMI (Remote Method Invocation)
RMI 采用stubs 和 skeletons來進行遠程對象(remote object)的通訊。stub 充當遠程對象的客戶端代理,有著和遠程對象相同的遠程接口,遠程對象的調用實際是通過調用該對象的客戶端代理對象stub來完成的,通過該機制RMI就好比它是本地工作,采用tcp/ip協議,客戶端直接調用服務端上的一些方法。優點是強類型,編譯期可檢查錯誤,缺點是只能基于Java語言,客戶機與服務器緊耦合。
來看下基于RMI的一次完整的遠程通信過程的原理:1. 客戶端發起請求,請求轉交至RMI客戶端的stub類;
2. stub類將請求的接口、方法、參數等信息進行序列化;
3. 基于socket將序列化后的流傳輸至服務器端;
4. 服務器端接收到流后轉發至相應的skelton類;
5. skelton類將請求的信息反序列化后調用實際的處理類;
6. 處理類處理完畢后將結果返回給skelton類;
7. Skelton類將結果序列化,通過socket將流傳送給客戶端的stub;
8. stub在接收到流后反序列化,將反序列化后的java Object返回給調用者。
四.JMS(Java?Messaging Service)
JMS是Java的消息服務,JMS的客戶端之間可以通過JMS服務進行異步的消息傳輸。JMS支持兩種消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即點對點和發布訂閱模型。
JMS呢,是實現java領域遠程通信的一種手段和方法,基于JMS實現遠程通信時和RPC是不同的,雖然可以做到RPC的效果,但因為不是從協議 級別定義的,因此我們不認為JMS是個RPC協議,但它確實是個遠程通信協議,在其他的語言體系中也存在著類似JMS的東西,可以統一的將這類機制稱為消 息機制,而消息機制呢,通常是高并發、分布式領域推薦的一種通信機制,這里的主要一個問題是容錯(詳細見ErLang論文)。
來看JMS中的一次遠程通信的過程:
1. 客戶端將請求轉化為符合JMS規定的Message;
2. 通過JMS API將Message放入JMS Queue(點對點)或Topic(發布/訂閱)中;
3. 如為JMS Queue,則發送中相應的目標Queue中,如為Topic,則發送給訂閱了此Topic的JMS Queue。
4. 處理端則通過輪訓JMS Queue,來獲取消息,接收到消息后根據JMS協議來解析Message并處理。
幾種遠程監控方式的比較
一、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與RMI
RMI是在tcp協議上傳遞可序列化的java對象,只能用在java虛擬機上,綁定語言,客戶端和服務端都必須是java
webservice沒有這個限制,webservice是在http協議上傳遞xml文本文件,與語言和平臺無關
四、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的跨平臺各有千秋吧。
評論
查看更多