• 什么是RPC?


    1. 基本的RPC模型

    主要介绍RPC是什么,基本的RPC代码,RPC与REST的区别,gRPC的使用

    1.1 基本概念

    • RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务
    • 本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指针来指定。
    • 远程过程调用:上述操作的过程中,如果addAge()这个方法在服务端,执行函数的函数体在远程机器上,如何告诉机器需要调用这个方法呢?
    1. 首先客户端需要告诉服务器,需要调用的函数,这里函数和进程ID存在一个映射,客户端远程调用时,需要查一下函数,找到对应的ID,然后执行函数的代码。
    2. 客户端需要把本地参数传给远程函数,本地调用的过程中,直接压栈即可,但是在远程调用过程中不再同一个内存里,无法直接传递函数的参数,因此需要客户端把参数转换成字节流,传给服务端,然后服务端将字节流转换成自身能读取的格式,是一个序列化和反序列化的过程。
      3.数据准备好了之后,如何进行传输?网络传输层需要把调用的ID和序列化后的参数传给服务端,然后把计算好的结果序列化传给客户端,因此TCP层即可完成上述过程,gRPC中采用的是HTTP2协议。
      总结一下上述过程:
     
    // Client端 
    //    Student student = Call(ServerAddr, addAge, student)
    1. 将这个调用映射为Call ID。
    2. 将Call ID,student(params)序列化,以二进制形式打包
    3. 把2中得到的数据包发送给ServerAddr,这需要使用网络传输层
    4. 等待服务器返回结果
    5. 如果服务器调用成功,那么就将结果反序列化,并赋给student,年龄更新
    
    // Server端
    1. 在本地维护一个Call ID到函数指针的映射call_id_map,可以用Map<String, Method> callIdMap
    2. 等待服务端请求
    3. 得到一个请求后,将其数据包反序列化,得到Call ID
    4. 通过在callIdMap中查找,得到相应的函数指针
    5. 将student(params)反序列化后,在本地调用addAge()函数,得到结果
    6. 将student结果序列化后通过网络返回给Client
     
    • 在微服务的设计中,一个服务A如果访问另一个Module下的服务B,可以采用HTTP REST传输数据,并在两个服务之间进行序列化和反序列化操作,服务B把执行结果返回过来。


       
       
    • 由于HTTP在应用层中完成,整个通信的代价较高,远程过程调用中直接基于TCP进行远程调用,数据传输在传输层TCP层完成,更适合对效率要求比较高的场景,RPC主要依赖于客户端和服务端之间建立Socket链接进行,底层实现比REST更复杂。

    1.2 rpc demo

     
    系统类图
     
    系统调用过程


    链接:https://www.jianshu.com/p/7d6853140e13

  • 相关阅读:
    #define #undef
    ps
    Find–atime –ctime –mtime的用法与区别总结
    redis
    linux mutex
    private继承
    boost::noncopyable介绍
    Makefile 中:= ?= += =的区别
    linux Tar 命令参数详解
    Ubuntu14.04安装CMake3.0.2
  • 原文地址:https://www.cnblogs.com/aaaazzzz/p/13229770.html
Copyright © 2020-2023  润新知