文章部分描述来自参考资料

RPC

什么是RPC

    RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

    RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。现在业界有很多开源的优秀 RPC 框架,例如 Spring Cloud、Dubbo、Thrift 等。

RPC 工作原理

Client像调用本地服务似的调用远程服务;

  1. Client stub接收到调用后,将方法、参数序列化

  2. 客户端通过sockets将消息发送到服务端

  3. Server stub 收到消息后进行解码(将消息对象反序列化)

  4. Server stub 根据解码结果调用本地的服务

本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stub

  1. Server stub将返回结果打包成消息(将结果消息对象序列化)

  2. 服务端通过sockets将消息发送到客户端

  3. Client stub接收到结果消息,并进行解码(将结果消息反序列化)

客户端得到最终结果。

RPC 调用分以下两种:

同步调用:客户方等待调用执行完成并返回结果。

异步调用:客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。

异步和同步的区分在于是否等待服务端执行完成并返回结果。

实现一个RPC框架需要考虑的问题

  • 应该如何部署服务框架到客户端

    • 服务框架自身部署的问题
    • 实现自己的框架所依赖的jar包与应用自身依赖包jar包的冲突问题
  • 各个服务提供者消费时间差异的问题,使用负载均衡 (A1消费得快 ,A2消费得慢)

  • 多机房问题

  • client 端的流控处理

  • 网络通信实现的选择(BIO AIO NIO)

  • 支持多种异步服务调用方式(Future , Callback )

参考资料

  • http://dubbo.apache.org/zh-cn/blog/rpc-introduction.html

RPC 学习(一)认识的更多相关文章

  1. RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

    本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...

  2. 【公司要求】- RPC学习(一)

    HADOOP-IPC(这里说的是1.0.4版本) 是轻量级RPC,在hadoop中主要用于2方面 1.TaskTracker和JobTracker 通讯. 2.NameNode和DataNode通讯. ...

  3. [RPC学习]Dubbo+nacos实现动态更新内存RTree

    1.背景 服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HT ...

  4. RPC学习----Thrift快速入门和Java简单示例

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

  5. RPC学习

    之前有一篇文章,说了RPC的内容: http://www.cnblogs.com/charlesblc/p/6214391.html 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对 ...

  6. Hyberledger-Fabric 1.00 RPC学习(2)尝试建立一个network

    本文参考:http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html 这里我们学习建立第一个Hyperledger Fa ...

  7. Hyberledger-Fabric 1.00 RPC学习(1)

    参考:http://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.html 本文的目的就是基于Hyperledger Fabr ...

  8. go语言rpc学习

    rpc 就是  远程过程调用    指的是调用远端服务器上的程序的方法整个过程. rpc 理论 RPC技术在架构设计上有四部分组成,分别是:客户端.客户端存根.服务端.服务端存根. 客户端:服务调用发 ...

  9. Storm drpc学习

    示例代码: package com.lky.test; import org.apache.commons.logging.Log; import org.apache.commons.logging ...

随机推荐

  1. npm ERR! Cannot read property 'match' of undefined

    在Vue项目中运行npm i命令时直接提示npm ERR! Cannot read property 'match' of undefined错误了,此时需要把package-lock.json文件删 ...

  2. 0008 基于DRF框架开发(01 DRF开发的基本流程)

    1 创建模型 由于之前在<004 工程配置>中,已在Applications/Organizations/models中创建了一个UserInfo模型.此处引用这个模型. from dja ...

  3. BugkuCTF flag.php(反序列化)

    进去后是个登录页面,但是login根本不会跳转,看源码也没提示,但是这道题给了一个提示:hint,那么盲猜应该是一个get参数,因为post不能跳转,那么get总有内容吧,跟上hint参数,随便赋一个 ...

  4. Parity game POJ - 1733 带权并查集

    #include<iostream> #include<algorithm> #include<cstdio> using namespace std; <& ...

  5. 让bat文件自动以管理员身份运行

    · 让bat文件自动以管理员身份运行 如何让bat文件自动以管理员身份运行,将这段写在bat文件的前头即可 : %1 mshta vbscript:CreateObject("Shell.A ...

  6. linux100讲——12 创建和删除目录

    1.建立目录 mkdir    建立目录 常用参数 -p   建立多级目录 2.删除目录 rmdir  删除空目录 rm -r      删除非空目录  (删除时有提示) rm -r -f     删 ...

  7. 线段树(lazy标记)-- 模板

    ], lazy[MAXN << ]; void PushUp(int rt) { ans[rt] = ans[rt << ] + ans[rt << | ]; } ...

  8. Apache Tomcat配置启动

    文章目录 前提 配置启动Tomcat 遇到的问题 端口被占用 解决方案 淇℃伅 特别感谢 前提 已经安装Java JDK 已经配置将Java JDK的bin目录添加至环境变量Path 已经配置JAVA ...

  9. POJ-3984-迷宫问题(bfs+记录路径)

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  10. java类及实例初始化顺序

    1.静态变量.静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只在类加载时,初始化一次) 2.非静态变量.非静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只要 ...