博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java随笔--分布式
阅读量:6328 次
发布时间:2019-06-22

本文共 1853 字,大约阅读时间需要 6 分钟。

hot3.png

java分布式实现方式:

  1. CORBA (没接触过,暂且略过)
  2. WebService
  3. RMI远程方法调用

    对于WebService,写过接口的人都很熟悉,所以本文重点记录一下RMI。

1.RMI结构图

                       ----图片改编自《JAVA核心技术卷2》

2.示例代码

  1. 首先定义一个接口,RMI接口要继承Remote类,方法要抛出RemoteException异常,此接口client端也要持有,才能调用远程方法。
    import java.rmi.Remote; import java.rmi.RemoteException; public interface IHelloService extends Remote {   public void sayHello() throws RemoteException; }

     

  2. server端接口实现
    import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class HelloServiceImpl extends UnicastRemoteObject implements IHelloService {   @Override   public void sayHello() throws RemoteException{     System.out.println("Hello World!");  } }

     

  3. 注册服务
    public class TestServer {     public static void main(String args[]) {         try {             IHelloService service = new HelloServiceImpl();             LocateRegistry.createRegistry(1099);            Naming.bind("rmi://localhost:1099/HelloService",Service);         } catch (Exception e) {             e.printStackTrace();         }    } }

     

  4. client端调用
    public class TestClient {	public static void main(String[] args) {		try {			String url="rmi://localhost:1099/HelloService"; 			IHelloService service = (IHelloService)Naming.lookup(url); 			service.sayHello();		} catch (Exception e) {			e.printStackTrace();		}	}}
    文件分布情况

            server端:

                    IHelloService.class

                    HelloServiceImpl.class

                    TestServer.class

            client端:

                    IHelloService.class

                    TestClient.class

           RMI虚拟机之间传值的两种机制

                (1)继承了Remote类的对象作为远程引用传递

                (2)实现了Serializable接口的对象使用序列化进行复制       

3.题外话    

       通过上述示例,一个简单的RMI程序就完成了。但是在实际应用中,会涉及到众多服务的分布式部署,就涉及到多台服务的服务注册问题,书中提到”为了安全原因,注册表只允许来自本机的服务注册“,这就要求注册表服务器里需要有所有发布服务的class文件,个人认为这么做反而比较繁琐了。

        此处便引出了另一种架构,各个服务在自己的服务器注册表中注册,由一个中间件去记录服务和地址的映射,客户端通过中间件获取服务地址,达到远程调用的目的。至于提供地址映射的中间件可选方式就很多啦,例如 ZooKeeperRedis等等,甚至你可以自己去实现功能去实现服务和地址映射关系的记录。

        本文只谈到了RMI的基本应用,对于书中提到动态加载、远程对象激活等内容暂且忽略,有应用需求的话可以深入了解一下。

转载于:https://my.oschina.net/blueSky4Java/blog/704208

你可能感兴趣的文章
(hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)
查看>>
CentOS7 iso封装语句
查看>>
Web项目从Oracle转为Mysql,fluentnhibernate-1.0和NHibernate2.1.0升级到NHibernate3.3的注意事项...
查看>>
Https 公钥、私钥、证书
查看>>
javacsript Numnber 对象
查看>>
MOS管基本构造和工作原理
查看>>
RocketMQ原理解析-Broker
查看>>
【转】【Linux】linux下xargs命令
查看>>
sql server<> != 从数据类型varchar转换为numeric 时出错
查看>>
利用命令行发邮件
查看>>
mac install brew
查看>>
hdu1285 确定比赛名次(拓扑排序多种方法)
查看>>
mysql在linux下的安装
查看>>
php删除数组中指定值的元素
查看>>
第六天-request response\13-request乱码.avi;
查看>>
git版本超前了N个版本且落后了N个版本的解决办法
查看>>
QSettings读写注冊表、配置文件
查看>>
Elasticsearch之CURL命令的mget查询
查看>>
使用ssh-keygen生成ssh公钥和私钥
查看>>
【Centos】【Python】【Flask】阿里云上部署一个 flask 项目
查看>>