前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式Java--基于远程调用实现系统间通信

分布式Java--基于远程调用实现系统间通信

作者头像
SuperHeroes
发布2019-03-12 14:39:07
7530
发布2019-03-12 14:39:07
举报
文章被收录于专栏:云霄雨霁云霄雨霁

分布式系统之间通信可以分为两种:

  • 基于消息方式实现系统间通信
  • 基于远程调用方式实现系统间通信

基于远程调用实现系统间通信

远程调用方式就是尽可能将系统间的调用模拟为系统内的调用,让使用者感觉远程调用就像是调用本地接口一样。但远程调用并不能做到完全透明,因为存在网络问题、超时问题、序列化/反序列化问题等等。

两种基于远程调用实现系统间通信的方法

在Java中实现远程调用的技术主要有RMI和WebService两种。

RMI

RMI(Remote Method Invocation)中,客户端只有服务端提供服务的接口,通过接口实现对远程服务端的调用。

远程调用基于网络通信来实现,RMI也是如此:

  • RMI服务端:通过启动RMI注册对象在一个端口上监听对外提供的接口。服务端接收到客户端请求后,解析其中的对象信息等,然后通过反射来获取相应的对象和方法来完成功能的调用。最后将结果序列化通过TCP/IP返回给客户端。
  • RMI客户端:通过proxy的方式代理了对服务器端口的访问。RMI客户端将要访问的服务器对象等信息封装成一个对象序列化后通过TCP/IP传输到服务端。最后接收服务端返回的数据,反序列化后交给调用发起者。
服务端代码:

RMI要求服务端接口实现Remote接口,接口上每个方法必须抛出RemoteException.服务端业务类通过实现该接口提供业务功能,然后调用UnicastRemoteObject.exportObject将对象绑定到某端口上,最后将该对象注册到本地LocateRegistry上,此时形成一个字符串对应于对象实例的映射关系。

代码语言:javascript
复制
//服务器端对外提供的接口
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字符串获取要调用的服务器端口的实例对象,最后以接口的方式调用远程对象的方法。

代码语言:javascript
复制
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。
服务端代码:
代码语言:javascript
复制
//服务器端对外提供的接口
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,基于这两个代码编写客户端代码:

代码语言:javascript
复制
BusinessService businessService = new BusinessService();
Business business = businessService.getBusinessPort();
business.echo(command);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/09/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于远程调用实现系统间通信
    • 两种基于远程调用实现系统间通信的方法
      • RMI
      • WebService
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档