泛化调用 :在没有接口的情况下进行RPC调用

什么是泛化调用?

在RPC调用的过程中,调用端向服务端发起请求,首先要通过动态代理,动态代理可以屏蔽RPC处理流程,使得发起远程调用就像调用本地一样。

RPC调用本质:调用端向服务端发送一条请求消息,服务端接收并处理,之后向调用端发送一条响应消息,调用端处理完响应消息之后,一次RPC调用就完成了。

只要调用端将服务端需要知道的信息,如接口名、业务分组名、方法名以及参数信息等封装成请求消息发送给服务端,服务端就能够解析并处理这条请求消息,问题就解决了。

定义一个统一的接口(GenericService),调用端在创建GenericService代理时指定真正需要调用的接口的接口名以及分组名,而GenericService接口的$invoke方法的入参就是方法名以及参数信息。

传递给服务端所需要的所有信息,包括接口名、业务分组名、方法名以及参数信息等都可以通过调用GenericService代理的$invoke方法来传递。

RPC框架可以通过异步的方式提升吞吐量,给GenericService接口再添加一个异步方法$asyncInvoke,方法的返回值就是CompletableFuture:

java 复制代码
class GenericService {

  Object $invoke(String methodName, String[] paramTypes, Object[] params);

  CompletableFuture<Object> $asyncInvoke(String methodName, String[] paramTypes, Object[] params);

}

通过统一的GenericService接口类生成的动态代理,来实现在没有接口的情况下进行RPC调用的功能,就称之为泛化调用

调用端入参与返回值类型?

在服务提供方提供的接口API中,被调用的方法的入参类型是一个对象,那么使用泛化调用功能的调用端使用Map类型的对象,之后通过泛化调用专属的序列化方式对这个Map对象进行序列化,服务端收到消息后,再通过泛化调用专属的序列化方式将其反序列成对象。

实现原理

RPC框架提供统一的泛化调用接口(GenericService),调用端在创建GenericService代理时指定真正需要调用的接口的接口名以及分组名,通过调用GenericService代理的$invoke方法将服务端所需要的所有信息,包括接口名、业务分组名、方法名以及参数信息等封装成请求消息,发送给服务端,实现在没有接口的情况下进行RPC调用的功能。

为泛化调用提供专属的序列化插件,解决泛化调用中的序列化与反序列化问题。

相关推荐
像素之间3 小时前
HTTP之content-disposition
网络·网络协议·http
2501_915909064 小时前
tcpdump 抓包数据分析实战,命令、过滤、常见故障定位与真机补充流程
网络·测试工具·ios·小程序·uni-app·iphone·tcpdump
路由侠内网穿透5 小时前
本地部署开源持续集成和持续部署系统 Woodpecker CI 并实现外部访问
服务器·网络·windows·ci/cd·开源
光储圈6 小时前
光伏安全协议-安全责任协议书8篇
网络·安全
时空潮汐7 小时前
神卓 N600:内网穿透需求的高效安全之选
网络·安全·群晖nas·神卓n600
爱倒腾的老唐7 小时前
24、Linux 路由管理
linux·运维·网络
程序员Aries7 小时前
自定义网络协议与序列化/反序列化
linux·网络·c++·网络协议·程序人生
FIavor.9 小时前
我发送给Apifox是http://localhost:9002/goods/getByUserName?name=张三 为什么会是500哪里错了?
java·服务器·网络协议·http
IT大灰狼9 小时前
拌合站软件开发(27)监测各项IP设备可访问性
网络·网络协议·tcp/ip
FIavor.10 小时前
怎么办这是Apifox里执行http://localhost:9002/goods/getByUserName?name=“张三“为什么我改了还是500?
java·网络·网络协议·http