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

什么是泛化调用?

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

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

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

image-20241130201404154

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

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

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

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调用的功能。【动态代理】

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

泛化调用两种方式

RPC框架实现泛化调用功能主要有两种方式:基于Java Bean规范的泛化调用和基于序列化中间体的泛化调用。

基于Java Bean规范的泛化调用

优点:与序列化无关,因此具有较好的通用性。
缺点:实现较为复杂,RPC框架需要处理JavaBeanDescriptor向POJO的转换功能。如dubbo支持该种类型的泛化调用,在使用泛化调用时,直接传递JavaBeanDescriptor对象作为参数。
在这里插入图片描述

基于序列化中间体的泛化调用

优点:RPC框架实现相对简单,如果序列化框架原生支持或者仅需少量改造即可实现泛化调用。
缺点:与特定的序列化框架耦合,如sofa-rpc使用的sofa-hessian序列化框架,它在hessian序列化框架基础上进行二次开发,抽象出了序列化中间体如GenericObject、GenericMap、GenericArray等。
在这里插入图片描述

泛化调用在网关、测试平台等领域应用广泛,具体选择哪种泛化调用实现方式,还需要结合实际情况做出选择。

参考文档

Dubbo泛化调用,看这篇就够了!
RPC框架泛化调用原理及转转的实践

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 之弦上舞:string 类与多样字符串操作的优雅旋律

string 类的重要性及与 C 语言字符串对比 在 C 语言中&#xff0c;字符串是以 \0 结尾的字符集合&#xff0c;操作字符串需借助 C 标准库的 str 系列函数&#xff0c;但这些函数与字符串分离&#xff0c;不符合 OOP 思想&#xff0c;且底层空间管理易出错。而在 C 中&#xff0…

【大数据学习 | Spark调优篇】Spark之内存调优

1. 内存的花费 1&#xff09;每个Java对象&#xff0c;都有一个对象头&#xff0c;会占用16个字节&#xff0c;主要是包括了一些对象的元信息&#xff0c;比如指向它的类的指针。如果一个对象本身很小&#xff0c;比如就包括了一个int类型的field&#xff0c;那么它的对象头实…

使用OpenCV和卡尔曼滤波器进行实时活体检测

引言 在现代计算机视觉应用中&#xff0c;实时检测和跟踪物体是一项重要的任务。本文将详细介绍如何使用OpenCV库和卡尔曼滤波器来实现一个实时的活体检测系统。该系统能够通过摄像头捕捉视频流&#xff0c;并使用YOLOv3模型来检测目标对象&#xff08;例如人&#xff09;&…

【closerAI ComfyUI】物体转移术之图案转移,Flux三重控制万物一致性生图,实现LOGO和图案的精准迁移

更多AI前沿科技资讯,请关注我们:closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 closerAIGCcloserAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性! 【closerAI ComfyUI】物体转移术之图…

2025软考高级《系统架构设计师》案例模拟题合集

首先分享一下系统架构设计师资料合集&#xff0c;有历年真题、自学打卡表、精华知识点等&#xff0c;需要的留邮&#xff0c;打包分享&#xff01; 1、在设计基于混合云的安全生产管理系统中&#xff0c;需要重点考虑5个方面的安全问题。设备安全、网络安全、控制安全、应用安全…

rpm包转deb包或deb包转rpm包

Debian系&#xff08;Ubuntu、Deepin、麒麟Destop等&#xff09;用的安装包是deb的&#xff0c;Red Hat系&#xff08;CentOS、欧拉、麒麟Server等&#xff09;用的安装包是rpm的。 如果需要在Ubuntu上安装rpm&#xff0c;或需要在CentOS上安装deb&#xff0c;需要安装alien s…

【C语言】递归的内存占用过程

递归 递归是函数调用自身的一种编程技术。在C语言中&#xff0c;递归的实现会占用内存栈&#xff08;Call Stack&#xff09;&#xff0c;每次递归调用都会在栈上分配一个新的 “栈帧&#xff08;Stack Frame&#xff09;”&#xff0c;用于存储本次调用的函数局部变量、返回地…

数据仓库的概念

先用大白话讲一下&#xff0c;数据仓库的主要目的就是存储和分析大量结构化数据的。 > 那么它的核心目的是&#xff1a;支持商业智能&#xff08;BI&#xff09;和决策支持系统&#xff0c;也就是说&#xff0c;它不仅仅是为了存储&#xff0c;更重要的是为了分析提供便利。…

LeetCode 438.找到字符串中所有字母异位词

LeetCode 438.找到字符串中所有字母异位词 思路&#x1f9d0;&#xff1a; 需要找到子串异位词&#xff0c;也就是只看该子串是否有相同字母而不管位置是否相同。分析题目发现只需要单调向前找异位词&#xff0c;则可以使用滑动窗口求解&#xff0c;注意这里每当左右边框长度大…

算法刷题Day8:BM30 二叉搜索树与双向链表

题目 牛客网题目传送门 思路 对二叉搜索树进行中序遍历&#xff0c;结果就是按序数组。因此想办法把前面遍历过的节点给记下来&#xff0c;记作pre。当遍历到某个节点node的时候&#xff0c;令前驱指向pre&#xff0c;然后让pre的后驱指向node。 代码 class TreeNode:def…

1.Git安装与常用命令

前言 Git中会用到的一些基本的Linux命令 ls/ll 查看文件目录 (ll可以看隐藏文件)cat 查看文件内容touch 创建文件vi vi编辑器 1.下载与安装 安装成功后鼠标右键会出现Git Bash和Git GUI Git GUI&#xff1a;GUI图形化界面 Git Bash&#xff1a;Git提供的命令行工具 当安装…

ultralytics-YOLOv11的目标检测解析

1. Python的调用 from ultralytics import YOLO import os def detect_predict():model YOLO(../weights/yolo11n.pt)print(model)results model(../ultralytics/assets/bus.jpg)if not os.path.exists(results[0].save_dir):os.makedirs(results[0].save_dir)for result in…

【docker】docker compose多容器部署

Docker Compose 的详细讲解与实际应用 什么是 Docker Compose&#xff1f; Docker Compose 是一个工具&#xff0c;用于定义和运行多容器 Docker 应用。 通过一个 docker-compose.yml 文件&#xff0c;可以同时启动多个服务&#xff0c;简化多容器管理。 Docker Compose 的核心…

【AI系统】CANN 算子类型

CANN 算子类型 算子是编程和数学中的重要概念&#xff0c;它们是用于执行特定操作的符号或函数&#xff0c;以便处理输入值并生成输出值。本文将会介绍 CANN 算子类型及其在 AI 编程和神经网络中的应用&#xff0c;以及华为 CANN 算子在 AI CPU 的详细架构和开发要求。 算子基…

C++:特殊类设计及类型转换

目录 一.常见特殊类的设计方式 1.请设计一个类&#xff0c;不能被拷贝 2.请设计一个类&#xff0c;只能在堆上创建对象 3.请设计一个类&#xff0c;只能在栈上创建对象 4.请设计一个类&#xff0c;不能被继承 5.请设计一个类&#xff0c;只能创建一个对象(单例模式) 二.C…

GPT打字机效果—— fetchEventSouce进行sse流式请求

EventStream基本用法 与 WebSocket 不同的是&#xff0c;服务器发送事件是单向的。数据消息只能从服务端到发送到客户端&#xff08;如用户的浏览器&#xff09;。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。 const evtSource new EventSource(“/api/v1/…

《嵌入式硬件设计》

一、引言 嵌入式系统在现代科技中占据着至关重要的地位&#xff0c;广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础&#xff0c;直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面&#xff…

FreeSWITCH mod_conference 的按键会控

又是一篇命题作文 mod_conference 官方文档&#xff1a; https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_conference_3965534/ 英文不好的可以看中文&#xff1a; http://www.freeswitch.org.cn/books/references/1.7-mod_conference.html…

Linux67 绑定网卡【bonding和team】

Linux 网卡绑定在RHEL 7 之前&#xff0c;网卡绑定常用的是bonding模块&#xff0c;在RHEL7开始&#xff0c;支持使用team作网卡绑定&#xff0c;但在RHEL7中&#xff0c;bonding依然可用。以下主要介绍bonding模块配置双网卡绑定。Linux网卡绑定模式介绍模式简介0 for balance…

服务器与普通电脑有什么区别?

服务器和普通电脑&#xff08;通常指的是个人计算机&#xff0c;即PC&#xff09;有众多相似之处&#xff0c;主要构成包含&#xff1a;CPU&#xff0c;内存&#xff0c;芯片&#xff0c;I/O总线设备&#xff0c;电源&#xff0c;机箱及操作系统软件等&#xff0c;鉴于使用要求…