关于dubbo:Dubbo-泛化引用

46次阅读

共计 4676 个字符,预计需要花费 12 分钟才能阅读完成。

前言

大家好,明天开始给大家分享 — Dubbo 专题之 Dubbo 泛化援用。在前一个章节中咱们介绍了 Dubbo 中的参数验证以及应用场景。咱们在这个章节会持续介绍 Dubbo 泛化援用。那么什么是泛化援用呢?泛化援用有什么作用呢?上面就让我具体理解下吧!

1. 泛化援用简介

在后面的章节中咱们编写的 Dubbo 服务都是基于 API 接口,例如:com.muke.dubbocourse.common.api.BookFacade接口。咱们在日常开发中的步骤都是首先定义好裸露服务的 API 接口,而后把这个接口打包成 jar 提供给服务调用方。也就是说通常状况下咱们的服务调用方都会依赖咱们定义的 API 接口编程。那么在 Dubbo 中为咱们提供一种不须要依赖 API 接口的形式进行服务调用,这种形式就泛化援用。其示意类为GenericService

2. 应用形式

在这里咱们次要介绍两种应用形式:

  1. 通过 Spring 应用泛化援用
  • 配置 XML 文件中的服务援用为generic="true"

    <dubbo:reference id="barService" interface="com.muke.dubbocourse.common.api.BookFacade" generic="true" />
  • 在代码中应用泛化调用

    GenericService barService = (GenericService) applicationContext.getBean("bookFacade");
    Object result = barService.$invoke("queryAll", null, null);
  1. 通过 Java API 形式应用
// 援用近程服务 
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); 
// 弱类型接口名
reference.setInterface("com.muke.dubbocourse.common.api.BookFacade");  
reference.setVersion("0.0.1");
// 申明为泛化接口 
reference.setGeneric(true);  

// 用 org.apache.dubbo.rpc.service.GenericService 能够代替所有接口援用  
GenericService genericService = reference.get(); 

// 如果返回实体对象将主动转成 Map 
Object result = genericService.$invoke("queryByName",new String[]
{"com.muke.dubbocourse.common.api.RequestParameter"}, new Object[]{parameter}); 

3. 应用场景

从泛化援用自身咱们能够晓得它是不须要 API 接口,也就是说泛化援用应用场景在服务提供方没有明确的 API 接口提供的状况下咱们都能够应用。通常用于框架集成,比方:实现一个 Dubbo 服务对外对立网,就可通过 GenericService 调用后端所有服务实现。例如:

在下面的图中客户端通过对立的 Dubbo 网关拜访后端所有的 Dubbo 服务,这里就是应用 泛化调用实现。

4. 示例演示

上面咱们通过两种形式来演示一个获取图书列表的服务。

  1. 应用 Spring 泛化援用
  • 次要看生产端 XML 配置文件dubbo-consumer-xml.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <dubbo:application name="demo-consumer" logger="log4j"/>
    
        <!-- 应用 zookeeper 注册核心 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />
        <!-- 设置 generic="true"-->
        <dubbo:reference id="bookFacade" interface="com.muke.dubbocourse.common.api.BookFacade" generic="true"></dubbo:reference>
    
    </beans>
  • 生产端 Java 代码

    public class XmlApplication {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("generic/consumer/spring/dubbo-consumer-xml.xml");
    
            context.start();
    
              // 创立泛化调用对象
            GenericService bookFacade = (GenericService) context.getBean("bookFacade");
    
            RequestParameter parameter = new RequestParameter();
    
            parameter.setName("SpringBoot");
                    // 泛化调用 第一个参数:办法名称,第二个参数:申请参数类型的数组,第三方个参数:申请参数值的数组
            Object result = bookFacade.$invoke("queryByName", new String[] {"com.muke.dubbocourse.common.api.RequestParameter"}, new Object[] { parameter});
    
            System.out.println("Result=>"+result);
    
            System.in.read();}
    
    }
  1. 应用 Java API 形式
public class XmlApplication2 {public static void main(String[] args) throws IOException {

        // 援用近程服务
        ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
        // 弱类型接口名
        reference.setInterface("com.muke.dubbocourse.common.api.BookFacade");

        // 注册核心配置
        RegistryConfig registryConfig = new RegistryConfig();

        registryConfig.setAddress("zookeeper://127.0.0.1:2181");

        reference.setRegistry(registryConfig);

        // 利用配置
        ApplicationConfig applicationConfig = new ApplicationConfig();

        applicationConfig.setName("demo-consumer");

        reference.setApplication(applicationConfig);
        // 申明为泛化接口
        reference.setGeneric(true);

        // 用 org.apache.dubbo.rpc.service.GenericService 能够代替所有接口援用
        GenericService genericService = reference.get();

        RequestParameter parameter = new RequestParameter();

        parameter.setName("SpringBoot");

        Object result = genericService.$invoke("queryByName", new String[]{"com.muke.dubbocourse.common.api.RequestParameter"}, new Object[]{parameter});

        System.out.println("Result=>" + result);

        System.in.read();}

}

在下面的代码中咱们通过 Java API 的形式配置了注册核心、利用配置。在调用服务的应用和下面的 Spring 应用形式相似应用 org.apache.dubbo.rpc.service.GenericService#$invoke 办法。

5. 实现原理

在下面的代码 GenericService genericService = reference.get() 中会调用到 org.apache.dubbo.config.ReferenceConfig#init 办法,而在此办法中 org.apache.dubbo.config.ReferenceConfig#createProxy 办法创立一个服务调用代理对象。当咱们调用 genericService.$invoke 办法是理论调用的是 org.apache.dubbo.rpc.proxy.InvokerInvocationHandler#invoke 办法而后调用 org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker#invoke 调用咱们 org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke 在此办法中就查找咱们的调用近程的 Invoker 对象,时序图如下:

6. 小结

在本大节中咱们次要学习了 Dubbo 中泛化援用和应用场景,以及应用 Spring 的形式和基于 Java API 的形式应用泛化援用。同时也剖析了泛化援用实现的原理,其实就是通过 ReferenceConfig 包装接口名称、调用办法以及参数名称和参数值,再创立 GenericService 代理对象而后调用一系列的 Invoker 对象。

本节课程的重点如下:

  1. 了解 Dubbo 中泛化援用
  2. 理解了两种泛化援用应用形式
  3. 理解泛化援用实现原理
  4. 理解泛化援用应用场景

作者

集体从事金融行业,就任过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就任于某银行负责对立领取零碎建设。本身对金融行业有强烈的喜好。同时也实际大数据、数据存储、自动化集成和部署、散布式微服务、响应式编程、人工智能等畛域。同时也热衷于技术分享创建公众号和博客站点对常识体系进行分享。关注公众号:青年 IT 男 获取最新技术文章推送!

博客地址: http://youngitman.tech

微信公众号:

正文完
 0