RPC 实战与核心原理
何小锋
京东云混合云首席架构师
41883 人已学习
新⼈⾸单¥59
课程目录
已完结/共 29 讲
RPC 实战与核心原理
登录|注册
留言
14
收藏
沉浸
阅读
分享
手机端
回顶部
付费课程,可试看

视频资源获取失败

开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
07 | 架构设计:设计一个灵活的RPC框架
08 | 服务发现:到底是要CP还是AP?
09 | 健康检测:这个节点都挂了,为啥还要疯狂发请求?
10 | 路由策略:怎么让请求按照设定的规则发到不同的节点上?
11 | 负载均衡:节点负载差距这么大,为什么收到的流量还一样?
12 | 异常重试:在约定时间内安全可靠地重试
13 | 优雅关闭:如何避免服务停机带来的业务损失?
14 | 优雅启动:如何避免流量打到没有启动完成的节点?
15 | 熔断限流:业务如何实现自我保护?
16 | 业务分组:如何隔离流量?
答疑课堂 | 基础篇与进阶篇思考题答案合集
17 | 异步RPC:压榨单机吞吐量
18 | 安全体系:如何建立可靠的安全体系?
19 | 分布式环境下如何快速定位问题?
20 | 详解时钟轮在RPC中的应用
21 | 流量回放:保障业务技术升级的神器
22 | 动态分组:超高效实现秒级扩缩容
23 | 如何在没有接口的情况下进行RPC调用?
24 | 如何在线上环境里兼容多种RPC协议?
结束语 | 学会从优秀项目的源代码中挖掘知识
加餐 | 谈谈我所经历过的RPC
加餐 | RPC框架代码实例详解
本节摘要

你好,我是何小锋。上一讲我们学习了 RPC 如何通过动态分组来实现秒级扩缩容,其关键点就是“动态”与“隔离”。今天我们来聊聊如何在没有接口的情况下进行 RPC 调用。

应用场景有哪些?

在 RPC 运营的过程中,让调用端在没有接口 API 的情况下发起 RPC 调用的需求,不只是一个业务方和我提过,这里我列举两个非常典型的场景例子。

场景一:我们要搭建一个统一的测试平台,可以让各个业务方在测试平台中通过输入接口、分组名、方法名以及参数值,在线测试自己发布的 RPC 服务。这时我们就有一个问题要解决,我们搭建统一的测试平台实际上是作为各个 RPC 服务的调用端,而在 RPC 框架的使用中,调用端是需要依赖服务提供方提供的接口 API 的,而统一测试平台不可能依赖所有服务提供方的接口 API。我们不能因为每有一个新的服务发布,就去修改平台的代码以及重新上线。这时我们就需要让调用端在没有服务提供方提供接口的情况下,仍然可以正常地发起 RPC 调用。

场景二:我们要搭建一个轻量级的服务网关,可以让各个业务方用 HTTP 的方式,通过服务网关调用其它服务。这时就有与场景一相同的问题,服务网关要作为所有 RPC 服务的调用端,是不能依赖所有服务提供方的接口 API 的,也需要调用端在没有服务提供方提供接口的情况下,仍然可以正常地发起 RPC 调用。

登录 后留言

全部留言(14)

  • 最新
  • 精选
Reason
能想到两种解决方法: 1. 通过泛化调用的接口名或者方法名,判断是否是泛化请求 2. 客户端发起调用时一定知道请求是泛化请求,因此可以在请求信息的附加字段中标识该请求为泛化请求

作者回复: 是的

2020-04-13
13
蚂蚁内推+v
没有接口API,调用者怎么使用插件完成序列化/反序列化呢,总得知道序列化反序列化的目标Class才能进行吧

作者回复: 对于consumer来说,返回得到的值肯定类似一个map

2020-04-14
3
Darren
方法名称需要特殊处理一下,参数不是很好,因为有的方法是没有参数的。

作者回复: 是一种方案

2020-04-13
2
小哇
老师好,我们这边是服务方也使用map做入参,然后在方法里再转成对象,就没有序列化问题,但感觉冗余。看到今天老师说的,意思是不是专属的序列化方式可以在调用方法前反序列为对象。这样做服务方的方法就可以使用对象入参而不用map做入参?

作者回复: map更多是扩展来用吧,否则强类型的语言就没有意义了

2020-04-14
1
Reason
有个问题请教下老师,希望可以得到解答: 文中说泛化调用用于统一测试平台时,可以不需要修改平台代码重新上线。不修改平台代码重新上线,怎么编写相应的泛化调用代码呢?

作者回复: 泛化调用的参数是动态的,不跟接口定义绑定

2020-04-13
3
1
雨霖铃声声慢
这个泛化调用好抽象,对于区分泛化调用和其他调用,一个是泛化调用的函数名和第一参数方法名,可以在这两个上做文章来分区泛化方法和其他方法

作者回复: 理解接口定义在rpc里面的作用后,理解起来就比较简单了

2020-04-13
1
Jxin
1.在原有的请求处理器里面加判断逻辑(不合理)。 2.单独为泛化请求添加请求处理器,在请求解析完,根据解析出来的数据决定走哪个处理器(泛化接口处理器,常规接口处理器)(合理)。 泛化请求不属于常规接口请求,它与常规请求应是平级的两种请求类型,故而认为应该将两种数据流分离,在编码层面就做好隔离,也为以后差异化迭代埋好扩展点。既增强语义准确性,也做前瞻性的需求预留。

作者回复: 分开处理后代码是不是有的复杂啊?

2020-04-14
2
🐠
对于Dubbo来说,根据org.apache.dubbo.config.AbstractReferenceConfig#generic 字段来标识该引用是否为泛化调用,所以根据该字段来使用对应的序列化插件就可以了,而且Dubbo对于POJO参数和返回值,统一都是用Map来接收的,可以看看官方文档https://dubbo.apache.org/zh/docs/v2.7/user/examples/generic-reference/
2021-06-20
6
王斌
泛化调用性能只有正常调用的十分之一,有什么优化的办法吗?
2024-07-22
ivan
消息协议中定义泛化标示
2022-12-11
收起评论