发表于: 2017-03-09 22:15:08

1 1400


今天完成的事情:了解分布式,了解了一下RMI
明天计划的事情:先用spring RMI完成一个demo,然后开始把自己的项目开始拆分
遇到的问题:暂无
收获:

先了解一下分布式:

什么是分布式: 三个步骤完成华丽转身——任意软件变为“分布式”
  • 将你的整个软件视为一个系统(不管它有多复杂)
  • 将整个系统分割为一系列的Process(进程),每个Process完成一定的功能
  • 将这些Process分散到不同的机器上,分散后,选择若干种(没错一种可能不够)通信协议把他们连接起来
分布式的核心是:实现一个分布式系统,最核心的两点:
  • 如何拆分— 可以有很多方式,核心依据一是业务需求,二是成本限制(这是实践中构建分布式系统最主要的设计依据)
  • 如何连接— 光把系统拆开成Process还不够,关键是拆开后的Process之间还要能通信,因此涉及通信协议设计的问题,需要考虑的因素很多,好消息是这部分其实成熟方案很多

为什么要使用分布式:
  • 为了性能扩展—系统负载高,单台及其无法承载,希望通过使用多台机器来提高系统的负载能力
  • 为了增强可靠性— 软件不是完美的,网络不是完美的,甚至及其本身也不可能是完美的,随时可能出错,为了避免故障,需要将业务分散开,保留一定的冗余度

RMI:

 RMI能让一个Java程序去调用网络中另一台计算机的Java对象的方法,那么调用的效果就像是在本机上调用一样。通俗的讲:A机器上面有一个class,通过远程调用,B机器调用这个class 中的方法。

一个重要的原理:定义接口和定义接口的具体实现是分开的

非常感谢丁杰师兄的日报:http://www.jnshu.com/daily/7829?uid=3933

网上都没有这么详细的

通过一个简单的例子就可以理解

新建一个继承remote的接口:

public interface IHello extends Remote{
public String helloWorld() throws RemoteException;
   public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}

完成接口的实现:

public class HelloImpl extends UnicastRemoteObject implements IHello {

public HelloImpl() throws RemoteException {
super();
   }

public String helloWorld() throws RemoteException {
return "Hello World";
   }

public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
return "你好,"+someBodyName+"!";
   }

}

 然后将实现类的的实例注册到RMI的注册表中:

public class HelloServer {

public static void main(String args[]) throws MalformedURLException{

try {
//创建一个远程对象
           IHello rhello = (IHello) new HelloImpl();
           //在本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),缺少注册表创建
           //则无法绑定对象到远程注册表上
           LocateRegistry.createRegistry(8888);
           Naming.bind("rmi://localhost:8888/RHello",rhello);
           System.out.println("HelloServer启动成功");
       }catch (RemoteException e){
System.out.println("创建远程对象发生异常");
           e.printStackTrace();
       }catch (AlreadyBoundException e){
System.out.println("发生重复绑定对象异常!");
           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) {

} catch (MalformedURLException e) {

} catch (RemoteException e) {
}
}
}




返回列表 返回列表
评论

    分享到