从 0 开始学微服务
胡忠想
微博技术专家
64643 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 43 讲
开篇词 (1讲)
结束语 (1讲)
从 0 开始学微服务
15
15
1.0x
00:00/00:00
登录|注册

06 | 如何实现RPC远程服务调用?

二进制类序列化(PB/Thrift)
文本类序列化(XML/JSON)
私有协议(如Dubbo协议)
HTTP协议
异步非阻塞方式(AIO)
同步非阻塞方式 (NIO)
同步阻塞方式(BIO)
Socket通信
HTTP通信
数据该如何序列化和反序列化?
数据传输采用什么协议?
服务端如何处理请求?
客户端和服务端如何建立网络连接?
gRPC调用的实现原理
序列化和反序列化
通信协议
通信框架
思考题
服务调用需要解决的问题
如何实现RPC远程服务调用?

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

专栏上一期我讲过,要完成一次服务调用,首先要解决的问题是服务消费者如何得到服务提供者的地址,其中注册中心扮演了关键角色,服务提供者把自己的地址登记到注册中心,服务消费者就可以查询注册中心得到服务提供者的地址,可以说注册中心犹如海上的一座灯塔,为服务消费者指引了前行的方向。
有了服务提供者的地址后,服务消费者就可以向这个地址发起请求了,但这时候也产生了一个新的问题。你知道,在单体应用时,一次服务调用发生在同一台机器上的同一个进程内部,也就是说调用发生在本机内部,因此也被叫作本地方法调用。在进行服务化拆分之后,服务提供者和服务消费者运行在两台不同物理机上的不同进程内,它们之间的调用相比于本地方法调用,可称之为远程方法调用,简称 RPC(Remote Procedure Call),那么RPC 调用是如何实现的呢?
在介绍 RPC 调用的原理之前,先来想象一下一次电话通话的过程。首先,呼叫者 A 通过查询号码簿找到被呼叫者 B 的电话号码,然后拨打 B 的电话。B 接到来电提示时,如果方便接听的话就会接听;如果不方便接听的话,A 就得一直等待。当等待超过一段时间后,电话会因超时被挂断,这个时候 A 需要再次拨打电话,一直等到 B 空闲的时候,才能接听。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了RPC远程服务调用的实现原理和关键技术,为读者提供了全面的指导。首先,文章指出了完成一次RPC调用需要解决的四个问题:建立网络连接、处理请求、数据传输协议和数据序列化与反序列化。接着,详细介绍了建立网络连接的两种常用途径:HTTP通信和Socket通信,以及处理请求的三种方式:同步阻塞方式(BIO)、同步非阻塞方式(NIO)和异步非阻塞方式(AIO)。此外,还讨论了数据传输采用的协议,包括HTTP协议和私有协议,并强调了协议契约的重要性。最后,建议使用成熟的开源方案如Netty、MINA等来实现通信框架,以确保稳定可靠。文章通过实际案例和经验分享,深入浅出地介绍了RPC远程服务调用的实现原理和关键技术,对于想要了解和实践RPC调用的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学微服务》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(34)

  • 最新
  • 精选
  • lfn
    我觉得压缩只是序列化的一个原因,但却不是最本质的原因。序列化是为了解决内存中数据结构到字节序列的映射过程中,如何保留各个结构和字段间的关系而生的技术。

    作者回复: 确实,理论上用字符串就也可以,序列化能映射的同时也能压缩数据

    2018-09-04
    80
  • Hungry
    老师,我觉得序列化最大的目的是解决异构系统的数据传输,比如大小端、远端的持久存储;至于不同语言的代码结构上的变量映射,TLV压缩,这些应该是其次的

    作者回复: 嗯,在服务框架里序列号最主要的作用是数据编码

    2018-09-09
    6
  • 衣申人
    原来不只是我觉得序列化不是为了压缩的,嘻嘻。我认为序列化和反序列化是解决内存数据到字节流的相互转换的。而压缩不压缩,其实不是必要的。当然序列化后的大小是评估一种序列化方式的优劣因素之一。

    作者回复: 是啊,这里着重强调下压缩比来体现差异

    2018-09-23
    5
  • asdf100
    (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。 (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构。 (4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。 上面提到的“同步非阻塞“方式怎么不一样?

    作者回复: IO多路复用属于同步非阻塞的

    2018-09-04
    5
  • 九斤鱼
    感觉这几篇还是在入门,实战什么时候开始呢?,老师,我更关心的实际操作层面,比如技术栈选型方面,是spring cloud呢还是dubbo还是其他什么, 系统划分后的工程如何管理,如何部署,如何测试,多容器环境下需要注意什么等等问题,望老师可以在接下来的课程里可以用实际项目解答一下🙏

    作者回复: 可以看下专栏目录,在原理讲完之后开始讲实践

    2018-09-06
    4
  • 靖远小和尚
    老师你好aio是异步阻塞是不是写错了!他应该是异步非阻塞吧!

    作者回复: 写错了,已修改👍

    2018-09-04
    4
  • 云学
    这篇文章感觉有些地方不太严谨,序列化是和异构系统有关

    作者回复: 序列化跟异构系统没有直接关联,比如java序列化,主要是为了解决数据编解码的问题

    2018-09-05
    3
  • 不忘初心
    NIO,AIO描述有问题。 NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。 AIO (Asynchronous I/O):异步非阻塞I/O模型。

    作者回复: 抱歉,手误了,已修改👍

    2018-09-04
    2
  • 海盗船长
    老师你好,感觉你讲的重点都是rpc,对于restful,还需要注册中心吗

    作者回复: restful也可以用注册中心

    2020-01-21
    2
  • 蚂蚁内推+v
    老师 nioq这块方便详细说下嘛

    作者回复: nio这块比较复杂,可以看看netty并发编程这本书,讲得比较透彻

    2018-12-12
    2
收起评论
显示
设置
留言
34
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部