Dubbo的RPC泛化调用

news/2024/11/27 10:55:44/

目录

一、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.ppmy.cn/news/1550327.html

相关文章

路由策略与路由控制实验

AR1、AR2、AR3在互联接口、Loopback0接口上激活OSPF。AR3、AR4属于IS-IS Area 49.0001&#xff0c;这两者都是Level-1路由器&#xff0c;AR3、AR4的系统ID采用0000.0000.000x格式&#xff0c;其中x为设备编号 AR1上存在三个业务网段A、B、C&#xff08;分别用Loopback1、2、3接…

基于eBPF的微服务网络安全

一些开源的kubernetes工具已经开始使用eBPF&#xff0c;这些工具大多数与网络&#xff0c;监控和安全相关。 本文不会涵盖eBPF的方方面面&#xff0c;只作为一个入门指南&#xff0c;包括Linux内核的BPF概念&#xff0c;到将该功能加入到微服务环境的优势&#xff0c;以及当前…

Linux中的“块”是什么

在Linux系统中&#xff0c;块&#xff08;block&#xff09;是文件系统存储数据的基本单位&#xff0c;以下是关于Linux中块的概念和使用场景的详细解释&#xff1a; 一、块的概念 定义&#xff1a;块是多个连续性的扇区&#xff08;sector&#xff09;组成&#xff0c;扇区是…

【Python爬虫实战】深入解析 Scrapy:从阻塞与非阻塞到高效爬取的实战指南

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、阻塞和非阻塞 &#xff08;一&#xff09;阻塞 &#xff08;二&#xff09;非阻塞 二、Scrapy的工作…

JSON数据转化为Excel及数据处理分析

在现代数据处理中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;因其轻量级和易于人阅读的特点而被广泛使用。然而&#xff0c;有时我们需要将这些JSON数据转化为Excel格式以便于进一步的分析和处理。本文将介绍如何将JSON数据转化为Excel文件&#xff0…

大数据新视界 -- 大数据大厂之 Hive 函数库:丰富函数助力数据处理(上)(11/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【ArcGIS Pro】实现一下完美的坐标点标注

在CAD里利用湘源可以很快点出一个完美的坐标点标注。 但是在ArcGIS Pro中要实现这个效果却并不容易。 虽然有点标题党&#xff0c;这里就尽量在ArcGIS Pro中实现一下。 01 标注实现方法 首先是准备工作&#xff0c;准备一个点要素图层&#xff0c;包含xy坐标字段。 在地图框…

Python Selenium简介(三)

Selenium点击元素的方法 使用右键点击 canvas_element chromedriver.find_element(By.TAG_NAME, canvas) ActionChains(chromedriver).context_click(canvas_element).perform()文本输入、清除与提交 import time # 导入selenium包 from selenium import webdriver from sel…