发表于: 2017-03-09 22:15:08
1 1407
今天完成的事情:了解分布式,了解了一下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) {
}
}
}
评论