RPC 实战与核心原理
何小锋
京东云混合云首席架构师
40244 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
RPC 实战与核心原理
15
15
1.0x
00:00/00:00
登录|注册

23 | 如何在没有接口的情况下进行RPC调用?

插件体系
问题2:入参对象与返回值类型
问题1:序列化与反序列化
$asyncInvoke方法
$invoke方法
解决问题
GenericService接口
泛化调用
场景二
场景一
课后思考
总结
怎么做?
应用场景有哪些?
如何在没有接口的情况下进行RPC调用

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

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

应用场景有哪些?

在 RPC 运营的过程中,让调用端在没有接口 API 的情况下发起 RPC 调用的需求,不只是一个业务方和我提过,这里我列举两个非常典型的场景例子。
场景一:我们要搭建一个统一的测试平台,可以让各个业务方在测试平台中通过输入接口、分组名、方法名以及参数值,在线测试自己发布的 RPC 服务。这时我们就有一个问题要解决,我们搭建统一的测试平台实际上是作为各个 RPC 服务的调用端,而在 RPC 框架的使用中,调用端是需要依赖服务提供方提供的接口 API 的,而统一测试平台不可能依赖所有服务提供方的接口 API。我们不能因为每有一个新的服务发布,就去修改平台的代码以及重新上线。这时我们就需要让调用端在没有服务提供方提供接口的情况下,仍然可以正常地发起 RPC 调用。
示意图
场景二:我们要搭建一个轻量级的服务网关,可以让各个业务方用 HTTP 的方式,通过服务网关调用其它服务。这时就有与场景一相同的问题,服务网关要作为所有 RPC 服务的调用端,是不能依赖所有服务提供方的接口 API 的,也需要调用端在没有服务提供方提供接口的情况下,仍然可以正常地发起 RPC 调用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

如何在没有接口的情况下进行RPC调用?本文介绍了在RPC运营中,调用端在没有接口API的情况下发起RPC调用的需求,并提出了两个典型的场景例子。作者介绍了通过泛化调用来实现在没有接口的情况下进行RPC调用的功能。泛化调用的实现原理是RPC框架提供统一的泛化调用接口(GenericService),调用端在创建GenericService代理时指定真正需要调用的接口的接口名以及分组名,通过调用GenericService代理的$invoke方法将服务端所需要的所有信息封装成请求消息,发送给服务端,实现在没有接口的情况下进行RPC调用的功能。此外,还介绍了如何解决泛化调用中的序列化与反序列化问题,以及如何判定请求消息是通过泛化调用的方式发送过来的消息。通过泛化调用功能,可以解决在没有服务提供方提供接口API的情况下进行RPC调用的问题。文章内容深入浅出,为读者提供了清晰的技术解决方案,对于需要了解RPC调用的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《RPC 实战与核心原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

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

    作者回复: 是的

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

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

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

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

    2020-04-13
  • 🐠
    对于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
    5
  • ivan
    消息协议中定义泛化标示
    2022-12-11归属地:广东
  • 海风极客
    grpc的unknownservice是不是个这个差不多呢?
    2022-10-31归属地:北京
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部