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

本文详细介绍并演示了如何使用Dubbo的GenericService接口来调用指定的Dubbo服务,无需依赖具体的接口类,仅通过接口名、方法名及参数即可实现远程调用,适用于动态调用场景。
部署运行你感兴趣的模型镜像

我写了个方法,可以给方法传递指定的Dubbo接口名,方法名,参数值,方法来调用我们指定的Dubbo接口,并返回结果。

这次用的是Dubbo的GenericService。

 

示例代码:

@Controller
@RequestMapping("/test")
public class TestController {

    /**
     * @param interfaceName Dubbo接口名
     * @param methodName    方法名
     * @param parameter     参数值
     * @return
     */
    @RequestMapping(value = "/test2", method = RequestMethod.POST)
    @ResponseBody
    public static Object test2(@RequestParam(value = "interfaceName") String interfaceName,
                            @RequestParam(value = "methodName") String methodName,
                            @RequestParam(value = "parameter") String parameter) {

        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(interfaceName);
//            reference.setGroup("my-group");
//            reference.setVersion("1.0.0");
        reference.setTimeout(3000);
        reference.setGeneric(true);
        GenericService genericService = reference.get();
        Object object = genericService.$invoke(methodName, new String[]{"java.lang.String"}, new Object[]{parameter});    //调用泛化接口,返回单一元素

        //列表查询测试
        Query query = new Query();
        query.setOrderStatus(1);
        Object object2 = genericService.$invoke("selectList", new String[]{"com.test.Query"}, new Object[]{query});    //调用泛化接口,返回列表
        System.out.println(object2);

        return object;
    }

    public static void main(String[] args) {
        test2("com.test.OrderService","selectOne","ABC123");
    }
}

注:

1,registryConfig.setAddress()方法填写的zookeeper的地址。

2,调用泛化接口时,reference.setGeneric(true)是必要的。

 

GenericService简介

GenericService是Dubbo提供的泛化接口。

当服务提供者使用这个接口时,可以省略Interface的代码,省略方法和参数的声明,通过指定接口名称的方式接入zookeeper。这时GenericService变成了一个网关。

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

GenericService接口只有一个方法:

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

其中第一个参数是方法名。

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

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

$invoke()方法的返回值:当返回的是单个非简单元素时,返回值类型实际上是HashMap,当返回的是列表时,返回值类型实际上是ArrayList<HashMap>。

详细一点的介绍参见:

Dubbo的GenericService简介和基本使用

 

本文结束

 

三篇手动调用指定Dubbo接口的文章:

手动调用指定Dubbo接口(一)----Spring注入篇

手动调用指定Dubbo接口(二)----Reference篇

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

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值