Dubbo的GenericService简介和基本使用

一看就会!Dubbo 泛化调用简明教程——含不同类型入参处理 Dubbo 泛化调用入门教程,案例详细,简洁易懂! 阅读详情
AI摘要

本文详细介绍了Dubbo中的GenericService,一种用于泛化调用的接口,它允许服务提供者和消费者绕过具体接口类,直接通过方法名和参数类型进行调用。文章通过实例展示了如何在服务端和客户端使用GenericService,以及调用时返回值类型的处理。

 

简介

GenericService是Dubbo提供的泛化接口,用来进行泛化调用。

GenericService接口只有一个方法:

Object $invoke(String var1, String[] var2, Object[] var3) throws GenericException;

第一个参数是方法名。

第二个参数是一个字符串数组,这是接口方法每个参数类型的全路径。

第三个参数是Object数组,是传给方法的具体参数列表。

Dubbo服务的提供者和消费者都可以使用这个接口,场景略有不同,二者也未必同时存在,可以由提供者使用GenericService,消费者用具体接口类,或者消费者使用GenericService,提供者用具体接口类,或者提供者和消费者都用GenericService,只要指定的接口能对得上,调用都没问题。

下面分别看一下。

 

服务提供者使用GenericService

当服务提供者使用这个接口时,可以省略Interface的代码,省略方法和参数的声明,通过指定接口名称的方式向zookeeper发布Dubbo服务。

这时GenericService就像是一个网关。

举个例子:

@Override
public void afterSingletonsInstantiated() {
    ServiceConfig<GenericService> service = new ServiceConfig<GenericService>();
    ApplicationConfig application = new ApplicationConfig("test-provider");
    service.setApplication(application);
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    service.setRegistry(registryConfig);
    service.setInterface("com.suibian.WhateverService");

    GenericService genericService = (method, parameterTypes, args) -> {
        if ("method1".equals(method)) {
            return "method1 result:" + args[0];
        }
        if ("method2".equals(method)) {
            return 12345;
        }
        if (parameterTypes.length == 2
                && parameterTypes[0].equals("java.lang.String")
                && parameterTypes[1].equals("java.lang.Integer")
                && "method3".equals(method)) {
            return "method3,param1:" + args[0] + ",param2:" + args[1];
        }
        return null;
    };
    service.setRef(genericService);
    service.export();
}

大概说明一下:

1,registryConfig里需要写好注册中心地址。zookeeper注册中心格式是这样的:zookeeper://127.0.0.1:2181。

2,ServiceConfig.setInterface()用于指定要发布的接口名称,这个名称可以不对应任何的java接口类,甚至可以随便写。在上面的例子中com.suibian.WhateverService这个名字就是随便写的,实际上代码中并没有这个接口类。

3,因为这样发布的Dubbo服务没有具体的接口类,所以invoke()方法的第一个参数String var1(原本是方法名)和第二个参数String[] var2(原本是方法参数类型列表)就脱离了具体接口类的束缚,可以接收任意值,就像上面例子中所写的一样,按照不同的参数执行不同的逻辑,就像一个网关一样。

4,Dubbo服务的发布本身不需要Spring服务启动,但如果把上面的代码放在main()方法中,随着进程结束,发布的Dubbo服务也会立即被取消。

5,向zookeeper中注册好的GenericService在zookeeper中是这样的:

[zk: localhost:2181(CONNECTED) 4] ls /dubbo/com.suibian.WhateverService/providers

[dubbo%3A%2F%2F172.16.111.111%3A20880%2Fcom.suibian.WhateverService%3Fanyhost%3Dtrue%26application%3Dtest-provider%26dubbo%3D2.5.3%26generic%3Dtrue%26interface%3Dcom.suibian.WhateverService%26methods%3D*%26pid%3D3856%26side%3Dprovider%26timestamp%3D1592905521950]

可以看到里面没有方法列表,有generic标识。

 

服务消费者使用GenericService

当服务消费者使用这个接口时,有个好处是不依赖服务提供者的Interface接口类,而是通过指定具体接口类路径的方式,创建消费者,并去zookeeper查找对应的提供者,然后发起调用。

举个例子:

public static void test3() {

    ApplicationConfig application = new ApplicationConfig("test-consumer"); //参数为dubbo消费方的名称
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    application.setRegistry(registryConfig);

    ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
    reference.setApplication(application);
    reference.setInterface("com.suibian.WhateverService");
    reference.setTimeout(3000);
    reference.setGeneric(true);
    GenericService genericService = reference.get();
    Object object1 = genericService.$invoke("method1", new String[]{"java.lang.String"}, new Object[]{"this is parameter"});    //调用泛化接口
    System.out.println(object1);

    Object object2 = genericService.$invoke("method2", new String[]{"java.lang.String"}, new Object[]{"this is parameter"});    //调用泛化接口
    System.out.println(object2);

    Object object3 = genericService.$invoke("method3", new String[]{"java.lang.String", "java.lang.Integer"}, new Object[]{"ABCD", 1234});    //调用泛化接口
    System.out.println(object3);

}

public static void main(String[] args) {
    test3();
}

根据上面提供者发布的接口,这次调用输出的结果是:

method1 result:this is parameter
12345
method3,param1:ABCD,param2:1234

可以看到,消费者使用GenericService时并不需要启动Spring服务,reference.get()方法会直接向zookeeper注册consumer,然后调用invoke()方法发起调用。

使用时记得加上reference.setGeneric(true);

 

invoke()方法的返回值类型

因为不依赖提供者的接口类,只是指定了接口类名和参数,所以调用时无法知道方法具体的返回值类型。

虽然invoke()方法的返回类型统一都是Object,不过还是能分成以下几种情况:

1,方法的返回类型是简单类型,比如Integer和String,比如这样的方法:

Integer findOne (String code);

返回的类型就是这种简单类型本身。

2,方法的返回类型是单个非简单元素,比如这样的方法:

Student findOne (String code);

返回值类型实际上是HashMap。key是提供者的接口类中方法返回类型的属性名,value是属性值。

3,方法的返回类型是列表,比如这样的方法:

List<Student> findList (String code);

返回值类型实际上是ArrayList<HashMap>。

 

本文结束

【Dubbo】dubbo-compatible项目说明 概述 Dubbo版本:2.7.8 项目名称:dubbo-compatible 目的:在Dubbo包名从"com.alibaba.dubbo"变为"org.apache.dubbo"后,用于升级Dubbo版本后提供一定的兼容性 主要包含以下接口或类 com.alibaba.dubbo.rpc.Filter / Invocation / Invoker / Result / RpcContext / RpcException com.alibaba.dubbo.config.annotatio. 阅读详情

相关推荐

dubbo泛化调用与隐式传参

duboo泛化调用原理分析

swain_yj的博客 1165

Dubbo的GenericService泛化使用

1.概念 GenericService是Dubbo提供的泛化接口。 当服务提供者使用这个接口时,可以省略Interface的代码,省略方法和参数的声明,通过指定接口名称的方式接入ZooKeeper。这时GenericService变成了一个网关。 当服务消费者使用这个接口时,有个好处是不依赖服务提供者的Interface接口类,而是通过指定具体接口类地址的方式,创建消费者,并去zookeeper查找对应的提供者,然后发起调用。 GenericService接口只有一个方法: Object $inv

yuanyuan5201的专栏 1631

dubbo springboot+dubbo泛化的使用,以及开发时直连本地的dubbo服务(dubbo指定点对点调用服务)

一般情况我们使用dubbo通过rpc调用dubbo提供方的服务,首先要在消费者的项目中引入接口提供者的jar包(provider端暴露的接口和方法),然后使用jar包里面的类和方法,两端才能正常通信调用。但是如果要调N个不同服务提供者的接口,就要引入N个jar包,这时候消费者项目有N多个dubbo提供者的jar,项目耦合度就会很大。我们可以用dubbo的泛化实现调用dubbo服务,泛化调用不需要引入provider提供的jar即可实现远程调用,降低耦合。区别就在于参数和返回值中所有的POJO都用Map表示。

新林的博客 4570

终于知道Dubbo泛化调用这个功能的用途了

两年前,笔者读Dubbo源码的时候就看到了泛化调用(GenericService)的逻辑,当时不知道为啥会有这个逻辑,想不明白,于是就跳过了。两年后再次接触Dubbo才看懂了泛化调用的逻辑...

吴就业 2683

Dubbo泛化调用入门到精通

Dubbo 泛化调用、阿里的好舒服的泛化调用都是类似的功能。最近给同事排查一个dubbo-admin 控制台调用报错的问题的小研究,为此还给社区提了一个issue,具体可以查看链接 dubbo-admin 泛型参数测试 ClassNotFoundException 看了最新版本好像自动去掉了出现泛型<这样的信息通通干掉,不过没有发布release版本。 参考文档:使用泛化调用 1、泛化调用 1.1 概念 泛化接口调用方式主要用于客户端没有 API 接口(泛化调用是指不需要依赖服务的二方包)及.

汪小哥 7456

基于51单片机的通讯聊天系统

通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时

m0_47419053的博客 3637

dubbo使用GenericService泛化调用

我们项目中常见场景,java应用内部接口都是使用dubbo,某个非java应用需要调用我们的接口的时候,无法使用dubbo,这是我们需要给它提供其他形式的接口,如restful api等等,这时我们需要为这个接口开发而增加额外的工作量。这时候就可以使用dubbo提供的GenericService来调用dubbo接口了,而使用GenericService调用接口的好处是不需要依赖服务提供方给的int...

a490789580的博客 1万+

计算机网络-自顶向下方法 第三章课后习题答案(第七版)

复习题 R1. a) 就叫这个协议为简单传输协议STP(Simple Transport Protocol)。在发送方,STP从发送进程接收不超过1196字节的数据块、目标主机地址和目标端口号。STP向每个块添加一个4字节的头,并将目标进程的端口号放在头中。STP然后将目标主机地址和结果段提供给网络层。网络层将段交付给目的地主机的STP。目的主机基于STP检查段中的端口号,从段中提取数据,并将数据传递给由端口号标识的进程。 b) 在发送方,STP从发送进程接收不超过1192字节的数据块、目标主机地址和目标端

Erekilu的博客 2万+

手动调用指定Dubbo接口(三)----GenericService篇

我写了个方法,可以给方法传递指定的Dubbo接口名,方法名,参数值,方法来调用我们指定的Dubbo接口,并返回结果。 这次用的是Dubbo的GenericService。 示例代码: @Controller @RequestMapping("/test") public class TestController { /** * @param interfaceName Dubbo接口名 * @param methodName 方法名 * @para.

lkforce 3961

搭建适用于lammps中opls-aa力场的文件流程

现在我已经解决了以上问题,并且通过我的方法可以实现从空白文档到搭建完成以上全部内容,后期只要细心检查即可。需要的data文件最关键是获得相应阴阳离子的mmol文件,因此问题转化为构建一份mmol文件。主要用到的软件及程序:gaussian09,makemol程序(tranal),opls-aa的参数文件。二面角个数:成角原子序号及对应的参数(这里PF6的结构没有二面角,所以为0)参考文献个数:文献名(空够行数即可,这些是给自己的备忘))和自身体系对应的参考文献,修改或填入对应的参数即可。

baguette的博客 2886

第170篇 因子图优化入门——图模型在状态估计中的应用

本文系统介绍了从滤波方法到因子图优化的思维转变,重点解析了因子图的原理与应用。首先对比了递推式滤波(卡尔曼滤波等)与全局优化的区别,指出优化方法能利用所有信息且适合处理稀疏结构。然后详细阐述了因子图的二部图结构(变量节点和因子节点)及其将复杂概率分布分解为小因子乘积的优势。文章讲解了因子图优化如何转化为最小二乘问题,并介绍高斯-牛顿法和LM方法等求解技术。最后对比了g2o、Ceres和GTSAM三大主流框架的特点及适用场景,强调了初始化和鲁棒核函数的重要性,为SLAM相关面试提供了实用建议。

郑伟强dev的专栏 370

java impliments,dubbo使用GenericService泛化调用

我们项目中常见场景,java应用内部接口都是使用dubbo,某个非java应用需要调用我们的接口的时候,无法使用dubbo,这是我们需要给它提供其他形式的接口,如restful api等等,这时我们需要为这个接口开发而增加额外的工作量。这时候就可以使用dubbo提供的GenericService来调用dubbo接口了,而使用GenericService调用接口的好处是不需要依赖服务提供方给的int...

weixin_36028342的博客 482

移位寄存器——用Verilog实现串入串出、串并和并串转换并进行Modelsim仿真

用Verilog实现串并转换 首先我们先要了并串和串并转换的原理 并串转换:先将八位数据暂存于一个八位寄存器器中,然后左移输出到一位输出端口,这里可以通过一个“移位”来实现,相当于实现了移位寄存器的功能。 串并转换:新输入的位值成为原来数据的最低位,将原来数据的最高位舍去,这里可以通过一个简单的“连接符”来实现。 我们这里采用两种方式来进行串并转换 一:lsb优先 Least Significant Bit,最低比特,最低位优先 二:msb优先 Most Significant Bit,最高比特,

H19981118的博客 2万+

基于Dubbo的GenericService远程调用下自定义消息转换器FastJsonHttpMessageConverter中FastJson注解失效的问题

自定义消息转换器FastJsonHttpMessageConverter中FastJson注解失效的问题

学无止步的博客 899

GRCNN抓取网络学习2【自制Jacquard数据集训练】

请先完成【机械臂视觉抓取从理论到实战】,这样有利于下面操作的理解!然后第二步是GRCNN抓取网络1【Jacquard数据集等效抓取集制作】,有了自己的数据集输入到GRCNN中是三种文件,接下来就是准备训练GRCNN网络啦!grasps.txtRGB.png本文帮大家根据自制Jacquard数据集训练GRCNN抓取网络,其中包含数据格式的对齐,列举了常见的几种训练方法,相信能坚持到这里的都应该试试顺利了吧!接下来会针对GRCNN调优,期待一下下吧,那就别宁色你的三连。

vor234的博客 2790

SGP4/SDP4详解

**SGP4** (Simplified General Perturbations Version 4) 和 **SDP4** (Simplified Deep-space Perturbations Version 4) 是一组**解析轨道预报模型**,用于预测地球轨道卫星的位置和速度。它们是北美防空司令部(NORAD)维护的**TLE**数据格式的标准配套算法。 简单来说:**TLE是卫星轨道的"身份证",而SGP4/SDP4是解读这张身份证的"说明书"**。

ScilogyHunter的博客 589

dubbo泛化调用使用GenericService自定义Exception变成GenericException的问题

使用GenericService调用dubbo接口的时候,发现抛出来的异常无法获取到自定义

a490789580的博客 3790

【实验必备】对AffectNet数据集进行人脸对齐的小Demo

本文首先简单介绍了AffectNet数据集,及人脸关键点等背景知识,接着Po出了人脸对齐的代码及效果展示。注:本文代码参考自FG2021的Emotion-GCN的开源代码,具有一定的可靠性,欢迎大家学习!

信小海 2666

服务消费端泛化调用 GenericService ReferenceConfig dubbo服务接口调用防重

GenericService 通用服务 invoke 援引 https://www.cnblogs.com/xhj123/p/9076530.html // 当前应用配置 ApplicationConfig applicationConfig= new ApplicationConfig(); applicationConfig.setName(“dubboConsumer”);//应用名称配置 ...

qq_37889782的博客 2213

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

dubbo里面的GenericService干啥的

两个用途一直是泛化服务,一种是泛化引用。前者是为了provider省事,后者是消费者省事。先介绍泛化服务怎么做到的: 比如提供者想省事,虽然提供了10个方法,但是不想在接口里面写十个方法,也就不用给这十个方法做函数声明、参数声明了。直接通过: ServiceConfig<GenericService> service = new ServiceConfig<Generic...

weixin_30257433的博客 609

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Dubbo泛化调用

泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,。泛化调用对于服务端无需关注,按正常服务进行暴露即可。

qq_41980255的博客 714

Dubbo接口泛化调用

涉及jar包 <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4</version> </dependency> <dependency> <gro...

简单随风的博客 1153

dubbo泛化调用和泛化引用

package cn.com.pingan.chenjihong; import java.lang.reflect.InvocationTargetException; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ReferenceConfig; import com.a

cjh_tostring的专栏 2870

Dubbo抛出自定义异常时报:Got unchecked and undeclared exception

转载:http://blog.youkuaiyun.com/xlee1905/article/details/44660449 dubbo的service端定义有自定义异常进行throw的时候,却发现在Controller中无法instanceof,自己自定义的异常类被转换成了Runtime异常,dubbo源码: [java]view plaincopy publicResultinvoke(Invoker<?>invoker,Invocationinvocation)thro...

gaoshan12345678910的博客 6108

dubbo泛化调用实战

参考文章:https://www.jianshu.com/p/3a22a53c7068 dubbo基本原理:https://blog.youkuaiyun.com/paul_wei2008/article/details/19355681 import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ReferenceConfig; import com.alibaba.dubbo.config.RegistryC.

ccaicjf的专栏 729
上一篇: Spring中InitializingBean和SmartInitializingSingleton的区别
下一篇: 手动调用指定Dubbo接口(二)----Reference篇
lkforce
博客等级 码龄16年 399粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值