Java远程技术介绍学习
RMI
【既Remote Method Invoke 远程方法调用】
实现方式为,类extend了java.rmi.Remote接口,即成为存在于服务器端的远程对象,提供客户端访问。
PS: extends了Remote接口的类或者其他接口中的方法若是声明抛出了RemoteException异常,则表明该方法可被客户端远程访问调用。
同时,远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根”,而服务器端本身已存在的远程对象则称之为“骨架”。其实此时的存根是客户端的一个代理,用于与服务器端的通信,而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。
交易时序图:
简单示例
/**
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
*/
public interface IHello extends Remote {
/**
* 简单的返回“Hello World!"字样
* @return 返回“Hello World!"字样
* @throws java.rmi.RemoteException
*/
public String helloWorld() throws RemoteException;
/**
* 一个简单的业务方法,根据传入的人名返回相应的问候语
* @param someBodyName 人名
* @return 返回相应的问候语
* @throws java.rmi.RemoteException
*/
public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}
/** 远程的接口的实现 */
public class HelloImpl extends UnicastRemoteObject implements IHello {
/**
* 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常
* @throws RemoteException
*/
public HelloImpl() throws RemoteException {
}
/**
* 简单的返回“Hello World!"字样
*
* @return 返回“Hello World!"字样
* @throws java.rmi.RemoteException
*/
public String helloWorld() throws RemoteException {
return "Hello World!";
}
/**
* 一个简单的业务方法,根据传入的人名返回相应的问候语
* @param someBodyName 人名
* @return 返回相应的问候语
* @throws java.rmi.RemoteException
*/
public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
return "你好," + someBodyName + "!";
}
}
/**
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 */
public class HelloServer {
public static void main(String args[]) {
try {
//创建一个远程对象
IHello rhello = new HelloImpl();
//本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(8888); //加上此程序,就可以不要在控制台上开启RMI的注册程序,1099是RMI服务监视的默认端口
//把远程对象注册到RMI注册服务器上,并命名为RHello
//绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
Naming.bind("rmi://localhost:8888/RHello",rhello);
// Naming.bind("//localhost:8888/RHello",rhello);
System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}
/** 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 */
public class HelloClient {
public static void main(String args[]){
try {
//在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello");
System.out.println(rhello.helloWorld());
System.out.println(rhello.sayHelloToSomeBody("熔岩"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
PS:
RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。
RMI的局限性之一,两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。
【以上这个demo来自:http://lavasoft.blog.51cto.com/62575/91679/ 】
【其他知识 : http://www.blogjava.net/zhenyu33154/articles/320245.html 里面有Spring 对RMI的支持的东东 】
CXF/Axis2
简介:
Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。但是包灰常的大,不好打包部署。
CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF是XFire和Celtix项目的结合产品。
【CXF支持Spring,Axis2支持其他语言】
[至于这两个框架的远程技术,╮(╯_╰)╭不管了 ]
【来源:http://www.cnblogs.com/growup/archive/2011/03/06/1972464.html 】
Hessian
简介:
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。
采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
支持N多的语言!
实现事项:
- 服务端实现接口功能,配置web.xml和相应的servlet 。【对象必须序列化,复杂对象使用Map的方法传递】
- 客户端 需要包含Hessian(服务端的服务).jar ,然后使用HessianProxyFactory调用远程接口。
【其可以与Spring整合(不过我不觉得有什么用╮(╯_╰)╭) 】
[来源地址: http://www.cnblogs.com/yjmyzz/p/hessian-helloworld.html ]
Thrift
**介绍:
支持多语言的远程服务调用框架。支持多种数据传输协议,代码生成引擎?(编译器代码生成)。
传输数据使用二进制格式,对于高并发和大数据量有一定优势。**
官网地址:thrift.apache.org
实现方式:
- 编写Thrift文件文件,由编译器生成目录文件等东东。
- 之后编写接口,实现,服务的东东。
- 大概就酱紫
【来源 : http://www.micmiu.com/soa/rpc/thrift-sample/ 】
[来源 : http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/#ibm-pcon]
Mina
介绍:
是Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。
这个东西好奇怪,是使用Socket进行连接通信,而后,Mina对IO流进行多重的套接转换处理。
不知道这个在什么地方可以用到?_?
[来源: http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html ]
其他
- burlap
- spring-ws
- jms-ActiveMQ
2016-07-22 星期五 :clap: