首页 > 其他分享 >dubbo 泛型调用示例 (dubbo generic call)

dubbo 泛型调用示例 (dubbo generic call)

时间:2024-05-08 22:55:07浏览次数:26  
标签:dubbo 示例 generic params 泛型 new referenceConfig

 

1. 背景

泛型调用适用于观察者模式,即有很多广泛的消费者,但生产者又不想依赖消费者的client包,比如常见的API开放平台的回调机制;

 

2. 泛型调用

要实现泛型调用,几个核心点:

  • 泛型入参如何构建
  • 泛型服务service 如何构建
  • 泛型调用结果如何拿到

 

2.1 泛型入参

 

泛型入参须是HashMap, 并且第1个参数的key为class, value为实际RPC方法入参的class name,其余参数则为入参类里的字段。示例如下

    private Map<String, Object> buildParams() {
        Map<String, Object> params = new HashMap<>();
        params.put("class", "com.my.dubbo.client.generic.TestParams");
        params.put("name", "zhangsan");
        params.put("id", 1234556);
        params.put("phone", "12345");
        return params;
    }

 

2.2 泛型Service

泛型Service须借助dubbo本身提供的缓存机制org.apache.dubbo.config.utils.SimpleReferenceCache,减少每次重复创建Service的开销。

 

    @Test
    void testGenericCall() throws Exception {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("generic-demo-consumer");

        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setId("dubbo-registry-id");
        registryConfig.setAddress("zookeeper://myzk1:port");
        registryConfig.setTimeout(20000);
        applicationConfig.setRegistry(registryConfig);
        ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(applicationConfig);
        referenceConfig.setInterface("com.my.dubbo.client.generic.HelloService");
        referenceConfig.setGeneric("true");
        referenceConfig.setVersion("1.0.0");
        referenceConfig.setCheck(true);
        referenceConfig.setGroup("DEMO-GROUP");
        referenceConfig.setAsync(true);
        referenceConfig.setTimeout(10000);
        SimpleReferenceCache referenceCache = SimpleReferenceCache.getCache();
        GenericService genericService = referenceCache.get(referenceConfig);
        Map<String, Object> params = buildParams();
        String[] paramTypes = new String[] {"com.my.dubbo.client.generic.TestParams"};
Object result = genericService.$invoke("sayHello", paramTypes, new Object[]{params});
CountDownLatch latch = new CountDownLatch(1);
CompletableFuture<Object> future = RpcContext.getContext().getCompletableFuture();
future.whenComplete((value, t) -> {
result = value;
System.out.println("invokeAsyncHello(whenComplete): " + value);
latch.countDown();
});
latch.await(5000, TimeUnit.MILLISECONDS);
}

 

3. 注意事项

SpringBoot应用,需添加EnableDubbo标签才能调用泛型,否则无法获取到genericSerivce实例。

 

 

以上。

 

标签:dubbo,示例,generic,params,泛型,new,referenceConfig
From: https://www.cnblogs.com/sinsonglew/p/18181042

相关文章

  • Java护照识别接口开发示例、文字识别、证件识别
    护照是我们出国旅行时所必要的证件之一,他是我国公民去外国的旅行和工作的时候所代表的一个合法的身份证件。在护照上面也有不少关于我们个人身份的信息,而手动去录入如此多的身份信息这绝对是灾难。不仅证件,有的场景还需要录入很多文字信息。翔云API可识别图片上的身份证、护......
  • NodeJS路径遍历:示例及预防
    让我们来看看什么是路径遍历攻击,以及在Node.js中可以采用哪些方法来阻止这种攻击。构建一个安全而健壮的应用程序需要考虑的因素很多,并非一件容易的事情。要确保覆盖所有潜在的漏洞是一项十分艰巨的任务,这需要大量的经验和指导。在这些漏洞中,有一个和系统目录访问安全相......
  • dubbo-registry-api服务注册
    底层接口Registry接口:继承RegistryService与Node两个接口RegistryService接口:定义了Registry的注册、注销、订阅、取消订阅事件、lookup接口Node接口:定义getUrl、isAvailable、destroy接口中间层接口RegistryFactory 接口:定义了根据URL创建Registry的方法RegistryServ......
  • dubbo-TpsLimitFilter
    提供者端限流从调用url中获取接口、方法名、version、serviceKey,根据上面几个参数进行拼接限流key。限流方式DefaultTPSLimiter本地维护一个ConcurrenMap,key为限流的key(接口、方法名、version、serviceKey),value为StatItem对象,StatItem中定义了限流基础信息,rate、interval、las......
  • dubbo-ActiveLimitFilter
    服务消费者端限流ActiveLimitFilter限制客户端对interface或method的并发客户端调用。限流方式从url中获取actives并发数量,actives大于0进行并发控制,actives小于等于0不控制。消费者端使用RpcStatus下的ConcurrentMap<String,ConcurrentMap<String,RpcStatus>>存储每个metho......
  • dubbo-AdaptiveLoadBalance
    AdaptiveLoadBalance使用AdaptiveLoadBalanceFilter初始化的数据。核心处理org.apache.dubbo.rpc.cluster.loadbalance.AdaptiveLoadBalance#selectByP2Corg.apache.dubbo.rpc.cluster.loadbalance.AdaptiveLoadBalance#chooseLowLoadInvokerorg.apache.dubbo.rpc.AdaptiveMet......
  • dubbo2.7.x版本下,服务调用时参数丢失问题
    问题:A服务调用B,C两个服务,在A调用之前RpcContext设置了业务上的透传参数,希望在本次调用全程,在任何地方都能获取到这个参数,但是在A调用完B后,该参数丢失。排查:代码中自定义实现了两个filter,分别时provider和consumer两个Filter,但里面都没有清空参数的逻辑。后面经过排查,dubbo有个......
  • openGauss 并发写入示例
    并发写入示例本章节以表test为例,分别介绍相同表的INSERT和DELETE并发,相同表的并发INSERT,相同表的并发UPDATE,以及数据导入和查询的并发的执行详情。CREATETABLEtest(idint,namechar(50),addressvarchar(255));相同表的INSERT和DELETE并发相同表的并发INSERT相同......
  • dubbo-AdaptiveLoadBalanceFilter
    消费者端使用自适应负载方式dubbo负载方式介绍随机、循环负载平衡、最少活动、参数的一致性哈希、成功调用响应时间最短、自适应负载平衡AdaptiveLoadBalanceFilter内部使用ThreadPoolExecutor线程池处理,核心、最大线程数据为1,队列为1024个初始化ThreadPoolExecutor方式为双......
  • LLM2Vec介绍和将Llama 3转换为嵌入模型代码示例
    嵌入模型是大型语言模型检索增强生成(RAG)的关键组成部分。它们对知识库和用户编写的查询进行编码。使用与LLM相同领域的训练或微调的嵌入模型可以显著改进RAG系统。然而,寻找或训练这样的嵌入模型往往是一项困难的任务,因为领域内的数据通常是稀缺的。但是这篇论文LLM2Vec,可以将......