趣谈网络协议
刘超
前网易研究院云计算技术部首席架构师
130417 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
趣谈网络协议
15
15
1.0x
00:00/00:00
登录|注册

第32讲 | RPC协议综述:远在天边,近在眼前

Portmapper
性能优化
丢包处理
重传机制
错误处理
数据表示
参数传递
语法规定
ONC RPC的问题
触发RPC层的过程
Network File System
RPC实现
状态机
传输管理层
Stub程序
XDR
标准模式
服务发现问题
传输问题
协议约定问题
思考题
NFS
ONC RPC
远程调用

该思维导图由 AI 生成,仅供参考

前面我们讲了容器网络如何实现跨主机互通,以及微服务之间的相互调用。
网络是打通了,那服务之间的互相调用,该怎么实现呢?你可能说,咱不是学过 Socket 吗。服务之间分调用方和被调用方,我们就建立一个 TCP 或者 UDP 的连接,不就可以通信了?
你仔细想一下,这事儿没这么简单。我们就拿最简单的场景,客户端调用一个加法函数,将两个整数加起来,返回它们的和。
如果放在本地调用,那是简单的不能再简单了,只要稍微学过一种编程语言,三下五除二就搞定了。但是一旦变成了远程调用,门槛一下子就上去了。
首先你要会 Socket 编程,至少先要把咱们这门网络协议课学一下,然后再看 N 本砖头厚的 Socket 程序设计的书,学会咱们学过的几种 Socket 程序设计的模型。这就使得本来大学毕业就能干的一项工作,变成了一件五年工作经验都不一定干好的工作,而且,搞定了 Socket 程序设计,才是万里长征的第一步。后面还有很多问题呢!

如何解决这五个问题?

问题一:如何规定远程调用的语法?

客户端如何告诉服务端,我是一个加法,而另一个是乘法。我是用字符串“add”传给你,还是传给你一个整数,比如 1 表示加法,2 表示乘法?服务端该如何告诉客户端,我的这个加法,目前只能加整数,不能加小数,不能加字符串;而另一个加法“add1”,它能实现小数和整数的混合加法。那返回值是什么?正确的时候返回什么,错误的时候又返回什么?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RPC协议是一种实现跨主机服务调用的重要技术,本文深入探讨了在远程调用中面临的挑战和解决方案。文章首先介绍了远程调用中的协议约定问题,包括语法规定、参数传递和数据表示,以及服务端实现和端口访问等方面的讨论。接着,文章详细探讨了传输问题,包括错误处理、重传、丢包和性能问题的解决方案。此外,文章还介绍了服务发现问题,即如何找到RPC服务端的随机端口。通过对这些问题的深入分析,读者能够快速了解RPC协议的复杂性和技术特点。 在技术层面上,文章提到了大牛Bruce Jay Nelson的论文和早期ONC RPC框架,以及NFS的实现,这些都为解决远程调用中的各种问题提供了示范性实现。此外,文章还提出了两个思考题,引发读者对远程调用技术的深入思考。 总之,本文通过深入浅出的方式解释了远程调用中的技术挑战和解决方案,为读者提供了全面的视角。对于想要深入了解远程调用技术的读者来说,这篇文章是一份极具价值的资料。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈网络协议》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(40)

  • 最新
  • 精选
  • 吴军旗^_^
    越往后人的留言越少, 看来成为大牛的路上会越来越孤单

    作者回复: 坚持到最后,你就是大牛

    2019-07-10
    2
    24
  • 忆水寒
    刘老师,我们目前的分布式系统采用以下方式。我们实现了一种中间件,每个进程(客户端)要与其他进程通信,就要到中间件注册(注册了自己进程的一个ID,任务名称,还有一个消息队列),然后将消息用google的protobuf封装进行传输(因为这种序列化的效率高)。在其他进程中接收到消息,会解析消息id,然后根据定义好的格式去取内容。这样也算RPC调用吧?

    作者回复: 是的

    2018-07-30
    5
  • 小谢同学
    作为一名不会coding的从业者,想问刘老师几个基础问题,首先是文中提到的onc rpc框架,就是包含了stub(编解码)+传输(类库)+服务发现的一套东西?那么目前主流的rpc框架,比如dubbo也是实现了这些功能的集大成者?另外一个问题就是,thrift 和protobuf 我理解只是实现了rpc编解码环节的工作,也就是所说的序列化与反序列化,对么?

    作者回复: 是的,rpc的几个时代,就是这样演进过来的

    2018-07-31
    2
    4
  • Geek_37984c
    老师GABAGE_ARGS 是写错了吗 GARBAGE_ARGS?

    作者回复: 是的

    2019-08-24
    1
  • java_zhao
    想问一下 我们平时的程序不都是指定端口的吗 为什么还会随机端口 用portmapper呢?

    作者回复: portmapper作为一个服务发现中心,不同端口的都可以注册到他这里,例如有个8081,再有个8082,都行。

    2019-07-10
    1
  • zKerry
    哦...原来是有示范性标准的啊

    作者回复: 是的

    2019-09-08
  • N_H
    老师,您好,文章里面,“RPC程序是用户自己写的,会监听在一个随机端口上”。我们公司用的grpc服务,都会自己指明一个端口号

    作者回复: 当然可以指定。我这里的RPC还比较老。

    2019-08-07
  • Geek_Huahui
    刘老师,能讲解一下现在用的比较多的JSON-RPC吗

    作者回复: restful会讲的

    2019-06-19
  • 迭代升级
    看了这个大端小端有一些疑惑,百度百科https://m.baidu.com/sf_bk/item/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/6750542?fr=aladdin&ms=1&rid=8203658230675846926 上说:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。 而文章上说:最低位放在最后一个位置,叫做小端 最低位放在第一个位置,叫做大端 感觉有点矛盾呀,是我的理解出错了吗?

    作者回复: 不矛盾呀,不是一个意思吗

    2019-06-12
    3
  • zj
    插问一下,http协议中有类似XID这样的标识别唯一请求id吗

    作者回复: header里面可以自己加

    2019-06-03
收起评论
显示
设置
留言
40
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部