解释RPC远程调用的来龙去脉

Posted 小明菜市场

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解释RPC远程调用的来龙去脉相关的知识,希望对你有一定的参考价值。

本地过程调用

这里先解释本地过程调用 假设本地类有一个方法。其方法为add,这里演示一下本地过程调用。

 
   
   
 
  1. package com.company;


  2. public class Main {


  3. public static void main(String[] args) {

  4. // write your code here

  5. System.out.println(add(2,4));

  6. }


  7. public static int add(int a, int b){

  8. return a + b;

  9. }

  10. }

在上面这个方法中,本地调用了其add方法,这里属于本地过程调用。其中第五行,就是本地调用其方法add。

远程过程调用

对于远程过程调用。其有以下几个方法,

原理解释

Client端

  1. 将这个调用映射为Call ID。这里假设用最简单的字符串当Call ID的方法

  2. 将Call ID,lvalue和rvalue序列化。可以直接将它们的值以二进制形式打包

  3. 把2中得到的数据包发送给ServerAddr,这需要使用网络传输层

  4. 等待服务器返回结果

  5. 如果服务器调用成功,那么就将结果反序列化,并赋给ltimesr

Server端

  1. 在本地维护一个Call ID到函数指针的映射callidmap,可以用std::map >

  2. 等待请求

  3. 得到一个请求后,将其数据包反序列化,得到Call ID

  4. 通过在callidmap中查找,得到相应的函数指针

  5. 将lvalue和rvalue反序列化后,在本地调用Multiply函数,得到结果

  6. 将结果序列化后通过网络返回给Client

如下

1)提供了一个api包,用于标出provider提供的所有接口名称;2)提供一个provider(生产者)包,用于实现所有的接口,并可以注册到zookeeper上,统一管理;3)提供一个consumer(消费者)包,用于调用接口,为了便于管理,消费者开启时,也需要注册上zookeeper上,具体注册方式如下:

注册到zookeeper上的配置

注册到zookeeper上的配置 1)生产者:主要包括接口实现类、启动方法类、配置文件。下面是包结构:

解释RPC远程调用的来龙去脉          

配置文件中主要包括dubbo的注册中心、端口号、以及定义实现的接口描述。

解释RPC远程调用的来龙去脉          

启动类中,需要读取配置文件信息,然后启动:

解释RPC远程调用的来龙去脉          

2)消费者:主要包括启动类、配置文件。

包结构如下:

解释RPC远程调用的来龙去脉          

配置文件内容除了跟生产者一样的以外,若是调用远程接口,可以通过dubbo:reference进行引入,前提是被应用的接口类已被引入(具体操作后面再论);

         

启动类中可通过getBean方式,注入接口类,然后调用其方法:

先启动生产者,然后启动消费者,消费者输出如下:

         

可以看到前两条是应用的本地接口实现方法,后一条则是调用的远程接口实现。


以上是关于解释RPC远程调用的来龙去脉的主要内容,如果未能解决你的问题,请参考以下文章

女票的大杀器 —— RPC(远程过程调用)

从 0 到 1:全面理解 RPC 远程调用!

从0到1:使用 Python 详解 RPC 远程调用

我眼中的 RPC

什么是RPC以及RPC的简单实现

rpc与动态代理模型