前言
大家好,明天开始给大家分享 — 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
微信公众号: