本文主要讲解“Dubbo注册中心是如何设计的”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你了解“杜博注册中心是如何设计的”!
关于源代码和原理的分析,我们都需要找到一个切入点。找到切入点的前提是你要知道注册中心的功能是什么。注册中心相信大家都很熟悉。每个通用注册中心需要提供两个基本功能点:
服务提供商向注册中心注册他们公开的服务。
服务消费者可以从注册中心获得他们需要的服务。
首先我们需要确定一下Dubbo的源码包的位置关于注册表:org.apache.dubbo.registry我们来看一下包的目录结构图:
上面红框中的9个包对应的是Dubbo中9种注册表的实现,包的名称也可以展示注册表实现的具体方式。其中,Dubbo官网推荐的注册中心实施的是基于ZooKeeper的注册中心。然后我们来分析一下基于ZooKeeper的注册表是如何在Dubbo中实现的。
Dubbo注册中心设计
其实在学习开源框架的过程中,我们除了学习它们的使用之外,还可以通过分析源代码来学习这些开源框架的设计。每个开源框架的实现基本上都是可扩展的,这个易于扩展的特性得益于优秀的设计模式。让我们来看看在注册中心的实现中,Dubbo是如何设计来支持各种注册中心的。
00-1010 SPI(服务提供者接口)是Java提供的一种服务发现机制。SPI是使用一个具体的接口实现类,在运行时动态替换接口。
Java中的具体实现非常简单。你只需要定义一个接口,然后用一个具体的实现类实现这个接口,然后在META-INFO/services中创建一个以接口的全限定名命名的文件,其内容就是具体接口实现类的全限定名。
java中有一个java.util.ServiceLoader,可以找到服务的具体实现。
SPI
Dubbo没有直接使用Java的原生SPI,而是重新实现了一套更强大的SPI机制。duospi的相关逻辑封装在ExtensionLoader类中。具体分析请参考官网。在这里,我们将简单解释扩展类动态替换的基本过程。
首先,您需要获取ExtensionLoader实例(调用ExtensionLoader。GetExtensionLoader (classtype)),其中type是接口类。
通过ExtensionLoader实例调用getExtension(String name)方法获取具体实例(name是在Dubbo中配置的扩展类的键值)。在这一步中,首先从缓存中获取具体的扩展类实例,然后直接返回(这意味着扩展类实例已经被加载)。如果没有,则需要创建(调用createExtension(String name)方法)并存储在缓存中(这一步采用双检测锁,避免并发问题,具体编写请参考源代码)
在创建实例之前,我们首先需要找到具体的实现类(getExtensionClasses()。get(name))根据名称对应对应的扩展类。为了找到具体的实现类,我们首先需要获取应用程序中所有扩展类的具体实现类(getExtensionClasses())。
获取之前,先检查类型表示的接口Class上是否有@SPI标注,如果有,分析并缓存缺省键(即@ SPI标注的值),然后加载特定扩展类的实现类,基于缓存获取特定扩展类的实现类。如果发现可以从缓存中获取一个实现类的集合,则直接返回,否则需要加载应用程序中所有扩展类的具体实现类并存储在缓存中,关键是文件。
在第二步中,传入的名称值从映射中获取类。如果获取的值为空,将引发异常;否则,它将会成功。
获取特定类后,首先验证该类的特定对象是否已经缓存在缓存中,如果没有,创建一个新对象并缓存。
获取具体扩展实现类的对象后,我们需要使用反射赋值(调用injectExtension方法)来注入依赖,这部分函数需要依赖Dubbo IOC函数。
Dubbo SPI
Dubbo首先通过反射获取所有setter方法,然后通过ExtensionFactory获取依赖对象,最后通过反射调用将依赖关系设置到目标对象中。ExtensionLoader中使用的ExtensionFactory是AdaptiveExtensionFactory,在AdaptiveExtensionFactory中维护了一个扩展工厂列表,用于存储其他类型的扩展工厂。Dubbo目前提供两种扩展工厂,即ExtensionFactory和SpringExtensionFactory。前者用于创建自适应扩展,后者用于从Spring的IOC容器中获取所需的扩展。
至此,相信大家对“Dubbo注册中心是如何设计的”有了更深的理解,让我们在实践中去做吧!这是网站。更多相关内容,可以去相关渠道查询,关注我们,继续学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147024.html