• RPC:Remote procedure call protocal,远程过程调用协议,一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源  (RPC协议其实是一个规范)。主流的RPC协议有:Dubbo、Thrif、RMI、Webservice、Hessain    (远程过程调用框架),网络协议和网络IO对于调用端和服务端来说是透明(动态代理)。

  • 参考:https://www.jianshu.com/p/5b90a4e70783
  • RMI:Remote Method Invocation ,远程方法调用,可以认为是RPC的java版本,使用的是JRMP(Java Remote Messageing Protocol), JRMP是专门为java定制的通信协议,所以它是纯java的分布式解决方案。
  • 实现一个RMI程序步骤:
    • 创建远程接口,并且继承java.rmi.Remote接口并抛出网络传输异常(throws RemoteException)。
 package com.karat.cn.rmi;

 import java.rmi.Remote;
import java.rmi.RemoteException; public interface ISayHello extends Remote{ public String sayHello(String name) throws RemoteException;
}
    • 创建一个实现类实现远程接口,并且继承:UnicastRemoteObject,实现类的构造方法抛出网络传输异常。
 package com.karat.cn.rmi;

 import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class SayHelloImpl extends UnicastRemoteObject implements ISayHello{ public SayHelloImpl() throws RemoteException {
} public String sayHello(String name) throws RemoteException {
return "Hello "+name;
}
}
    • 创建服务器程序(服务端):createRegistry方法注册远程对象。
 package com.karat.cn.rmi;

 import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; public class HelloServer { public static void main(String[] args) {
try {
ISayHello hello=new SayHelloImpl(); LocateRegistry.createRegistry(8888); Naming.bind("rmi://localhost:8888/sayHello",hello); System.out.println("server start success");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
    • 创建客户端程序(消费端)。
 package com.karat.cn.rmi;

 import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; public class HelloClient { public static void main(String[] args){
try {
ISayHello hello=(ISayHello) Naming.lookup("rmi://localhost:8888/sayHello");
System.out.println(hello);
System.out.println(hello.sayHello("hello, AAAA"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}

分布式通信框架RMI的更多相关文章

  1. 1.5分布式通讯框架-RMI

    分布式通信框架-RMI讲解 什么是RPC Remote procedure call protocal RPC协议其实是一个规范.常用PRC框架:Dubbo.Thrif.RMI.Webservice. ...

  2. Harries-高性能分布式Asp.net通信框架

    http://www.harries.cn/ 轻量级.免费.高并发的ASP.NET分布式通信框架 一.Harries简介: Harries Communication Framework 是一款基于C ...

  3. RPC通信框架——RCF介绍

    现有的软件中用了大量的COM接口,导致无法跨平台,当然由于与Windows结合的太紧密,还有很多无法跨平台的地方.那么为了实现跨平台,支持Linux系统,以及后续的分布式,首要任务是去除COM接口. ...

  4. RPC通信框架——RCF介绍(替换COM)

    阅读目录 RPC通信框架 为什么选择RCF 简单的性能测试 参考资料 总结 现有的软件中用了大量的COM接口,导致无法跨平台,当然由于与Windows结合的太紧密,还有很多无法跨平台的地方.那么为了实 ...

  5. RPC通信框架——RCF介绍

    现有的软件中用了大量的COM接口,导致无法跨平台,当然由于与Windows结合的太紧密,还有很多无法跨平台的地方.那么为了实现跨平台,支持Linux系统,以及后续的分布式,首要任务是去除COM接口. ...

  6. [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架

    [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 目录 [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 0x00 摘要 0x01 架构图 ...

  7. 美团分布式服务通信框架及服务治理系统OCTO

     一.什么是OCTO 定义: OCTO是美团的分布式服务通信框架及服务治理系统,属于公司级基础设施,目前尚未开源. 目标: 为公司所有业务提供统一的服务通信框架,使业务具备良好的服务运营能力,轻松实现 ...

  8. 分布式系列五: RMI通信

    RPC(Remote Procedure Call)协议 RPC协议是一种通过网络从远程计算机上请求服务, 而不需要了解底层网络技术的协议, 在OSI模型中处在应用层和网络层. 作为一个规范, 使用R ...

  9. 【Java】分布式RPC通信框架Apache Thrift 使用总结

    简介 Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于th ...

随机推荐

  1. 第三章 Java内存模型(下)

    锁的内存语义 中所周知,锁可以让临界区互斥执行.这里将介绍锁的另一个同样重要但常常被忽视的功能:锁的内存语义 锁的释放-获取建立的happens-before关系 锁是Java并发编程中最重要的同步机 ...

  2. chosen.jquery插件的使用

    前几天在jQuery官网看到了插件里面有400多个插件,看了下效果都很好,以后项目里面难免会用到.于是下了个决定,有时间把官网的插件都研究下,并简单介绍他的用法,方便以后的使用. 下面将要提到的是jQ ...

  3. git 删除本地分支和远程分支

    (1)使用命令git branch -a 查看所有分支 其中,remote/origin/master表示的是远程分支 (2)删除远程分支 使用命令 git push origin --delete ...

  4. unity3d 5.6参考手册

    http://www.vfkjsd.cn/unity3d/Manual/index.html http://www.vfkjsd.cn/unity/unity3d.html

  5. gearman 并发的执行多个任务

    Examples: Multi-Query In this example we know that we need to fetch several result sets from a datab ...

  6. 报错:空指针java.lang.NullPointerException 原因 Action层 private UserService userservice 上未加@Autowire注解

    java.lang.NullPointerException at com.itheima.test.Test2.fun1(Test2.java:18) at sun.reflect.NativeMe ...

  7. SPOJ KATHTHI - KATHTHI

    以前并不知道这个trick. $01BFS$,在$bfs$的时候用一个双端队列来维护,如果边权为$1$就添加到队尾,边权为$0$就添加到队首. 还有一个小trick就是我们可以开一个$dis$数组来代 ...

  8. Luogu 4103 [HEOI2014]大工程

    BZOJ 3611 明明在BZOJ上是$6s$的时限,怎么到Luogu上就变成$4s$了…… 按照套路建出虚树,点之间的距离可以变成边权表示在虚树上,然后考虑如何树形$dp$. 最大值和最小值应当比较 ...

  9. Python程序设计1——基础知识

    1 Python脚本设计简介 1.1 输出"Hello World" 和一般的语言一样,运行python程序有两种方式,一种是GUI交互式命令,一种是通过脚本文件,前者适合小型简单 ...

  10. html 连接数据库

    http://blog.csdn.net/haxker/article/details/4214001 http://www.cnblogs.com/chuncn/archive/2010/11/22 ...