06 | 如何实现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
《从 0 开始学微服务》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(34)
- 最新
- 精选
- lfn我觉得压缩只是序列化的一个原因,但却不是最本质的原因。序列化是为了解决内存中数据结构到字节序列的映射过程中,如何保留各个结构和字段间的关系而生的技术。
作者回复: 确实,理论上用字符串就也可以,序列化能映射的同时也能压缩数据
2018-09-0480 - Hungry老师,我觉得序列化最大的目的是解决异构系统的数据传输,比如大小端、远端的持久存储;至于不同语言的代码结构上的变量映射,TLV压缩,这些应该是其次的
作者回复: 嗯,在服务框架里序列号最主要的作用是数据编码
2018-09-096 - 衣申人原来不只是我觉得序列化不是为了压缩的,嘻嘻。我认为序列化和反序列化是解决内存数据到字节流的相互转换的。而压缩不压缩,其实不是必要的。当然序列化后的大小是评估一种序列化方式的优劣因素之一。
作者回复: 是啊,这里着重强调下压缩比来体现差异
2018-09-235 - 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-045 - 九斤鱼感觉这几篇还是在入门,实战什么时候开始呢?,老师,我更关心的实际操作层面,比如技术栈选型方面,是spring cloud呢还是dubbo还是其他什么, 系统划分后的工程如何管理,如何部署,如何测试,多容器环境下需要注意什么等等问题,望老师可以在接下来的课程里可以用实际项目解答一下🙏
作者回复: 可以看下专栏目录,在原理讲完之后开始讲实践
2018-09-064 - 靖远小和尚老师你好aio是异步阻塞是不是写错了!他应该是异步非阻塞吧!
作者回复: 写错了,已修改👍
2018-09-044 - 云学这篇文章感觉有些地方不太严谨,序列化是和异构系统有关
作者回复: 序列化跟异构系统没有直接关联,比如java序列化,主要是为了解决数据编解码的问题
2018-09-053 - 不忘初心NIO,AIO描述有问题。 NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。 AIO (Asynchronous I/O):异步非阻塞I/O模型。
作者回复: 抱歉,手误了,已修改👍
2018-09-042 - 海盗船长老师你好,感觉你讲的重点都是rpc,对于restful,还需要注册中心吗
作者回复: restful也可以用注册中心
2020-01-212 - 蚂蚁内推+v老师 nioq这块方便详细说下嘛
作者回复: nio这块比较复杂,可以看看netty并发编程这本书,讲得比较透彻
2018-12-122
收起评论