Dubbo的RPC泛化调用

目录

一、RPC泛化调用的应用场景

二、Dubbo RPC泛化调用的实现原理

三、Dubbo RPC泛化调用的实现步骤

四、示例代码

五、泛化调用怎么发现提供该接口的服务及服务的IP和端口?


Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下,对服务方进行调用并获取结果的技术。主要用于实现一个通用的远程服务Mock框架,通过实现GenericService接口来处理所有服务请求。以下是对Dubbo RPC泛化调用的详细解释:

一、RPC泛化调用的应用场景

  1. 网关服务:在搭建网关服务时,网关需要作为所有RPC服务的调用端。由于网关本身不应依赖于服务提供方的接口API(否则每个新的服务发布都需要修改网关代码并重新部署),因此需要泛化调用支持。
  2. 测试平台:在搭建可以测试RPC调用的平台时,用户可以通过输入分组名、接口、方法名等信息来测试对应的RPC服务。此时,泛化调用可以方便地实现对不同服务的测试。

二、Dubbo RPC泛化调用的实现原理

泛化调用本质是在filter过滤链上执行的序列化和反序列化操作。

  1. 消费者端:通过GenericImplFilter类,在调用的invocation对象中设置generic为true,表示这是一个泛化调用。
  2. 生产者端:通过GenericFilter类,当发现invocation对象中的generic为true时,会进行反序列化参数,并根据方法名和参数类型调用相应的服务实现。

三、Dubbo RPC泛化调用的实现步骤

  1. 配置pom.xml:引入Dubbo依赖和注册中心依赖(如Zookeeper)。
  2. 配置application.yml:在服务提供者的application.yml中配置Dubbo相关信息,如应用名称、注册中心地址、协议名称和端口等。
  3. 定义服务接口:在服务接口中定义需要调用的方法。这些方法可以是原生数据类型参数、DTO对象参数或DTO对象集合参数等。
  4. 实现服务接口:在服务提供者的实现类中实现这些方法。这些方法的具体实现将作为远程服务被调用。
  5. 配置泛化调用:在服务消费者的代码中,通过ReferenceConfig配置泛化调用。设置application、interface、generic和url等属性。其中,interface属性设置为服务接口的全限定名,generic属性设置为true表示启用泛化调用。
  6. 调用远程服务:通过GenericService的invoke方法调用远程服务。invoke方法接受方法名、参数类型和参数值等作为输入,并返回调用结果。

四、示例代码

以下是一个简单的Dubbo RPC泛化调用的示例代码:

服务提供者代码
1、首先,我们定义服务提供者的HelloService接口和实现类:public interface HelloService {String sayHello(String name);
}public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello, " + name + "!";}
}2、然后,在服务提供者的配置文件中注册这个服务(这里以XML配置为例):<dubbo:application name="hello-service-provider" />
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.example.HelloService" ref="helloService" />
<bean id="helloService" class="com.example.HelloServiceImpl" />3、yaml配置:
dubbo:application:name: dev-dubbo-serverversion: 1.0.0registry:address: zookeeper://127.0.0.1:2181 # N/A - 无zookeeper可配置 N/A 走直连模式测试protocol:name: dubboport: 20881scan:base-packages: cn.dev.dubbo.api4、客户端泛化调用代码
在客户端,我们不需要知道HelloService接口的具体定义,而是可以通过GenericService接口进行泛化调用。以下是一个客户端泛化调用的例子:import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.rpc.service.GenericService;public class DubboGenericClient {public static void main(String[] args) {// 配置应用信息ApplicationConfig application = new ApplicationConfig();application.setName("hello-service-consumer");// 配置注册中心信息RegistryConfig registry = new RegistryConfig();registry.setAddress("zookeeper://127.0.0.1:2181");// 配置泛化引用ReferenceConfig<GenericService> reference = new ReferenceConfig<>();reference.setApplication(application);reference.setRegistry(registry);reference.setInterface("com.example.HelloService");reference.setGeneric(true); // 声明为泛化接口// 获取泛化服务实例GenericService genericService = reference.get();// 准备调用参数String methodName = "sayHello";String[] parameterTypes = new String[]{"java.lang.String"};Object[] arguments = new Object[]{"World"};// 执行泛化调用Object result = genericService.$invoke(methodName, parameterTypes, arguments);// 输出调用结果System.out.println(result); // 输出: Hello, World!}
}说明
配置应用信息和注册中心信息:在客户端,我们需要配置应用名称和注册中心的地址,以便Dubbo能够找到服务提供者。
配置泛化引用:通过ReferenceConfig配置泛化引用,设置接口名称并声明为泛化接口(setGeneric(true))。
获取泛化服务实例:调用reference.get()获取GenericService实例。
准备调用参数:指定要调用的方法名称、参数类型数组和参数值数组。
执行泛化调用:通过GenericService的$invoke方法执行泛化调用,并获取调用结果。

五、泛化调用怎么发现提供该接口的服务及服务的IP和端口?

在Dubbo的泛化调用中,服务消费者发现提供特定接口的服务及其IP和端口的过程主要依赖于Dubbo的服务注册与发现机制。以下是该过程的详细解释:

  1. 服务提供者注册服务

    • 当服务提供者启动时,它会根据配置文件中的信息(如应用名称、服务接口、版本、协议、端口等)实例化服务,并将其注册到指定的注册中心(如ZooKeeper)。
    • 注册中心会存储服务提供者的元数据,包括服务接口、应用名称、版本、IP地址、端口号以及调用方式等。
  2. 服务消费者订阅服务

    • 服务消费者在启动时,会根据配置文件中的信息(如应用名称、注册中心地址等)连接到注册中心。
    • 消费者会向注册中心订阅它感兴趣的服务接口和版本,注册中心会返回当前可用的服务提供者列表及其元数据。
  3. 服务发现与调用

    • 当服务消费者需要调用某个服务时,它会通过注册中心获取当前可用的服务提供者列表。
    • 消费者会根据负载均衡策略(如随机、轮询、一致性哈希等)选择一个服务提供者进行调用。
    • 在调用过程中,消费者会使用Dubbo提供的通信协议(如Dubbo协议、REST协议等)与服务提供者进行通信。
    • 具体的IP地址和端口号是由注册中心提供的,消费者不需要手动配置。
  4. 泛化调用的特殊性

    • 在泛化调用中,消费者不需要提前知道服务的具体实现类,只需要知道服务接口和调用的方法名、参数类型及返回值类型。
    • Dubbo提供了GenericService接口来支持泛化调用,消费者可以通过该接口进行动态的服务调用。
    • 在进行泛化调用时,消费者仍然需要依赖注册中心来发现服务提供者,并根据注册中心提供的元数据来进行调用。

综上所述,Dubbo的泛化调用中服务消费者发现提供特定接口的服务及其IP和端口的过程主要依赖于Dubbo的服务注册与发现机制以及注册中心提供的元数据。消费者不需要手动配置服务提供者的IP地址和端口号,而是通过注册中心动态获取这些信息。

参考:

从零开始手写 dubbo rpc 框架-12-generic-泛化调用_genericservice.$invoke-CSDN博客

dubbo 泛型调用示例 (dubbo generic call) - walle搬砖 - 博客园

dubbo接口泛化调用例子 - zhaojiatao - 博客园

dubbo实现rpc调用 dubbo rpc调用示例_mob64ca14144dde的技术博客_51CTO博客

什么是泛化调用?怎么实现Dubbo的泛化调用?代码怎么写?如果有疑问,请进!!-CSDN博客

dubbo的RPC调用方式 dubbo rpc调用流程_mob6454cc6575fa的技术博客_51CTO博客

一看就会!Dubbo 泛化调用简明教程——含不同类型入参处理_dubbo泛化调用-CSDN博客

DUBBO接口获取请求ip dubbo接口调用原理_mob64ca14193248的技术博客_51CTO博客

dubbo服务暴露及服务调用流程 dubbo如何发现服务_mob64ca13f937ae的技术博客_51CTO博客

java dubbo接口获取调用来源ip_mob64ca12f6aae1的技术博客_51CTO博客

Dubbo 3中的接口级地址发现与应用级地址发现:概念与实践-百度开发者中心

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

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

相关文章

使用uni-app进行开发前准备

使用uni-app进行开发&#xff0c;需要遵循一定的步骤和流程。以下是一个详细的指南&#xff0c;帮助你开始使用uni-app进行开发&#xff1a; 一、开发环境搭建 安装Node.js&#xff1a; 首先&#xff0c;从Node.js的官方网站&#xff08;https://nodejs.org/&#xff09;下载并…

ssh的隧道连接(端口映射)

SSH 隧道&#xff08;SSH tunneling&#xff09;的命令&#xff1a;用于将本地计算机的端口与远程服务器上的端口进行映射 命令&#xff1a; ssh -L 本地端口:localhost:服务器端口 -p 22 用户名服务器ip ssh: 表示使用 SSH 协议连接远程服务器。 -L 8501:localhost:8501: 这部…

AI需求条目化全面升级!支持多格式需求,打破模板限制!

AI需求条目化全面升级&#xff01;支持多格式需求&#xff0c;打破模板限制&#xff01; 一、多格兼济 标准立成 1、功能揭秘 预览未来 平台需求板块的AI需求条目化功能迎来全面升级。它支持多种需求格式&#xff0c;不再受限于模板文件&#xff0c;能够一键自动快速且灵活地生…

SSM相关面试题01

目录 1.何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗? 2.Spring IOC 如何理解? 3.Spring DI 如何理解? 4.Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制? 5.Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放…

【c++篇】:解读Set和Map的封装原理--编程中的数据结构优化秘籍

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.set和map的初步封装1.树的节点封装修改2.Find()查找函数3.红…

机器学习实战:泰坦尼克号乘客生存率预测(数据处理+特征工程+建模预测)

项目描述 任务&#xff1a;根据训练集数据中的数据预测泰坦尼克号上哪些乘客能生存下来 数据源&#xff1a;csv文件&#xff08;train.csv&#xff09; 目标变量&#xff1a;Survived&#xff08;0-1变量&#xff09; 数据集预览&#xff1a; 1、英文描述&#xff1a; 2、…

Linux自动化部署方法(Linux Automated Deployment Method)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

C++软件设计模式之组合模式与其他模式的协作举例

组合模式&#xff08;Composite Pattern&#xff09;、装饰器模式&#xff08;Decorator Pattern&#xff09;、享元模式&#xff08;Flyweight Pattern&#xff09;、迭代器模式&#xff08;Iterator Pattern&#xff09;和访问者模式&#xff08;Visitor Pattern&#xff09;…

2686694 - 操作方法:MSEG - DBSQL_REDIRECT_INCONSISTENCY

2686694 - 操作方法&#xff1a;MSEG - DBSQL_REDIRECT_INCONSISTENCY SAP Note, Version: 4, 审批日期: 24.04.2023 显示更改 组件MM-IM-GF对象状态 优先级建议/附加信息对象状态 类别咨询对象状态 审批状态已发布至客户对象状态 更正0对象状态 手动活动0对象状态已成…

嵌入式 FPGA开发

目录 一、引言 二、当前嵌入式 FPGA 开发的现状 三、嵌入式 FPGA 开发的优势 四、嵌入式 FPGA 的应用领域 1. 通信系统 2. 数字信号处理 3. 视频图像处理 4. 高速接口设计 5. 人工智能 6. IC 设计与 PCB 设计类比 五、嵌入式 FPGA 未来发展趋势 六、结论 一、引言 …

工业AI质检 AI质检智能系统 尤劲恩(上海)信息科技有限公司

来的现代化工厂&#xff0c;将逐步被无人化车间取代&#xff0c;无人工厂除了产线自动化&#xff0c;其无人质检将是绕不开的话题。尤劲恩致力于帮助工业制造领域上下游工厂减员增效、提高品质效率&#xff0c;真正实现无人质检IQC/IPQC/OQC的在线质检系统。分析生产环节真实品…

Angular v19 (三):增量水合特性详解 - 什么是水合过程?有哪些应用场景?与 Qwik 相比谁更胜一筹?- 哪个技术好我就学哪个,这就是吸心大法吧

Angular在其最新版本 v19 中引入了增量水合&#xff08;Incremental Hydration&#xff09;这一特性。这一更新引发了开发者们广泛的讨论&#xff0c;特别是在优化首屏加载速度和改善用户体验方面。本文将详解水合过程的概念、增量水合的应用场景&#xff0c;以及它与类似框架如…

[STM32]从零开始的STM32 FreeRTOS移植教程

一、前言 如果能看到这个教程的话&#xff0c;说明大家已经学习嵌入式有一段时间了。还记得嵌入式在大多数时候指的是什么吗&#xff1f;是的&#xff0c;我们所说的学习嵌入式大部分时候都是在学习嵌入式操作系统。从简单的一些任务状态机再到复杂一些的RTOS&#xff0c;再到最…

Vivado程序固化到Flash

在上板调试FPGA时&#xff0c;通常使用JTAG接口下载程序到FPGA芯片中&#xff0c;FPGA本身是基于RAM工艺的器件&#xff0c;因此掉电后会丢失芯片内的程序&#xff0c;需要重新烧写程序。但是当程序需要投入使用时不能每一次都使用JTAG接口下载程序&#xff0c;一般FPGA的外围会…

医疗废物检测

3809总图像数 数据集分割 训练组80&#xff05; 3030图片 有效集20&#xff05; 779图片 测试集&#xff05; 0图片 标签 预处理 自动定向&#xff1a; 已应用 调整大小&#xff1a; 拉伸至 640x640 增强 未应用任何增强。 注射器 手术刀 输液管 医用手套 医用口罩 血渍 数据集…

如何进行JOIN优化

如何进行JOIN优化 简单来说&#xff0c;JOIN是MySQL用来进行联表操作的&#xff0c;用来匹配两个表的数据&#xff0c;筛选并合并符合我们要求的结果集&#xff0c;但使用了Join我们一般会对它多一点关注&#xff0c;在java开发手册中&#xff0c;禁止三个表以上关联使用Join&…

uniapp使用扩展组件uni-data-select出现的问题汇总

前言 不知道大家有没有学习过我的这门课程那&#xff0c;《uniCloud云开发Vue3版本官方推荐用法》&#xff0c;这么课程已经得到了官方推荐&#xff0c;想要快速上手unicloud的小伙伴们&#xff0c;可以学习一下这么课程哦&#xff0c;不要忘了给一键三连呀。 在录制这门课程…

Spring 自调用事务失效分析及解决办法

前言 博主在写公司需求的时候&#xff0c;有一个操作涉及到多次对数据库数据的修改。当时就想着要加 Transactional注解来声名事务。并且由于一个方法中有太多行了&#xff0c;于是就想着修改数据库的操作单独提取出来抽象成一个方法。但这个时候&#xff0c;IDEA 提示我自调用…

黑马2024AI+JavaWeb开发入门Day03-Maven-单元测试飞书作业

视频地址&#xff1a;哔哩哔哩 讲义作业飞书地址&#xff1a;飞书 作业比较简单&#xff0c;随便写了写 package org.example;import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.ju…

常见的数据结构---数组、链表、栈的深入剖析

目录 一、数组&#xff08;Array&#xff09; 二、链表&#xff08;Linked List&#xff09; 三、栈&#xff08;Stack&#xff09; 四、总结 数据结构是算法的基石&#xff0c;是程序设计的核心基础。不同的数据结构适用于不同的场景和需求&#xff0c;选择合适的数据结构能…