前言

分布式服务框架中,服务之间需要相互调用,就必须远程通讯。实现远程通讯的技术有很多,RMI就是其中的一种。


一、 什么是RPC

  • 定义

    RPC全称为remote procedure call,即远程过程调用。借助RPC可以做到像本地调用一样调用远程服 务,是一种进程间的通信方式 。RPC并不是一个具体的技术,而是指整个网络远程调 用过程。

  • 本地调用 和 RPC调用 区别

  • RPC过程时序图

一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。

  1. 客户端(Client),服务的调用方。

  2. 客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后 通过网络远程发送给服务方。

  3. 服务端(Server),真正的服务提供者。

  4. 服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法。

    1. 客户端(client)以本地调用方式(即以接口的方式)调用服务;
    2. 客户端存根(client stub)接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体 (将消息体对象序列化为二进制);
    3. 客户端通过socket将消息发送到服务端;
    4. 服务端存根( server stub)收到消息后进行解码(将消息对象反序列化);
    5. 服务端存根( server stub)根据解码结果调用本地的服务;
    6. 服务处理
    7. 本地服务执行并将结果返回给服务端存根( server stub);
    8. 服务端存根( server stub)将返回结果打包成消息(将结果消息对象序列化);
    9. 服务端(server)通过socket将消息发送到客户端;
    10. 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息发序列化);
    11. 客户端(client)得到最终结果。

    RPC的目标是要把2、3、4、5、7、8、9、10这些步骤都封装起来。只剩下1、6、11

二、 RMI简介

  • 定义

    Java RMI,即远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPCRemote procedure call)的Java API, 能直接传输序列化后的Java对象。它的实现依赖于Java虚拟机,因 此它仅支持从一个JVM到另一个JVM的调用。

  • 传输流程

  1. 客户端从远程服务器的注册表中查询并获取远程对象引用。
  2. 桩对象与远程对象具有相同的接口和方法列表,当客户端调用远程对象时,实际上是由相应的桩 对象代理完成的。
  3. 远程引用层在将桩的本地引用转换为服务器上对象的远程引用后,再将调用传递给传输层 (Transport),由传输层通过TCP协议发送调用;
  4. 在服务器端,传输层监听入站连接,它一旦接收到客户端远程调用后,就将这个引用转发给其上层的远程引用层;
  5. 服务器端的远程引用层将客户端发送的远程应用转换为本地虚拟机的引用 后,再将请求传递给骨架(Skeleton);
  6. 读取参数,又将请求传递给服务器,最后由服务 器进行实际的方法调用。
  7. 如果远程方法调用后有返回值,则服务器将这些结果又沿着“骨架->远程引用层->传输层”向下传 递;
  8. 客户端的传输层接收到返回值后,又沿着“传输层->远程引用层->桩”向上传递,然后由桩来反序 列化这些返回值,并将最终的结果传递给客户端程序。

三、 基本使用

  • 开启服务端

    • User

      public class User implements Serializable {private String name;private int id;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", id=" + id +'}';}
      }
      
    • IUserService:

      public interface IUserService extends Remote {User getByUserId(int id) throws RemoteException;
      }
      
    • UserServiceImpl:

      public class UserServiceImpl extends UnicastRemoteObject implements IUserService {Map<Object, User> userMap = new HashMap<>();public UserServiceImpl() throws RemoteException {super();User user1 = new User();user1.setId(1);user1.setName("张三");userMap.put(user1.getId(), user1);}@Overridepublic User getByUserId(int id) throws RemoteException {return userMap.get(id);}
      }
      
    • RMIServer:

      public class RMIServer {public static void main(String[] args) {try {//1、注册Registry实例,绑定端口Registry registry = LocateRegistry.createRegistry(9988);//2、创建远程对象IUserService userService = new UserServiceImpl();//3、将远程对象注册到RMI服务器上registry.rebind("userService", userService);System.out.println("RMI服务端启动成功");}catch (RemoteException e){e.printStackTrace();}}
      }
  • 创建另一个工程,开启客户端,客户端需要有和服务端同样的接口和实体类,包括路径也要一样

    • client:

      public class RMIClient {public static void main(String[] args) throws RemoteException, NotBoundException {//1、获取Registry实例Registry registry = LocateRegistry.getRegistry("127.0.0.1", 9988);//2、通过Registry实例查找远程对象IUserService userService = (IUserService) registry.lookup("userService");User user = userService.getByUserId(1);System.out.println(user);}
      }
      

总结

远程RPC框架的核心就是 通讯和序列化,将原来本地调用从内存中获取信息换为网络传输的方式。

RPC、RMI基本介绍相关推荐

  1. 远程过程调用RPC RMI(Remote Method Invocation)和Web Service

    2019独角兽企业重金招聘Python工程师标准>>> 一.RPC是什么 RPC的全称是Remote Procedure call,是进程间通信方式. 他允许程序调用另一个地址空间的 ...

  2. Hessian RMI功能介绍

    Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协 ...

  3. 【RMI】RMI详情介绍与使用!!!

    RMI简介 ​ Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)(Remote procedure call)的Java AP ...

  4. (一) Nepxion-Thunder分布式RPC集成框架 - 介绍

    Nepxion-Thunder(QQ 群 471164539)发布在https://github.com/Nepxion/ 1. 概要 1.1 Thunder是基于Netty + Hessian + ...

  5. RPC远程过程调用之 RMI实现

    1)RMI(remote method invocation)是java原生支持的远程调用,RMI采用JRMP(java RemoteMessageing Protocol)作为通信协议.可以认为是纯 ...

  6. 阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别

    什么是RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC使 ...

  7. NoSQL 简单介绍

    1.为什么要用NoSql? 今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据.用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加 ...

  8. 分布式RPC框架Dubbo详解

    目录 1.架构演进 1.1 单体架构 1.2  垂直架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 2.RPC框架 2.1 RPC基本概念介绍 2.1.1 RPC协议 2.1.2 R ...

  9. RPC与Netty简介

    RPC 一.Socket介绍 Socket概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装 ...

最新文章

  1. 粒子追踪 matlab,用粒子滤波器实现的多目标跟踪代码
  2. HTTP状态码-HTTP Status Code
  3. 腾讯offer是什么样子_记一次腾讯社招前端面试(已拿到offer入职)
  4. TWebBrowser的基本应用
  5. [centos][ntp][administrator] chrony ntp
  6. U启动安装原版Win7系统教程
  7. Spring Boot(十三)RabbitMQ安装与集成
  8. 绕过AppLocker系列之MSBuild的利用
  9. Java中常见流的分类及简单讲解
  10. android color属性黑色,android – 未找到样式属性attr / colorSecondary
  11. 机器学习(三)——支持向量机SVM
  12. decodeURI decodeURIComponent
  13. 海康网络摄像头web端展示
  14. 伯克利CS61A-Sum2019-Week1
  15. 如何用 nginx 做 postfix 的 SMTP 反向代理,以及 XCLIENT 的支持
  16. 【web开发】js实现表单提交
  17. 『Python基础练习题』day04
  18. Luogu P1850换教室【期望dp】By cellur925
  19. XML解析为Document对象
  20. [模块加载失败:找不到指定的模块]——如何解决DLL加载问题?

热门文章

  1. 湖南省计算机二级考试 程序题填空题 百钱百鸡,09年计算机二级辅导:C++百钱百鸡问题的解决方法...
  2. 局域网服务器和联通协议,联通局域网怎么设置
  3. 我国工程项目的前期管理(转)
  4. 自行车测速器怎么调_自行车测速方法
  5. Laravel-admin安装
  6. 网络协议 P2p 学习 - Shareaza
  7. 常用的贷后4大类指标介绍
  8. 杭州阿拉丁信息科技有限公司
  9. 《Kotin 极简教程》第7章 面向对象编程(OOP)(1)
  10. Pycharm安装模块