分布式系统之间的通信有以下两种。
基于消息方式的系统间通信的实现基于远程呼叫方式的系统间通信
基于远程调用实现系统间通信
远程呼叫方式是尽可能将系统间的呼叫模拟为系统内的呼叫,使使用者感觉为调用本地接口的方式但是,远程调用并不完全透明。 因为有网络问题、超时问题、串行化/反序列化问题等。基于远程呼叫实现系统间通信的两种方法
用Java实现远程呼叫的技术主要有RMI和web服务两种。
RMI
在远程媒体集成(RMI )中,客户端只是服务器端提供服务的接口,通过接口实现对远程服务器端的调用。
远程调用基于网络通信进行,RMI也是如此。
RMI服务器端:通过启动RMI注册对象,在一个端口上拦截外部提供的接口。 服务器收到客户端的请求后,分析其中的对象信息等,通过反射获取适当的对象和方法,完成功能的调用。 将结果序列化并通过TCP/IP返回给客户端。 RMI客户端:用poxy代理了对服务器端口的访问。 诸如RMI客户端访问的服务器对象之类的信息封装在一个对象中进行序列化,然后通过TCP/IP传输到服务器端。 最后接收服务器端返回的数据,逆序列化后传递给调用方。
服务器端代码:
RMI要求在服务器端接口上实现远程接口。 接口上的每个方法都必须抛出远程执行。 服务器端业务类通过实现接口提供业务功能,通过调用unicastremoteobject.export object将对象绑定到端口,最后在本地LocateRegistry中注册
//服务器端对外提供的接口
publicinterfacebusinessextendsremote {
公共字符串消息(string message )远程执行;
}
//在服务器端实现此接口的类
publicclassbusinessimplimplementsbuniness {
公共字符串交换(字符串消息) throws远程执行
.
}
}
基于//RMI的服务器端
publicstaticvoidmain (字符串[ ]数组) {
int post=9527;
字符串名称='业务演示';
usiness business=new business impl (;
unicastremoteobject .导出对象(业务,后期);
注册表注册表注册表=locate注册表. create注册表(1099;
注册(名称,商业);
}
客户端代码:
客户端首先从LocateRegistry.getRegistry ()获取Registry对象,然后从Registrylookup字符串获取要调用的服务器端口的实例对象,最后是远程自动
注册表注册表=locate注册表.注册表(localhost );
字符串名称='业务演示';
为BusinessDemo类创建代理类
remoteexceptionbusinessbusiness=(业务)注册. lookup )名称;
网络服务
web服务是语言之间系统之间交互的标准。
服务端:以HTTP格式提供服务。 该服务由WSDL编写,该文件描述了服务使用的协议、所需的参数、返回的参数格式等。 服务端需要将WSDL文件放置在HTTP服务器上,然后使用Java辅助功能通过WSDL文件生成客户端的sub代码。 服务器端接收来自客户端的请求,通过反射调用服务。 客户端:用sub代码将生成的对象请求信息封装到标准SOAP格式的数据中,并将请求发送到服务器端。 客户端和服务端的数据交换格式是SOAP。
服务器端代码:
//服务器端对外提供的接口
publicinterfacebusinessextendsremote {
公共字符串消息(string message )远程执行;
}
//在服务器端实现此接口的类
@ web服务(名称='业务',服务名称='业务服务',目标名称=' http://web服务. chapter1. book
@ soap绑定(样式=soap绑定.样式. RPC ) )。
publicclassbusinessimplimplementsbuniness {
公共字符串交换(字符串消息) throws远程执行
.
}
}
//公开web服务的类
publicstaticvoidmain (字符串[ ]数组) {
endpoint.publish (' http://本地主机:9527 /业务服务',新业务impl );
system.out.println (服务器已注册);
}
客户端代码:
客户端使用JDK bin目录下的wsimport命令生成服务调用代码。 通过执行以下命令生成辅助代码:
w导入- keep http://本地主机:9527 /业务服务? wsdl
执行后,将在文件夹book/chapter/WebService/client下生成Business.java和BusinessService.java的代码,并基于这些代码创建客户端代码
业务服务业务=新建业务服务(
business business=business service.getbusinessport (;
商业.电子商务(命令);