文档章节

Dubbo动态调用实现

 宸明
发布于 2018/09/18 19:38
字数 642
阅读 754
收藏 0

问题提出

Dubbo常用使用方式大家都比较熟悉,确定好服务的与服务之间调用关系,确定好相关接口参数,基于spring配置好,启动provider,然后启动consumer去调用相关服务。但有这样的一种场景:

  • 所有的Provider的接口都相同,但每个系统有自己的不同实现。例如系统A和B都提供com.HelloService服务,但具体实现不一样,需要Consumer端根据传入参数来区分开来并调用
  • Dubbo的Consumer端需要在运行时才知道调用具体的Dubbo服务,而这个<dubbo:reference/>并没有在spring的bean中配置

解决方案

同一个服务不同实现版本

先来看第一种场景,可以通过配置group 的方式实现同一个服务的不同实现版本:

提供者dubbo端配置:
<dubbo:service interface="com.HelloService"  group="groupA" ref="helloService" />
消费者consumer配置:
<dubbo:reference id="helloService"interface="com.HelloService" group="groupA"/>
说明:只有相同group的才能进行匹配,若要实现消费者任意调用提供者的某个服务,只需要把group设置为“*”,即:

<dubbo:reference interface="com.HelloService" group="*" id="helloService"/>

动态调用

需要在实际使用时,构造出Consumer端的服务类,并通过上述的group的方式区分不同的服务实现,如下:

public HelloService getInvokeService(String group) {
        ApplicationConfig application = new ApplicationConfig();
        application.setName("dubboConsumer");
        
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("127.0.0.1:2181");
        registry.setProtocol("zookeeper");

        ReferenceConfig<HelloService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(application);
        referenceConfig.setRegistry(registry);
        referenceConfig.setGroup(group);
        referenceConfig.setInterface(HelloService.class);
       return referenceConfig.get();
    }

性能优化

上述实现已经可以满足我们提出的两个要求,但是存在性能问题,因为每次调用该方法,都需要重新生成一个新的ReferenceConfig,并且调用get()方法获取一个代理的实现,该实现封装了与注册中心的连接以及与提供者的连接。为了能够重用该连接,可以将其缓存,这里使用dubbo内置的简单缓存工具类进行缓存,实现代码如下:

 public HelloService getInvokeService(String group) {
        ApplicationConfig application = new ApplicationConfig();
        application.setName("dubboConsumer");
        
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("127.0.0.1:2181");
        registry.setProtocol("zookeeper");

        ReferenceConfig<HelloService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(application);
        referenceConfig.setRegistry(registry);
        referenceConfig.setGroup(group);
        referenceConfig.setInterface(HelloService.class);
         ReferenceConfigCache cache = ReferenceConfigCache.getCache();
       return cache.get(referenceConfig);
    }

参考文献:Dubbo高级特性实践-泛化调用

© 著作权归作者所有

粉丝 20
博文 54
码字总数 75402
作品 0
杭州
程序员
私信 提问
Dubbo源码分析(2),Dubbo中采用的设计模式

1、工厂模式 ServiceConfig中有个字段,代码是这样的: Dubbo里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了jdkspi的机制。这么实现的优点是可扩展性强,想要扩展实现,只需...

郑加威
2018/03/18
224
0
如何更好地学习dubbo源代码

作者:道业 Dubbo的官方首页在这里:http://code.alibabatech.com/wiki/display/dubbo/Home 很荣幸,作为这样一款业界使用率和好评率出众的RPC框架的维护者,今天这个文章主要是想帮助那些热...

指尖的舞者
2016/08/05
176
0
Dubbo (二) ——- 项目结构解析

本文主要说明点 概述 背景 需求 架构 Dubbo源代码项目结构 概述 分享 Dubbo 的项目结构 ,通过本文可以大致了解到Dubbo整个项目的结构 背景 将一个项目进行拆分, 进行分布式架构。 需要解决...

小刀爱编程
2018/10/16
775
0
dubbo源码理解(1)启动初始化与bean加载

今天看了一些博文,都是关于dubbo源码解析方面的。觉得有必要记一下。 问题1:spring 如何注入dubbo 的?或者说怎么集成dubbo 的,或者说 dubbo启动时怎么启动spring的? 1、首先想要实现 在...

明瞐
2018/10/13
262
0
Dubbo原理和源码解析之服务暴露

一、框架设计 在官方《Dubbo 用户指南》架构部分,给出了服务调用的整体架构和流程: 另外,在官方《Dubbo 开发指南》框架设计部分,给出了整体设计: 以及暴露服务时序图: 本文将根据以上几...

明瞐
2018/09/29
269
0

没有更多内容

加载失败,请刷新页面

加载更多

蓝鲸平台部署

环境 系统:Centos7 依赖包:java8 主机: 10.0.1.150 域名:paas.ops.net;cmdb.ops.net;job.ops.net 生成SSH key ssh-keygen -t rsa -P '' 生成证书 https://bk.tencent.com/download_ssl/......

以谁为师
25分钟前
1
0
电子字典C语言链表版

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>struct dict{ char *key; char *content; struct dict *ne......

holdbody
40分钟前
4
0
windows 查看 端口使用情况

资料 https://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html 统计端口连接数 netstat -an|find "8080" /c...

zaolonglei
40分钟前
3
0
OSG 屏幕空间环境光遮蔽(SSAO)讲义3 算法的核心

先介绍SSAO 接着介绍SSAO的核心算法 延迟着色法的采样 颜色采样 把像机的几个参数传入Shader SSAO渲染 建立SSAO摄像机 SSAO摄像机显示漫反射采样 先用上下像素点的方案, 再次讲原理. 换用RGB...

洛克人杰洛
今天
6
0
聊聊rocketmq的AccessChannel

序 本文主要研究一下rocketmq的AccessChannel AccessChannel rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/AccessChannel.java public enum AccessChannel { /** ......

go4it
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部