要實現網絡機器間的通訊,首先得來看看計算機系統網絡通信的基本原理,在底層層面去看,網絡通信需要做的就是將流從一台計算機傳輸到另外一台計算機,基於傳輸協議和網絡IO來實現,其中傳輸協議比較出名的有http、tcp、udp等等,http、tcp、udp都是在基於Socket概念上為某類應用場景而擴展出的傳輸協議,網絡IO,主要有bio、nio、aio三種方式,所有的分布式應用通訊都基於這個原理而實現,只是為了應用的易用,各種語言通常都會提供一些更為貼近應用易用的應用層協議。
遠程服務通訊,需要達到的目標是在一台計算機發起請求,另外一台機器在接收到請求後進行相應的處理並將結果返回給請求端,這其中又會有諸如one way request、同步請求、異步請求等等請求方式,按照網絡通信原理,需要實現這個需要做的就是將請求轉換成流,通過傳輸協議傳輸至遠端,遠端計算機在接收到請求的流後進行處理,處理完畢後將結果轉化為流,並通過傳輸協議返回給調用端。
原理是這樣的,但為了應用的方便,業界推出了很多基於此原理之上的應用級的協議,使得大家可以不用去直接操作這麼底層的東西,通常應用級的遠程通信協議會提供:
為了避免直接做流操作這麼麻煩,提供一種更加易用或貼合語言的標准傳輸格式;
網絡通信機制的實現,就是替你完成了將傳輸格式轉化為流,通過某種傳輸協議傳輸至遠端計算機,遠端計算機在接收到流後轉化為傳輸格式,並進行存儲或以某種方式通知遠端計算機。
所以在學習應用級的遠程通信協議時,我們可以帶著這幾個問題進行學習:
◆ 傳輸的標准格式是什麼?
◆ 怎麼樣將請求轉化為傳輸的流?
◆ 怎麼接收和處理流?
◆ 傳輸協議是?
不過應用級的遠程通信協議並不會在傳輸協議上做什麼多大的改進,主要是在流操作方面,讓應用層生成流和處理流的這個過程更加的貼合所使用的語言或標准,至於傳輸協議則通常都是可選的,在java領域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS,來具體的看看這些遠程通信的應用級協議:
RMI是個典型的為java定制的遠程通信協議,我們都知道,在single vm中,我們可以通過直接調用java object instance來實現通信,那麼在遠程通信時,如果也能按照這種方式當然是最好了,這種遠程通信的機制成為RPC(Remote Procedure Call),RMI正是朝著這個目標而誕生的。
來看下基於RMI的一次完整的遠程通信過程的原理:
◆ 客戶端發起請求,請求轉交至RMI客戶端的stub類;
◆ stub類將請求的接口、方法、參數等信息進行序列化;
◆ 基於socket將序列化後的流傳輸至服務器端;
◆ 服務器端接收到流後轉發至相應的skelton類;
◆ skelton類將請求的信息反序列化後調用實際的處理類;
◆ 處理類處理完畢後將結果返回給skelton類;
◆ Skelton類將結果序列化,通過socket將流傳送給客戶端的stub;
◆ stub在接收到流後反序列化,將反序列化後的Java Object返回給調用者。
根據原理來回答下之前學習應用級協議帶著的幾個問題:
◆ 傳輸的標准格式是什麼?
是Java ObjectStream。
◆ 怎麼樣將請求轉化為傳輸的流?
基於Java串行化機制將請求的java object信息轉化為流。
◆ 怎麼接收和處理流?
根據采用的協議啟動相應的監聽端口,當有流進入後基於Java串行化機制將流進行反序列化,並根據RMI協議獲取到相應的處理對象信息,進行調用並處理,處理完畢後的結果同樣基於java串行化機制進行返回。
◆ 傳輸協議是?
Socket。
XML-RPC也是一種和RMI類似的遠程調用的協議,它和RMI的不同之處在於它以標准的xml格式來定義請求的信息(請求的對象、方法、參數等),這樣的好處是什麼呢,就是在跨語言通訊的時候也可以使用。
來看下XML-RPC協議的一次遠程通信過程:
◆ 客戶端發起請求,按照XML-RPC協議將請求信息進行填充;
◆ 填充完畢後將xml轉化為流,通過傳輸協議進行傳輸;
◆ 接收到在接收到流後轉換為xml,按照XML-RPC協議獲取請求的信息並進行處理;
◆ 處理完畢後將結果按照XML-RPC協議寫入xml中並返回。
同樣來回答問題:
◆ 傳輸的標准格式是?
標准格式的XML。
◆ 怎麼樣將請求轉化為傳輸的流?
將XML轉化為流。
◆ 怎麼接收和處理流?
通過監聽的端口獲取到請求的流,轉化為XML,並根據協議獲取請求的信息,進行處理並將結果寫入XML中返回。
◆ 傳輸協議是?
Http。