底層架構(gòu)-遠程通訊
一:基本原理
主要是要實現(xiàn)網(wǎng)絡之間的通訊,網(wǎng)絡通信需要做的就是將流從一臺計算機傳輸?shù)搅硗庖慌_計算機,基于傳輸協(xié)議和網(wǎng)絡IO來實現(xiàn),其中傳輸協(xié)議比較出名的有http、 tcp、udp等等,http、tcp、udp都是在基于Socket概念上為某類應用場景而擴展出的傳輸協(xié)議,網(wǎng)絡IO,主要有bio、nio、aio 三種方式,所有的分布式應用通訊都基于這個原理而實現(xiàn)。
二:實踐
主站蜘蛛池模板:
孝昌县|
延边|
邛崃市|
茌平县|
延津县|
霸州市|
武山县|
丹阳市|
独山县|
印江|
潜山县|
开江县|
平潭县|
上高县|
阜康市|
夏河县|
呼伦贝尔市|
佛冈县|
洛浦县|
永川市|
吴旗县|
叶城县|
宜君县|
云梦县|
抚松县|
辉县市|
黄浦区|
米易县|
庐江县|
札达县|
西城区|
平利县|
黄浦区|
刚察县|
阜新市|
新化县|
竹北市|
德兴市|
胶州市|
洞口县|
大足县|
主要是要實現(xiàn)網(wǎng)絡之間的通訊,網(wǎng)絡通信需要做的就是將流從一臺計算機傳輸?shù)搅硗庖慌_計算機,基于傳輸協(xié)議和網(wǎng)絡IO來實現(xiàn),其中傳輸協(xié)議比較出名的有http、 tcp、udp等等,http、tcp、udp都是在基于Socket概念上為某類應用場景而擴展出的傳輸協(xié)議,網(wǎng)絡IO,主要有bio、nio、aio 三種方式,所有的分布式應用通訊都基于這個原理而實現(xiàn)。
二:實踐
在分布式服務框架中,一個最基礎的問題就是遠程服務是怎么通訊的,在Java領(lǐng)域中有很多可實現(xiàn)遠程通訊的技術(shù):RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS
既然引入出了這么多技術(shù),那我們就順道深入挖掘下去,了解每個技術(shù)框架背后的東西:
1.首先看RMI
RMI主要包含如下內(nèi)容:
·樁(Stub)和框架(Skeleton)文件
·一個運行遠程服務的服務器
·一個RMI命名服務,它允許客戶端去發(fā)現(xiàn)這個遠程服務
·類文件的提供者(一個HTTP或者FTP服務器)
·一個需要這個遠程服務的客戶端程序
來看下基于RMI的一次完整的遠程通信過程的原理:
既然引入出了這么多技術(shù),那我們就順道深入挖掘下去,了解每個技術(shù)框架背后的東西:
1.首先看RMI
RMI主要包含如下內(nèi)容:
遠程服務的接口定義
·遠程服務接口的具體實現(xiàn) ·樁(Stub)和框架(Skeleton)文件
·一個運行遠程服務的服務器
·一個RMI命名服務,它允許客戶端去發(fā)現(xiàn)這個遠程服務
·類文件的提供者(一個HTTP或者FTP服務器)
·一個需要這個遠程服務的客戶端程序
來看下基于RMI的一次完整的遠程通信過程的原理:
1)客戶端發(fā)起請求,請求轉(zhuǎn)交至RMI客戶端的stub類;
2)stub類將請求的接口、方法、參數(shù)等信息進行序列化;
3)基于tcp/ip將序列化后的流傳輸至服務器端;
4)服務器端接收到流后轉(zhuǎn)發(fā)至相應的skelton類;
5)skelton類將請求的信息反序列化后調(diào)用實際的處理類;
6)處理類處理完畢后將結(jié)果返回給skelton類;
7)Skelton類將結(jié)果序列化,通過tcp/ip將流傳送給客戶端的stub;
8)stub在接收到流后反序列化,將反序列化后的Java Object返回給調(diào)用者。
RMI應用級協(xié)議內(nèi)容:
RMI應用級協(xié)議內(nèi)容:
1、傳輸?shù)臉藴矢袷绞鞘裁矗?/div>是Java ObjectStream。2、怎么樣將請求轉(zhuǎn)化為傳輸?shù)牧鳎?/div>基于Java串行化機制將請求的java object信息轉(zhuǎn)化為流。3、怎么接收和處理流?根據(jù)采用的協(xié)議啟動相應的監(jiān)聽端口,當有流進入后基于Java串行化機制將流進行反序列化,并根據(jù)RMI協(xié)議獲取到相應的處理對象信息,進行調(diào)用并處理,處理完畢后的結(jié)果同樣基于java串行化機制進行返回。4、傳輸協(xié)議是?tcp/ip。創(chuàng)建RMI程序的6個步驟:
原理講了,開始實踐:
1、定義一個遠程接口的接口,該接口中的每一個方法必須聲明它將產(chǎn)生一個RemoteException異常。
2、定義一個實現(xiàn)該接口的類。
3、使用RMIC程序生成遠程實現(xiàn)所需的殘根和框架。
4、創(chuàng)建一個服務器,用于發(fā)布2中寫好的類。
5. 創(chuàng)建一個客戶程序進行RMI調(diào)用。
6、啟動rmiRegistry并運行自己的遠程服務器和客戶程序
1)首先創(chuàng)建遠程接口:
/*** 遠程接口
*
* @author mike
*
* @since 2012-3-14
*/
public interface Hello extends Remote {
/**
* 測試rmi
*
* @return hello
* @throws RemoteException
*/
public String hello()throws RemoteException;
}
2)創(chuàng)建接口實現(xiàn)
package com.gewara.rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* 遠程接口實現(xiàn)
*
* @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實現(xiàn)
*
* @return hello world
* @throws RemoteException
*/
public String hello() throws RemoteException {
return "hello world";
}
}
3)創(chuàng)建服務器端
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 {
//創(chuàng)建遠程對象
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)創(chuàng)建客服端
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)先啟動服務器端,然后再啟動客戶端
顯示結(jié)果:hello world
由于涉及到的內(nèi)容比較多,打算每一篇里講一個遠程通訊框架,繼續(xù)詳解RMI
三:詳解RMI內(nèi)部原理
1. RMI基本結(jié)構(gòu):包含兩個獨立的程序,服務器和客戶端,服務器創(chuàng)建多個遠程對象,讓遠程對象能夠被引用,等待客戶端調(diào)用這些遠程對象的方法。客戶端從服務器獲取到一個或則多個遠程對象的引用,然后調(diào)用遠程對象方法,主要涉及到RMI接口、回調(diào)等技術(shù)。
2.RMI回調(diào):服務器提供遠程對象引用供客戶端調(diào)用,客戶端主動調(diào)用服務器,如果服務器主動打算調(diào)用客戶端,這就叫回調(diào)。
3.命名遠程對象:客戶端通過一個命名或則一個查找服務找到遠程服務,遠程服務包含Java的命名和查找接口(Java Naming and Directory Interface)JNDI
RMI提供了一種服務:RMI注冊rmiregistry,默認端口:1099,主機提供遠程服務,接受服務,啟動注冊服務的命令:start rmiregistry
客戶端使用一個靜態(tài)類Naming到達RMI注冊處,通過方法lookup()方法,客戶來詢問注冊。posted on 2012-03-12 09:57 陳睿 閱讀(2296) 評論(2) 編輯 收藏 所屬分類: 底層架構(gòu)
![]()