# 《API网关》第2章:代理RPC泛化调用

作者:小傅哥
博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!😄

  • 本章难度:★★★☆☆
  • 本章重点:给网关接口绑定对应的RPC服务,建立代理关系封装RPC泛化调用。这样调用网关接口就会调用到对应的RPC服务接口上并返回对应的数据。
  • 课程视频https://t.zsxq.com/05NbuJaYZ (opens new window)

# 一、学习指引

你不能总是硬编码解决所有问题!

对于中间件框架的实现,往往都离不开代理的操作,因为需要使用代理用逻辑封装行为。例如你原本是通过硬编码调用一个接口,那么现在因为所有的行为都被提炼到中间件中控制,那么对于接口的调用就不在一个而是一堆。而对于这样一堆接口的调用,它们是有共性的,比如可以统一使用Java反射获取到方法名、入参、出参等等信息,再根据这些信息做代理逻辑包装,让每一个接口的调用都被中间件处理。

那么我们本章要实现的就是把来自网关的HTTP请求,转换到RPC调用上,这里就涉及到了RPC所提供的泛化调用,按照对应的泛化调用的逻辑,提供对应的接口和方法以及入参信息就可以拿到最终的结果。文档:https://dubbo.apache.org/zh/docs/advanced/generic-reference/ (opens new window)

# 二、绑定设计

这里需要思考🤔,为了把 HTTP 与 RPC 建立连接,就像你把 DAO 与 SQL 执行建立连接一样,两个服务的中间需要被绑定。也就是把 HTTP 地址中的接口方法与 RPC 对应的服务建立起一种关联关系,这样才能满足在调用 HTTP 网关接口时,调用到对应的 RPC 服务上。

  • 就像如图所示 HTTP 经过网关调用到 RPC 中间的执行逻辑就是把两个模块用绑定的方式建立起连接,生成一个代理对象。代理对象中包装的就是执行网关接口泛化调用的参数准备和执行以及返回结果的操作。
  • 这里的第一个知识点是泛化调用,它是 RPC 接口设计中提供的一种反射调用机制,你不需要硬编码调用接口,只需要提供接口的方法名称、入参信息,即可调用到对应的 RPC 接口服务。可以参考官网文档:https://dubbo.apache.org/zh/docs/advanced/generic-reference/ (opens new window)
  • 这里的第二个知识点是代理包装,虽然 RPC 框架提供了泛化调用,也就是说这里可以拿到网络协议转换的 HTTP 请求信息以后,就能直接调用到 RPC 接口。但这样的操作方式不太方便使用,存在硬编码的风险,后续不好迭代升级,也不好扩展其他的接口。因为每一个 RPC 的实现,泛化调用的方法名称还是有所不同的,另外是扩展非 RPC 框架的逻辑,也不方便处理。所以这里需要单独提供一个代理包装逻辑。
  • 这里的第三个知识点是Cglib,因为有第二个知识点中代理操作的存在,我们就需要选择一种方式来做代理处理,而Cglib 可以满足我们自定义创建接口的方式进行代理,同时又可以在让一个代理类有多个接口。注意:多个接口的意思是,一个接口是用于标准的描述,在于使用上。另外一个接口是自主生成的,生成的是我们的 RPC 描述性接口,相当于自主生成了class字节码。这部分我会在视频中再加以介绍