共计 4676 个字符,预计需要花费 12 分钟才能阅读完成。
前言
大家好,明天开始给大家分享 — Dubbo 专题之 Dubbo 泛化援用。在前一个章节中咱们介绍了 Dubbo 中的参数验证以及应用场景。咱们在这个章节会持续介绍 Dubbo 泛化援用。那么什么是泛化援用呢?泛化援用有什么作用呢?上面就让我具体理解下吧!
1. 泛化援用简介
在后面的章节中咱们编写的 Dubbo 服务都是基于 API 接口,例如:com.muke.dubbocourse.common.api.BookFacade
接口。咱们在日常开发中的步骤都是首先定义好裸露服务的 API 接口,而后把这个接口打包成 jar 提供给服务调用方。也就是说通常状况下咱们的服务调用方都会依赖咱们定义的 API 接口编程。那么在 Dubbo 中为咱们提供一种不须要依赖 API 接口的形式进行服务调用,这种形式就泛化援用。其示意类为GenericService
。
2. 应用形式
在这里咱们次要介绍两种应用形式:
- 通过 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);
- 通过 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. 示例演示
上面咱们通过两种形式来演示一个获取图书列表的服务。
- 应用 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();} }
- 应用 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
对象。
本节课程的重点如下:
- 了解 Dubbo 中泛化援用
- 理解了两种泛化援用应用形式
- 理解泛化援用实现原理
- 理解泛化援用应用场景
作者
集体从事金融行业,就任过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就任于某银行负责对立领取零碎建设。本身对金融行业有强烈的喜好。同时也实际大数据、数据存储、自动化集成和部署、散布式微服务、响应式编程、人工智能等畛域。同时也热衷于技术分享创建公众号和博客站点对常识体系进行分享。关注公众号:青年 IT 男 获取最新技术文章推送!
博客地址: http://youngitman.tech
微信公众号: