IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> RPC、RMI基本介绍 -> 正文阅读

[网络协议]RPC、RMI基本介绍

前言

分布式服务框架中,服务之间需要相互调用,就必须远程通讯。实现远程通讯的技术有很多,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;
          }
      
          @Override
          public 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);
          }
      
          @Override
          public 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框架的核心就是 通讯和序列化,将原来本地调用从内存中获取信息换为网络传输的方式。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:52:32  更:2022-09-13 11:54:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:50:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码