1. 场景问题

在 RPC 运营的过程中,让调用端在没有接口 API 的情况下建议 RPC 调用的需求,不只是

一个事务方和我提过,这里我列举两个十分典型的场景比如。

场景一: 咱们要搭建一个一致的测验渠道,能够让各个事务方在测验渠道中经过输入接口、

分组名、办法名以及参数值,在线测验自己发布的 RPC 服务。这时咱们就有一个问题要解

决,咱们搭建一致的测验渠道实践上是作为各个 RPC 服务的调用端,而在 RPC 结构的使

用中,调用端是需求依靠服务供给方供给的接口 API 的,而一致测验渠道不或许依靠一切

服务供给方的接口 API。咱们不能由于每有一个新的服务发布,就去修改渠道的代码以及重

新上线。这时咱们就需求让调用端在没有服务供给方供给接口的情况下,依然能够正常地发

起 RPC 调用。

RPC的接口泛化
场景二: 咱们要搭建一个轻量级的服务网关,能够让各个事务方用 HTTP 的方法,经过服 务网关调用其它服务。这时就有与场景一相同的问题,服务网关要作为一切 RPC 服务的调 用端,是不能依靠一切服务供给方的接口 API 的,也需求调用端在没有服务供给方供给接 口的情况下,依然能够正常地建议 RPC 调用。

RPC的接口泛化
这两个场景都是咱们经常会碰到的,而让调用端在没有服务供给方供给接口 API 的情况下 依然能够建议 RPC 调用的功用,在 RPC 结构中也是十分有价值的。

2. 解决方案

运用 RPC 的接口泛化需求遵循以下几个过程:

  1. 定义通用接口:

首先,在 RPC 结构中定义一个通用的泛化接口,该接口一般包括一个通用的办法,如invokecall。这个办法接纳一组参数,如服务名、办法名、参数类型和参数值,然后依据这些参数动态调用长途服务。

示例接口定义(Java):

public interface GenericService { Object invoke(String serviceName, String methodName, Class<?>[] parameterTypes, Object[] parameterValues); }
  1. 实现泛化接口:

实现泛化接口时,需求处理长途调用的详细逻辑。这包括序列化恳求参数、发送恳求到长途服务、接纳呼应以及反序列化呼应成果。在实践应用中,这些逻辑一般由 RPC 结构主动处理。

示例实现(Java):

public class GenericServiceImpl implements GenericService {
     @Override public Object invoke(String serviceName, String methodName, Class<?>[] parameterTypes, Object[] parameterValues) {
     // 处理长途调用逻辑,如序列化恳求参数、发送恳求、接纳呼应等。 ... 
}
  1. 客户端运用泛化接口:

客户端经过泛化接口调用长途服务。这意味着客户端不再依靠详细的服务接口,而是直接运用GenericService接口。依据实践需求,客户端能够动态地构建服务名、办法名和参数值,并将它们传递给泛化接口的invoke办法。

示例客户端调用(Java):

GenericService genericService = new GenericServiceImpl();
String serviceName = "com.example.MyService";
String methodName = "myMethod";
Class<?>[] parameterTypes = new Class<?>[] {String.class, Integer.class};
Object[] parameterValues = new Object[] {"Hello", 42};
Object result = genericService.invoke(serviceName, methodName, parameterTypes, parameterValues);
  1. 服务端支撑泛化接口:

服务端需求支撑泛化接口的调用。这一般意味着 RPC 结构需求能够依据恳求中的服务名和办法名找到相应的服务实例,并运用 Java 反射或其他技能履行办法调用。在实践应用中,这些逻辑一般由 RPC 结构主动处理。

这样,经过接口泛化,客户端能够以一种通用、抽象的方法调用长途服务,而无需依靠详细的服务接口。

3. 总结

RPC 接口泛化(Generic Interface)是一种设计形式,它答应客户端经过一种通用的、抽象的方法调用长途服务,而不是依靠于预先定义好的、详细的服务接口。接口泛化主要解决以下几个问题:

  1. 解耦客户端与服务端:泛化接口答应客户端在不了解服务端详细实现的情况下调用长途服务。这降低了客户端与服务端之间的耦合度,使得它们能够独立地开展和演进。
  2. 动态调用:在某些场景下,客户端或许需求在运行时动态地调用不同的长途服务。这种情况下,接口泛化供给了一种灵活的方法,答应客户端依据需求选择调用哪个长途服务。
  3. 便利集成与测验:泛化接口能够简化集成测验和体系测验,由于测验人员能够经过通用接口直接调用长途服务,而无需为每个服务创建独立的客户端。
  4. 跨语言调用:在微服务架构中,不同的服务或许用不同的编程语言实现。接口泛化能够使得不同语言的客户端都能调用同一个长途服务,提高了体系的互操作性。
  5. 习惯性强:随着事务需求的变化,服务接口或许会发生变化。泛化接口能够使客户端更好地习惯这些变化,而不需求频繁地更新客户端代码。

尽管 RPC 接口泛化具有这些长处,但它也有一些缺陷。例如,由于客户端不再依靠详细的服务接口,因而或许会损失某些类型安全性和编译时查看。此外,泛化接口或许会增加体系的复杂性,由于需求在运行时处理更多的动态调用逻辑。

因而,在实践应用中,需求依据详细的事务场景和需求权衡是否运用 RPC 接口泛化。