分布式Java--基于远程调用实现系统间通信
2018-09-17 02:59
661 查看
分布式系统之间通信可以分为两种:
基于消息方式实现系统间通信
基于远程调用方式实现系统间通信
远程调用基于网络通信来实现,RMI也是如此:
RMI服务端:通过启动RMI注册对象在一个端口上监听对外提供的接口。服务端接收到客户端请求后,解析其中的对象信息等,然后通过反射来获取相应的对象和方法来完成功能的调用。最后将结果序列化通过TCP/IP返回给客户端。
RMI客户端:通过proxy的方式代理了对服务器端口的访问。RMI客户端将要访问的服务器对象等信息封装成一个对象序列化后通过TCP/IP传输到服务端。最后接收服务端返回的数据,反序列化后交给调用发起者。
服务端:以HTTP的形式提供服务,该服务采用WSDL描述,这个文件中描述服务所使用的协议,所希望的参数、返回的参数格式等。服务端应将WSDL文件放入HTTP服务器中,并借助Java辅助工具根据WSDL文件生成客户端sub代码。服务器端接收客户端请求并通过反射调用服务。
客户端:通过sub代码将产生的对象请求信息封装为标准的SOAP格式数据,并发送请求到服务器端。客户端和服务端的数据交互格式是SOAP。
基于消息方式实现系统间通信
基于远程调用方式实现系统间通信
基于远程调用实现系统间通信
远程调用方式就是尽可能将系统间的调用模拟为系统内的调用,让使用者感觉远程调用就像是调用本地接口一样。但远程调用并不能做到完全透明,因为存在网络问题、超时问题、序列化/反序列化问题等等。两种基于远程调用实现系统间通信的方法
在Java中实现远程调用的技术主要有RMI和WebService两种。RMI
RMI(Remote Method Invocation)中,客户端只有服务端提供服务的接口,通过接口实现对远程服务端的调用。远程调用基于网络通信来实现,RMI也是如此:
RMI服务端:通过启动RMI注册对象在一个端口上监听对外提供的接口。服务端接收到客户端请求后,解析其中的对象信息等,然后通过反射来获取相应的对象和方法来完成功能的调用。最后将结果序列化通过TCP/IP返回给客户端。
RMI客户端:通过proxy的方式代理了对服务器端口的访问。RMI客户端将要访问的服务器对象等信息封装成一个对象序列化后通过TCP/IP传输到服务端。最后接收服务端返回的数据,反序列化后交给调用发起者。
服务端代码:
RMI要求服务端接口实现Remote接口,接口上每个方法必须抛出RemoteException.服务端业务类通过实现该接口提供业务功能,然后调用UnicastRemoteObject.exportObject将对象绑定到某端口上,最后将该对象注册到本地LocateRegistry上,此时形成一个字符串对应于对象实例的映射关系。//服务器端对外提供的接口 public interface Business extends Remote{ public String echo(String message) throws RemoteException; } //服务器端实现该接口的类 public class BusinessImpl implements Buniness{ public String echo(String message) throws RemoteException{ ... } } //基于RMI的服务器端 public static void main(String[] args){ int post = 9527; String name = "BusinessDemo"; Business business = new BusinessImpl(); UnicastRemoteObject.exportObject(business, post); Registry registry = LocateRegistry.createRegistry(1099); registry.rebind(name,business); }
客户端代码:
客户端首先通过LocateRegistry.getRegistry()来获取Registry对象,然后通过Registrylookup字符串获取要调用的服务器端口的实例对象,最后以接口的方式调用远程对象的方法。Registry registry = LocateRegistry.getRegistry("localhost"); String name = "BusinessDemo"; //创建BusinessDemo类的代理类 RemoteException business business = (Business) registry.lookup(name);
WebService
WebService是一种跨语言的系统间交互标准。服务端:以HTTP的形式提供服务,该服务采用WSDL描述,这个文件中描述服务所使用的协议,所希望的参数、返回的参数格式等。服务端应将WSDL文件放入HTTP服务器中,并借助Java辅助工具根据WSDL文件生成客户端sub代码。服务器端接收客户端请求并通过反射调用服务。
客户端:通过sub代码将产生的对象请求信息封装为标准的SOAP格式数据,并发送请求到服务器端。客户端和服务端的数据交互格式是SOAP。
服务端代码:
//服务器端对外提供的接口 public interface Business extends Remote{ public String echo(String message) throws RemoteException; } //服务器端实现该接口的类 @WebService(name="Business",serviceName="BusinessService",targetNamespace="http://WebService.chapter1.book/client") @SOAPBinding(style=SOAPBind.Style.RPC) public class BusinessImpl implements Buniness{ public String echo(String message) throws RemoteException{ ... } } //发布WebService的类 public static void main(String[] args){ Endpoint.publish("http://localhost:9527/BusinessService",new BusinessImpl()); System.out.println("Server has beed started"); }
客户端代码:
客户端通过JDK bin目录下的wsimport命令来生成服务调用代码Business.java和BusinessService.java,基于这两个代码编写客户端代码:BusinessService businessService = new BusinessService(); Business business = businessService.getBusinessPort(); business.echo(command);
相关文章推荐
- 基于WebService实现远程调用方式的系统间通信
- 分布式Java--基于消息方式实现系统间通信
- [分布式java]基于JavaAPI实现消息方式的系统间通信:TCP/IP+BIO
- [分布式java]基于JavaAPI实现消息方式的系统间通信:UDP/IP+NIO
- [分布式java]基于JavaAPI实现消息方式的系统间通信:UDP/IP+BIO
- 基于RMI实现远程调用的系统间通信
- 基于WebService实现远程调用方式的系统间通信
- 基于RMI实现远程调用的系统间通信
- 分布式Java应用之基于消息方式实现系统间的通信(2)
- [分布式java]基于JavaAPI实现消息方式的系统间通信:TCP/IP+NIO
- java分布式开发TCP/IP NIO无阻塞 Socket((基于消息方式实现系统间的通信) )(转)
- Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)
- 基于java自身技术实现消息方式的系统间通信
- 基于java自身技术实现消息方式的系统间通信
- Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)
- Java——基于java自身包实现消息系统间的通信(TCP/IP+BIO)
- java分布式应用之初:实现系统间通信方式简介
- Java——基于java自身包实现消息系统间的通信(TCP/IP+BIO)
- java远程通讯轻量级HttpInvoker实现理赔调用承保核心系统打印出险前保单实现
- 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】