当前位置: 首页 > news >正文

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中的接口级地址发现与应用级地址发现:概念与实践-百度开发者中心

相关文章:

Dubbo的RPC泛化调用

目录 一、RPC泛化调用的应用场景 二、Dubbo RPC泛化调用的实现原理 三、Dubbo RPC泛化调用的实现步骤 四、示例代码 五、泛化调用怎么发现提供该接口的服务及服务的IP和端口&#xff1f; Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下&#xff0c;对服务方…...

【k8s深入理解之 Scheme】全面理解 Scheme 的注册机制、内外部版本、自动转换函数、默认填充函数、Options等机制

参考 【k8s基础篇】k8s scheme3 之序列化_基于schema进行序列化-CSDN博客【k8s基础篇】k8s scheme4 之资源数据结构与资源注册_kubernetes 的scheam-CSDN博客常见问题答疑 【k8s深入理解之 Scheme 补充-1】理解 Scheme 中资源的注册以及 GVK 和 go 结构体的映射-CSDN博客【k8s深…...

接口性能优化宝典:解决性能瓶颈的策略与实践

目录 一、直面索引 &#xff08;一&#xff09;索引优化的常见场景 &#xff08;二&#xff09;如何检查索引的使用情况 &#xff08;三&#xff09;如何避免索引失效 &#xff08;四&#xff09;强制选择索引 二、提升 SQL 执行效率 &#xff08;一&#xff09;避免不必…...

雨晨 Windows Server 2025 数据中心 极简 26311.5000

文件: 雨晨 Windows Server 2025 数据中心 极简 26311.5000 install.esd 大小: 1740910278 字节 修改时间: 2024年11月29日, 星期五, 19:00:20 MD5: 5B946B9DED569E04917E804B25A0F736 SHA1: E78BB430B3E0397F6ACFEB821CF85EA7CFB5A00F CRC32: B3F76BD7 常规制作旨在测试YCDIS…...

关于IDE的相关知识之三【插件安装、配置及推荐的意义】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于ide插件安装、配置及推荐意义的相关内容…...

JSP+Servlet实现列表分页功能

分享一种最简单的JSPServlet实现分页的方式&#xff01; 旧&#xff1a;无分页功能的查询列表功能&#xff0c;仅供参考&#xff01; Servlet try {Connection conn null;PreparedStatement ps null;ResultSet rs null;List<Dept> arrayList null;conn DBUtil.get…...

操作系统存储器相关习题

1 为什么要配置层次式存储器? 设置多个存储器可以使存储器两端的硬件能并行工作&#xff1b; 采用多级存储系统特别是Cache技术&#xff0c;是减轻存储器带宽对系统性能影响的最佳结构方案&#xff1b; 在微处理机内部设置各种缓冲存储器&#xff0c;减轻对存储器存取的压力。…...

QUICK 调试camera-xml解析

本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架&#xff0c;只需通过配置XML文件&#xff0c;设置相机模组的相关参数&#xff0c;就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析&#xff0c;这中间需要c…...

【linux】shell脚本编写基础

shell 脚本关键字&#xff1a; 1、变量定义:前后不能空格 输入&#xff1a; zhao"Joe" echo ${zhao} echo "I am ${zhao}" 输出&#xff1a; yuxin I am Joe2、echo 输出 输入&#xff1a; echo "123" 输出&#xff1a; 1233、readonly 定义变…...

STM32 外设简介

STM32 外设简介 STM32 是由意法半导体 (STMicroelectronics) 开发的一系列基于 ARM Cortex 内核的微控制器&#xff0c;广泛应用于嵌入式系统中。STM32 系列的一个重要特点是其丰富而强大的外设模块&#xff0c;支持多种接口和功能&#xff0c;能满足工业控制、物联网、消费电…...

Django-Vue3-Admin - 现代化的前后端分离权限管理系统

项目介绍 Django-Vue3-Admin是一个基于RBAC&#xff08;Role-Based Access Control&#xff09;模型的综合性基础开发平台&#xff0c;专注于权限控制&#xff0c;支持列级别的细粒度权限管理。该项目采用前后端分离架构&#xff0c;技术栈包括: 后端: Django Django REST …...

Cesium K-means自动聚合点的原理

Cesium K-means自动聚合点的原理 Cesium 是一个开源的 JavaScript 库&#xff0c;用于在 Web 环境中创建 3D 地球和地图应用。它能够处理地理空间数据&#xff0c;并允许开发者对大规模的地理数据进行可视化展示。在一些应用中&#xff0c;尤其是当处理大量地理坐标点时&#…...

Vue 项目中如何解决组件之间的循环依赖

前言 在大型 Vue 项目中&#xff0c;组件之间的关系可能会变得非常复杂&#xff0c;甚至会出现循环依赖的问题。循环依赖是指两个或多个模块互相依赖&#xff0c;形成一个闭环。这类问题会导致项目无法正常编译或运行&#xff0c;甚至可能引发意想不到的错误。本文将通过通俗易…...

交通流量预测:基于交通流量数据建立模型

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Hot100 - 搜索二维矩阵II

Hot100 - 搜索二维矩阵II 最佳思路&#xff1a; 利用矩阵的特性&#xff0c;针对搜索操作可以从右上角或者左下角开始。通过判断当前位置的元素与目标值的关系&#xff0c;逐步缩小搜索范围&#xff0c;从而达到较高的效率。 从右上角开始&#xff1a;假设矩阵是升序排列的&a…...

uart_pl011.c驱动API的zephyr测试

API概述 本次测试针对uart的uart_poll_in和uart_poll_outAPI进行测试&#xff0c; uart_poll_in static int pl011_poll_in(const struct device *dev, unsigned char *c)这是一个轮询方式的接收函数&#xff1a; 功能&#xff1a;检查 UART 是否有新数据到达&#xff0c;如…...

RPA:电商订单处理自动化

哈喽&#xff0c;大家好&#xff0c;我是若木&#xff0c;最近闲暇时间较多&#xff0c;于是便跟着教程做了一个及RPA&#xff0c;谈到这个&#xff0c;可能很多人并不是很了解&#xff0c;但是实际上&#xff0c;这玩意却遍布文末生活的边边角角。话不多说&#xff0c;我直接上…...

小程序 - 个人简历

为了让招聘人员快速地认识自己&#xff0c;可以做一个“个人简历”微信小程序&#xff0c; 展示自己的个人信息。 下面将对“个人简历”微信小程序进行详细讲解。 目录 个人简历 创建图片目录 页面开发 index.wxml index.wxss 功能实现截图 总结 个人简历 创建图片目录…...

MySQL自启动失败(MySQL不能开机自启)解决方案_MySQL开机自启疑难杂症解决,适用Win11/Win10

问题描述&#xff08;MySQL 开机自启失败&#xff09; 本文解决方法&#xff0c;在 windows10 、 windows11 系统中均可使用。 win11 安装 MySQL 后&#xff0c;不能开机自启。 在服务中&#xff0c;手动启动服务后&#xff0c;可正常使用&#xff0c;一点异常都没有。 或者…...

储存水..

问题描述: 给定m个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子下雨之后能储存多少水. 思路解析: 思考一下,什么样的位置能盛水?只有在当前柱子的左边和右边都比它高的情况下才能储存住水,而储水量和左侧最高柱及右侧最高柱有关.具体来说就是和左右两侧最矮的…...

Cmake 常用操作总结

CMakeLists.txt结构 总结该文件的主要结构 cmake_minimum_required(VERSION <version>) 指定CMake的最低版本&#xff0c;一般都是根据项目需要设定 cmake_minimum_required(VERSION 3.10) project(<name>) 定义项目的名称&#xff0c;放在CMake的开头 project(…...

Kylin Server V10 下 RocketMQ 主备自动切换模式部署

一、NameServer简介 NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。 服务注册 Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册…...

DevOps工程技术价值流:GitLab源码管理与提交流水线实践

在当今快速迭代的软件开发环境中&#xff0c;DevOps&#xff08;开发运维一体化&#xff09;已经成为提升软件交付效率和质量的关键。而GitLab&#xff0c;作为一个全面的开源DevOps平台&#xff0c;不仅提供了强大的版本控制功能&#xff0c;还集成了持续集成/持续交付(CI/CD)…...

Vue 3 中实现页面特定功能控制

在开发 Vue 应用时&#xff0c;我们经常会遇到需要在特定页面启用或禁用某些功能的情况。本文将以 A父.vue 页面为例&#xff0c;探讨如何在点击汇总菜单时仅在该页面生效&#xff0c;而在其他页面不生效的问题。 1. 利用 Vue 3 的 provide 和 inject 实现状态传递 Vue 3 提供…...

VLC 播放的音视频数据处理流水线搭建

VLC 用 input_thread_t 对象直接或间接管理音视频播放有关的各种资源,包括 Access,Demux,Decode,Output,Filter 等,这个类型定义 (位于 vlc-3.0.16/include/vlc_input.h) 如下: struct input_thread_t {VLC_COMMON_MEMBERS };input_thread_t 是个抽象类型,VLC 中这个类…...

何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)

在管理数据库表时&#xff0c;考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外&#xff0c;使用正确的工具&#xff08;例如dbForge Studio for SQL Server&#xff09; &#xff0c;与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...

学习笔记043——HashMap源码学习1

文章目录 1、HashMap2、Hashtable3、TreeMap4、HashMap 底层结构4.1、什么是红黑树&#xff1f; 1、HashMap HashMap key 是不能重复的&#xff0c;value 可以重复 底层结构 key-value 进行存储&#xff0c;key-value 存入到 Set 中&#xff0c;再将 Set 装载到 HashMap pack…...

单点登录原理

允许跨域–>单点登录。 例如https://www.jd.com/ 同一个浏览器下&#xff1a;通过登录页面产生的cookie里的一个随机字符串的标识&#xff0c;在其他子域名下访问共享cookie获取标识进行单点登录&#xff0c;如果没有该标识则返回登录页进行登录。 在hosts文件下面做的域名…...

【随笔】AI大模型对软件开发的影响

随着 AI 技术的不断发展&#xff0c;AI大模型正在重塑软件开发流程&#xff0c;从代码自动生成到智能测试&#xff0c;未来&#xff0c;AI 大模型将会对软件开发者、企业&#xff0c;以及整个产业链都产生深远的影响。欢迎探讨 AI 是如何重塑软件开发的各个环节以及带来的新的流…...

JAVA中接口类和抽象类的区别

在Java中&#xff0c;接口&#xff08;Interface&#xff09;和抽象类&#xff08;Abstract Class&#xff09;都是实现抽象概念的方式&#xff0c;但它们之间存在一些关键的区别&#xff1a; 1. 定义和声明 抽象类&#xff1a; 使用abstract关键字声明。可以包含构造方法、成…...

成都哪里做网站/宁波网站推广优化

前端页面性能问题&#xff1a; 前端性能包括&#xff1a;网络层面、构建层面、服务端层面、浏览器渲染层面的优化 页面响应时间&#xff1a;白屏时间、首屏时间、网页加载时间、资源加载时间、整页加载时间 性能优化点背后的原理 谷歌优化&#xff1a;performs、 players工具…...

做网站咋么插入背景图片/天津网站排名提升多少钱

除了能够对文件内容进行读写&#xff0c;对文件本身相同也能够进行操作&#xff0c;如拷贝文件、又一次命名、查看改动日期等。PHP内置了大量的文件操作函数&#xff0c;经常使用的文件函数例如以下表&#xff1a; 函数原型函数说明举例 bool copy(string path1,string path2)将…...

购物网站排名 2019/搜索引擎登录入口

异步调用除了可以使用多线程以外&#xff0c;spring自已也实现了通过注解进行异步调用的功能&#xff0c;我们只需要进行一些简单的配置&#xff0c;并且在需要异步调用的方法上添加对应的注解即可。 在applicationContext.xml中添加如下&#xff1a; <task:annotation-dri…...

外贸自己做网站好不好/seo搜索引擎优化推广

今天看代码是看到&#xff1a;bridge_delay (useconds_t)strtoul(optarg, (char **)NULL, 10);个人感觉这个strtoul函数还是很有意思的&#xff0c;故记录下来&#xff01; 它是属于标准库中的函数stdlib.h中有定义&#xff1a;__BEGIN_NAMESPACE_STD /* Convert a string to …...

浅谈中兴电子商务网站建设/常州百度seo排名

PHP虽然是世界上最好的语言&#xff0c;但总被吐槽不支持异步&#xff0c;经常被隔壁node、golang、java、python四大金刚嘲笑。其实我们要实现异步也非常简单&#xff0c;之前看到鸟哥的一篇写PHP异步执行的博文 PHP实现异步调用方法研究&#xff0c;这篇文章写于08年距离今天…...

整站wordpress下载/海洋网络推广效果

PXE(Preboot eXecution Environment)技术可以实现无盘工作站的网络启动。结合xCAT,可以实现大规模的无盘工作站自动化部署。本文主要介绍如何使用PXExCAT自动化部署oVirt Node系统。 xCAT通过TFTP,DHCP,FTP等服务,实现PXE无盘工作站的网络启动和自动化安装。xCAT管理节点上需要…...