底層架構-遠程通訊

          一:基本原理
              主要是要實現網絡之間的通訊,網絡通信需要做的就是將流從一臺計算機傳輸到另外一臺計算機,基于傳輸協議和網絡IO來實現,其中傳輸協議比較出名的有http、 tcp、udp等等,http、tcp、udp都是在基于Socket概念上為某類應用場景而擴展出的傳輸協議,網絡IO,主要有bio、nio、aio 三種方式,所有的分布式應用通訊都基于這個原理而實現。

          二:實踐
          在分布式服務框架中,一個最基礎的問題就是遠程服務是怎么通訊的,在Java領域中有很多可實現遠程通訊的技術:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS
          既然引入出了這么多技術,那我們就順道深入挖掘下去,了解每個技術框架背后的東西:
          1.首先看RMI
               RMI主要包含如下內容: 
               遠程服務的接口定義 
                ·遠程服務接口的具體實現 
                ·樁(Stub)和框架(Skeleton)文件 
                ·一個運行遠程服務的服務器 
                ·一個RMI命名服務,它允許客戶端去發現這個遠程服務 
                ·文件的提供者(一個HTTP或者FTP服務器) 
                ·一個需要這個遠程服務的客戶端程序 
              
              來看下基于RMI的一次完整的遠程通信過程的原理:
              1)客戶端發起請求,請求轉交至RMI客戶端的stub類;
              2)stub類將請求的接口、方法、參數等信息進行序列化;
              3)基于tcp/ip將序列化后的流傳輸至服務器端;
              4)服務器端接收到流后轉發至相應的skelton類;
              5)skelton類將請求的信息反序列化后調用實際的處理類;
              6)處理類處理完畢后將結果返回給skelton類;
              7)Skelton類將結果序列化,通過tcp/ip將流傳送給客戶端的stub;
              8)stub在接收到流后反序列化,將反序列化后的Java Object返回給調用者。

               RMI應用級協議內容:
          1、傳輸的標準格式是什么?
                是Java ObjectStream。
          2、怎么樣將請求轉化為傳輸的流?
                基于Java串行化機制將請求的java object信息轉化為流。
          3、怎么接收和處理流?
                根據采用的協議啟動相應的監聽端口,當有流進入后基于Java串行化機制將流進行反序列化,并根據RMI協議獲取到相應的處理對象信息,進行調用并處理,處理完畢后的結果同樣基于java串行化機制進行返回。
          4、傳輸協議是?
                tcp/ip。

          原理講了,開始實踐:
          創建RMI程序的6個步驟: 
          1、定義一個遠程接口的接口,該接口中的每一個方法必須聲明它將產生一個RemoteException異常。 
          2、定義一個實現該接口的類。 
          3、使用RMIC程序生成遠程實現所需的殘根和框架。 
          4、創建一個服務器,用于發布2中寫好的類。 
          5. 創建一個客戶程序進行RMI調用。 
          6、啟動rmiRegistry并運行自己的遠程服務器和客戶程序     
              
           
          1)首先創建遠程接口:
           /**
           * 遠程接口
           * 
           * @author mike
           *
           * 
          @since 2012-3-14
           
          */
          public interface Hello extends Remote {
              /**
               * 測試rmi 
               * 
               * 
          @return   hello
               * 
          @throws RemoteException
               
          */
              public String hello()throws RemoteException;
          }
                 
               2)創建接口實現
                  package com.gewara.rmi;

          import java.rmi.RemoteException;
          import java.rmi.server.UnicastRemoteObject;

          /**
           * 遠程接口實現
           * 
           * 
          @author mike
           *
           * 
          @since 2012-3-14
           
          */
          public class HelloImpl extends UnicastRemoteObject implements Hello {

              /**
               * seria id
               
          */
              private static final long serialVersionUID = -7931720891757437009L;

              protected HelloImpl() throws RemoteException {
                  super();
              }

              /**
               * hello實現
               * 
               * 
          @return hello world
               * 
          @throws RemoteException
               
          */
              public String hello() throws RemoteException {
                  return "hello world";
              }

          }

                 3)創建服務器端
                  package com.gewara.rmi;

          import java.rmi.Naming;
          import java.rmi.registry.LocateRegistry;

          public class Server {
              
              private static final String RMI_URL="rmi://192.168.2.89:10009/server";
              
              /**
               * RMI Server
               
          */
              public Server() {  
                  try {  
                      //創建遠程對象
                      Hello hello=new HelloImpl();
                      
                      //啟動注冊表
                      LocateRegistry.createRegistry(10009);
                      
                      //將名稱綁定到對象
                      Naming.bind(RMI_URL, hello);
                      
                  } catch (Exception e) {  
                      e.printStackTrace();  
                  }  
              }  
              
              /**
               * 
          @param args
               
          */
              public static void main(String[] args) {
                  new Server();

              }

          }

                  4)創建客服端
                  package com.gewara.rmi;

          import java.rmi.Naming;

          public class Client {

              private static final String RMI_URL="rmi://192.168.2.89:10009/server";
              /**
               * 
          @param args
               
          */
              public static void main(String[] args) {
                   try {  
                             String result=((Hello)Naming.lookup(RMI_URL)).hello();
                          System.out.println(result);  
                      } catch (Exception e) {  
                          e.printStackTrace();  
                      }  
              }

          }

              5)先啟動服務器端,然后再啟動客戶端
                 顯示結果:hello world

          由于涉及到的內容比較多,打算每一篇里講一個遠程通訊框架,繼續詳解RMI
              
          三:詳解RMI內部原理
          1. RMI基本結構:包含兩個獨立的程序,服務器和客戶端,服務器創建多個遠程對象,讓遠程對象能夠被引用,等待客戶端調用這些遠程對象的方法。客戶端從服務器獲取到一個或則多個遠程對象的引用,然后調用遠程對象方法,主要涉及到RMI接口、回調等技術。

          2.RMI回調:服務器提供遠程對象引用供客戶端調用,客戶端主動調用服務器,如果服務器主動打算調用客戶端,這就叫回調。

          3.命名遠程對象:客戶端通過一個命名或則一個查找服務找到遠程服務,遠程服務包含Java的命名和查找接口(Java Naming and Directory Interface)JNDI
          RMI提供了一種服務:RMI注冊rmiregistry,默認端口:1099,主機提供遠程服務,接受服務,啟動注冊服務的命令:start rmiregistry
          客戶端使用一個靜態類Naming到達RMI注冊處,通過方法lookup()方法,客戶來詢問注冊。

          posted on 2012-03-12 09:57 陳睿 閱讀(2297) 評論(2)  編輯  收藏 所屬分類: 底層架構

          評論

          # re: 底層架構-遠程通訊[未登錄] 2012-03-13 13:38 tbw

          恩 不錯的   回復  更多評論   

          # re: 底層架構-遠程通訊 2012-03-22 14:06 allenny

          Mina算不上吧;JNDI這種東西都過時了  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2012年3月>
          26272829123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 荃湾区| 蓝山县| 永州市| 涞水县| 藁城市| 威信县| 西乌珠穆沁旗| 汕头市| 东宁县| 中牟县| 科技| 白河县| 台北市| 加查县| 环江| 土默特右旗| 清新县| 云阳县| 洛阳市| 永年县| 屏东县| 巴东县| 南昌县| 滨海县| 社会| 枞阳县| 中阳县| 大同市| 新干县| 眉山市| 吴江市| 资中县| 鄂伦春自治旗| 邢台市| 金湖县| 铅山县| 昆明市| 兰州市| 阿克陶县| 论坛| 涞水县|