CN115794416B - 基于Storm和Nacos的数据热切换方法和装置 - Google Patents
基于Storm和Nacos的数据热切换方法和装置 Download PDFInfo
- Publication number
- CN115794416B CN115794416B CN202310051349.7A CN202310051349A CN115794416B CN 115794416 B CN115794416 B CN 115794416B CN 202310051349 A CN202310051349 A CN 202310051349A CN 115794416 B CN115794416 B CN 115794416B
- Authority
- CN
- China
- Prior art keywords
- connection pool
- nacos
- data
- configuration
- data source
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Abstract
本发明提供一种基于Storm和Nacos的数据热切换方法和装置,其中方法包括:修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;若各个子节点监听到配置变化事件,则对相应的数据连接池进行数据连接切换。本发明解决了现有方案中Storm平台无法兼容Nacos的问题,实现了高效、安全、无感的数据热切换。
Description
技术领域
本发明涉及大数据处理技术领域,尤其涉及一种基于Storm和Nacos的数据热切换方法和装置。
背景技术
在项目上线运行以后,项目运维成了一个不小的挑战,其中就包括可能出现的数据库切换、缓存服务切换等数据切换的场景。在上述数据切换场景中,通常的解决方案首先需要将线上正在运行的相关项目在用户活动低峰期停下来,然后相关运维人员完成数据库切换、项目数据服务配置更新、重启相关服务、线上测试等一系列操作。然而,对线上的实时计算任务来说,由于需要启停整个集群,在数据切换过程中整个集群无法提供服务,因此整个数据切换过程的成本非常高,并且伴随有一定的风险。因此,为了解决生产环境实时计算集群应对数据服务(例如数据库服务、数据缓存服务)发生变更的问题,需要一种数据热切换方法,使得在不停止实时计算集群的情况下完成数据切换的过程,能够大大降低整个过程的复杂度和成本,提高数据切换的效率。
在现有的数据热切换方案中,部分工作采用了Nacos微服务配置管理平台进行数据服务配置并监听数据服务配置的变化,从而在数据服务配置发生变化时进行数据切换操作。然而,在目前的解决方案中,Nacos微服务配置管理平台均需要和Spring容器配合使用,即整个项目必须基于Spring容器开发。可惜的是,在大数据领域中无法使用Spring容器维护和管理实时计算集群,而大数据领域常用的计算框架Storm也无法直接兼容Nacos微服务配置管理平台且Storm平台本身也不具备数据热切换能力,因此现有的解决方案无法应用于大数据领域实现数据热切换。
发明内容
本发明提供一种基于Storm和Nacos的数据热切换方法和装置,用以解决现有技术中提供的数据热切换方案无法应用于大数据领域的缺陷。
本发明提供一种基于Storm和Nacos的数据热切换方法,包括:
修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;
所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;
若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
根据本发明提供的一种基于Storm和Nacos的数据热切换方法,所述各个子节点接收到所述更新依赖库后分别实例化连接池管理器和Nacos监听器,具体包括:
在Storm平台首次接收到数据连接请求并调用连接获取方法时,使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,得到Nacos监听器;
其中,所述各类型数据源对应的连接池管理类均继承自抽象连接池管理类,所述抽象连接池管理类中包含了构造方法,所述抽象连接池管理类的构造方法中调用了所述Nacos监听类的构造方法,使得所述Nacos监听类的实例先于所述连接池管理类的实例被创建;所述各类型数据源对应的连接池管理类的构造方法中加载了相应类型数据源的连接配置信息并创建了相应类型数据源的数据连接池。
根据本发明提供的一种基于Storm和Nacos的数据热切换方法,所述抽象连接池管理类的构造方法具体用于执行如下步骤:
判断所述Nacos监听器对应的全局变量当前是否为空;
若所述Nacos监听器对应的全局变量当前为空,则对当前执行线程添加线程锁,并再次判断所述Nacos监听器对应的全局变量当前是否为空;
若所述Nacos监听器对应的全局变量当前仍然为空,则调用所述Nacos监听类的构造方法创建所述Nacos监听类的实例,得到Nacos监听器,将所述Nacos监听器的对象地址赋值给所述Nacos监听器对应的全局变量,并删除当前执行线程的线程锁。
根据本发明提供的一种基于Storm和Nacos的数据热切换方法,所述使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,具体包括:
调用各类型数据源对应的连接池管理类经static关键字修饰的getInstance方法创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器;
其中,任一类型数据源对应的连接池管理类的getInstance方法中显式调用了所述任一类型数据源对应的连接池管理类的构造方法,使得在实际执行所述任一类型数据源对应的连接池管理类的构造方法之前自动调用所述抽象连接池管理类的构造方法,以创建所述Nacos监听类的实例。
根据本发明提供的一种基于Storm和Nacos的数据热切换方法,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
将所述配置变化事件中包含的配置修改信息转换为Java对象后存储到配置管理器中后,对所述配置修改信息对应的Java对象进行解析,确定所述配置修改信息中包含的数据源名称;
获取各类型数据源对应的配置管理类的类名,并对所述配置修改信息中包含的数据源名称与各类型数据源对应的配置管理类的类名进行匹配,得到所述配置修改信息匹配的实际数据源以及所述实际数据源的当前数据连接池;
基于所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法,对所述配置修改信息匹配的实际数据源的数据连接池进行数据连接切换,将所述实际数据源的当前数据连接池切换为基于所述配置修改信息中包含的连接配置信息创建的数据连接池;其中,所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法继承自所述抽象连接池管理类。
根据本发明提供的一种基于Storm和Nacos的数据热切换方法,所述抽象连接池管理类中包含均为抽象方法的配置加载方法、连接池创建方法和连接池释放方法,各类型数据源对应的连接池管理类中实现了所述抽象连接池管理类中的配置加载方法、连接池创建方法和连接池释放方法;
各类型数据源对应的连接池管理类中的配置加载方法用于从所述配置修改信息对应的Java对象中读取连接配置信息;各类型数据源对应的连接池管理类中的连接池创建方法用于基于所述连接配置信息创建新的数据连接池对象,将所述配置修改信息匹配的实际数据源的当前数据连接池存储至历史连接池对象,并重新指定所述配置修改信息匹配的实际数据源的当前数据连接池;各类型数据源对应的连接池管理类中的连接池释放方法用于释放所述配置修改信息匹配的实际数据源的历史连接池对象;所述数据连接配置更新方法依次调用了相应类的配置加载方法、连接池创建方法和连接池释放方法,且在所述配置加载方法、所述连接池创建方法和所述连接池释放方法的调用过程中全程捕获异常信息。
根据本发明提供的一种基于Storm和Nacos的数据热切换方法,所述修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径,具体包括:
将Nacos客户端依赖的Guava类库的原始根路径修改为目标根路径后,再将修改了根路径的Guava类库重新打包,得到更新依赖库;所述原始根路径与所述目标根路径不同;
获取Nacos客户端源码中的项目对象模型,重新指定所述项目对象模型引用的类库为所述更新依赖库,并将Nacos客户端代码中类库依赖的引用路径修改为所述更新依赖库的地址。
根据本发明提供的一种基于Storm和Nacos的数据热切换方法,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
确定所述各个子节点中的测试节点;
所述测试节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,并获取所述测试节点的数据切换结果;
若所述测试节点的数据切换结果均为成功,则基于剩余子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
本发明还提供一种基于Storm和Nacos的数据热切换装置,包括:
冲突解决单元,用于修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;
服务启动单元,用于所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;
数据连接切换单元,用于若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述基于Storm和Nacos的数据热切换方法。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述基于Storm和Nacos的数据热切换方法。
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述基于Storm和Nacos的数据热切换方法。
本发明提供的基于Storm和Nacos的数据热切换方法和装置,基于Storm平台实时计算集群应用场景,通过修改Nacos客户端依赖的Guava类库,得到更新依赖库,消除了更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于更新依赖库修改Nacos客户端依赖的类库的引用路径,使得Storm平台上的原生代码和Nacos提供的SDK可以各自建立与其对应的Guava依赖包之间的正确依赖关系,Storm平台中的集群节点得以正常开启Nacos的监听服务,解决了现有方案中Storm平台无法兼容Nacos的问题;随后,各个子节点分别实例化连接池管理器和Nacos监听器,以提供数据连接池管理服务和Nacos配置监听服务,当各个子节点基于各自的Nacos监听器监听到Nacos客户端的配置变化接口的配置变化事件时,基于各个子节点的连接池管理器根据配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,通过将发生变更的数据源的旧数据连接池切换为新数据连接池,当数据服务用户照常申请访问数据服务时,能够为其自动分配新数据连接池中的数据连接,从而自动访问变更之后的数据源的数据,而在数据连接池切换成功完成之前,发生变更的数据源的旧数据连接池仍然可以对外提供数据服务,实现了高效、安全、无感的数据热切换,填补了原生的Storm平台无法实现数据热切换的空白。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的基于Storm和Nacos的数据热切换方法的流程示意图;
图2是本发明提供的抽象连接池管理类的构造方法的执行流程示意图;
图3是本发明提供的数据连接切换方法的流程示意图;
图4是本发明提供的版本冲突消除方法的流程示意图;
图5是本发明提供的基于Storm和Nacos的数据热切换装置的结构示意图;
图6是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明提供的基于Storm和Nacos的数据热切换方法的流程示意图,该方法应用于Storm平台中,如图1所示,该方法包括:
步骤110,修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;
步骤120,所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;
步骤130,若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
具体地,本发明实施例中利用Storm平台维护实时计算集群以提供大数据领域下的数据管理服务,其中Storm平台为一种开源的流式计算框架。为了解决生产环境实时计算集群应对数据服务(例如数据库服务、数据缓存服务)发生变更的问题,采用Nacos微服务配置管理平台提供的配置管理功能对数据服务的配置信息进行管理,并采用Nacos提供的SDK(Software Development Kit,软件开发工具包)对配置信息的更新事件进行监听,以及时针对配置信息更新事件采取数据热切换处理。然而,目前的Nacos客户端的依赖包与Storm平台环境中的相应依赖包版本不一致,导致Nacos客户端以及监听服务无法启动。为了使Storm平台可以兼容Nacos的SDK,本发明实施例分别对Nacos客户端的源码以及Nacos客户端的依赖包源码进行了修改,以克服上述依赖包版本冲突的问题。
其中,可以获取Nacos客户端依赖的Guava类库的jar包,并对该Guava类库的jar包进行修改,消除该Guava类库与Storm平台依赖的Guava类库之间的版本冲突,得到更新依赖库。修改后得到的更新依赖库在Storm平台中能够与Storm平台本身依赖的Guava类库之间产生差异,使得Storm平台上的原生代码不会混淆Nacos客户端依赖的更新依赖库和Storm平台自身依赖的Guava类库。随后,基于上述更新依赖库修改Nacos客户端源码,将Nacos客户端源码中指定依赖的类库的引用路径修改为上述更新依赖库的地址,将Nacos客户端依赖的类库更新为上述更新依赖库。通过上述方式消除Nacos客户端的依赖包与Storm平台环境中的相应依赖包的版本冲突,Storm平台上的原生代码和Nacos提供的SDK可以各自建立与其对应的Guava依赖包之间的正确依赖关系,使得Storm平台中的集群节点可以正常开启Nacos的监听服务。
获得更新依赖库后,Storm平台的主节点将该更新依赖库分发至Storm平台的各个子节点中,以供各个子节点开启Nacos配置监听服务。其中,每个子节点中可以基于Nacos提供的SDK以及上述更新依赖库与Nacos客户端建立监听通道,监听Nacos客户端触发的配置变化。当提供某一种或某几种数据服务的数据源发生变更后,用户可以通过Nacos客户端的配置修改页面对上述数据服务的连接配置进行修改并向Nacos服务中心上传配置修改信息时,会生成相应的配置变化事件并被各个子节点捕获到。其中,配置修改信息中包含了发生变更的数据源的连接配置信息,该连接配置信息包括数据源发生变更后该数据源新的连接方式、数据源地址、数据源名称等信息。为了捕获Nacos客户端生成的配置变化事件,各个子节点接收到上述更新依赖库后会分别实例化连接池管理器和Nacos监听器。
其中,连接池管理器用于管理任一类型数据源的数据连接池。由于实时计算集群可能建立在多种类型的数据源基础上,当发生数据库变更或缓存服务变更等数据源变更时,每次变更涉及的数据源可能不同且单次变化涉及的数据源也可能有多种,因此为了适应上述数据源变更而进行数据热切换,每个Storm子节点上可以分别创建各个类型的数据源的数据连接池对应的连接池管理器,以在发生上述数据源变更时对相应数据源的数据连接池进行切换处理,从而使得变更后的数据源可以利用新的数据连接池对外提供数据服务。各个子节点上的Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口。其中,用户通过Nacos客户端的配置修改页面对数据服务配置进行修改并向Nacos服务中心上传配置修改信息时,配置修改信息会经由配置变化接口传递至Nacos服务中心,因此通过监听Nacos客户端的配置变化接口可以及时捕获到用户触发的数据服务配置修改行为。
若各个子节点基于各自的Nacos监听器监听到Nacos客户端的配置变化接口的配置变化事件,则基于各个子节点的连接池管理器根据配置变化事件中涉及的数据源(即发生变更的数据源)对相应的数据连接池进行数据连接切换。其中,当用户触发了数据服务配置修改行为时,Nacos监听器监听到的配置变化事件的事件描述信息中将记录用户通过Nacos客户端的配置修改页面对数据服务配置进行修改的配置修改信息。根据配置修改信息中涉及的数据源,利用各个子节点上对应上述数据源的连接池管理器对相应数据源的数据连接池进行数据连接切换,包括发生变更的数据源的数据连接配置信息的加载、发生变更的数据源的新数据连接池的创建以及旧数据连接池的销毁等。通过将发生变更的数据源的旧数据连接池切换为新数据连接池,当数据服务用户照常申请访问数据服务时,能够为其自动分配新数据连接池中的数据连接,从而自动访问变更之后的数据源的数据。而在数据连接池切换成功完成之前,发生变更的数据源的旧数据连接池仍然可以对外提供数据服务,大大容错配置异常等相关问题。可见,整个数据热切换过程无需暂停实时计算集群的服务,且数据服务用户对数据切换过程完全无感,实现了高效、安全、无感的数据热切换。
本发明实施例提供的方法,基于Storm平台实时计算集群应用场景,通过修改Nacos客户端依赖的Guava类库,得到更新依赖库,消除了更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于更新依赖库修改Nacos客户端依赖的类库的引用路径,使得Storm平台上的原生代码和Nacos提供的SDK可以各自建立与其对应的Guava依赖包之间的正确依赖关系,Storm平台中的集群节点得以正常开启Nacos的监听服务,解决了现有方案中Storm平台无法兼容Nacos的问题;随后,各个子节点分别实例化连接池管理器和Nacos监听器,以提供数据连接池管理服务和Nacos配置监听服务,当各个子节点基于各自的Nacos监听器监听到Nacos客户端的配置变化接口的配置变化事件时,基于各个子节点的连接池管理器根据配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,通过将发生变更的数据源的旧数据连接池切换为新数据连接池,当数据服务用户照常申请访问数据服务时,能够为其自动分配新数据连接池中的数据连接,从而自动访问变更之后的数据源的数据,而在数据连接池切换成功完成之前,发生变更的数据源的旧数据连接池仍然可以对外提供数据服务,实现了高效、安全、无感的数据热切换,填补了原生的Storm平台无法实现数据热切换的空白。
基于上述实施例,所述各个子节点接收到所述更新依赖库后分别实例化连接池管理器和Nacos监听器,具体包括:
在Storm平台首次接收到数据连接请求并调用连接获取方法时,使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,得到Nacos监听器;
其中,所述各类型数据源对应的连接池管理类均继承自抽象连接池管理类,所述抽象连接池管理类中包含了构造方法,所述抽象连接池管理类的构造方法中调用了所述Nacos监听类的构造方法,使得所述Nacos监听类的实例先于所述连接池管理类的实例被创建;所述各类型数据源对应的连接池管理类的构造方法中加载了相应类型数据源的连接配置信息并创建了相应类型数据源的数据连接池。
具体地,在Storm平台首次接收到数据连接请求并调用连接获取方法时,各个子节点会使用单例模式创建各类型数据源对应的连接池管理类的实例,得到各类型数据源对应的连接池管理器。其中,由于使用单例模式创建任一类数据源对应的连接池管理类的实例,因此在一个执行进程中仅能创建一个该类数据源对应的连接池管理器,从而确保大数据领域中多线程执行环境下数据连接池的安全。另外,在创建各类型数据源对应的连接池管理类的实例的过程中会创建Nacos监听类的实例,得到Nacos监听器,使得Nacos监听器先于各类型数据源对应的连接池管理器被创建出,确保Nacos监听器与各类型数据源对应的连接池管理器的先后启动关系,以避免Nacos配置监听服务滞后开启导致遗漏配置变化事件。其中,Nacos监听类可以基于Nacos提供的SDK获得,各类型数据源对应的连接池管理类为自研Java类,用于管理各类型数据源的数据连接池。
其中,为了实现上述Nacos监听类的实例化和连接池管理类的实例化,可以创建一个抽象类——抽象连接池管理类,所有类型数据源对应的连接池管理类均继承上述抽象连接池管理类,并实现了抽象连接池管理类中的抽象方法。此处,为了确保Nacos监听类的实例先于各类型数据源对应的连接池管理类的实例被创建,在抽象连接池管理类的构造方法中调用了Nacos监听类的构造方法。与此同时,在定义各类型数据源对应的连接池管理类时,除了继承抽象连接池管理类并实现该抽象类中的抽象方法(包括配置加载方法、连接池创建方法、连接池释放方法以及连接获取方法等),还定义了各类型数据源对应的连接池管理类自身的构造方法。在各类型数据源对应的连接池管理类自身的构造方法中,加载了相应类型数据源的连接配置信息并创建了相应类型数据源的数据连接池,作为该数据源初始的数据连接池以对外提供数据服务。可见,通过上述方式定义抽象连接池管理类和连接池管理类,在实例化各类型数据源对应的连接池管理类时,会首先自动调用其父类(即抽象连接池管理类)的构造方法,从而调用Nacos监听类的构造方法,创建出Nacos监听类的实例,再调用自身的构造方法创建相应类型数据源的连接池管理类的实例,实现了Nacos监听类的实例与各类型数据源对应的连接池管理类的实例的先后创建。
基于上述任一实施例,如图2所示,所述抽象连接池管理类的构造方法具体用于执行如下步骤:
步骤210,判断所述Nacos监听器对应的全局变量当前是否为空;
步骤220,若所述Nacos监听器对应的全局变量当前为空,则对当前执行线程添加线程锁,并再次判断所述Nacos监听器对应的全局变量当前是否为空;
步骤230,若所述Nacos监听器对应的全局变量当前仍然为空,则调用所述Nacos监听类的构造方法创建所述Nacos监听类的实例,得到Nacos监听器,将所述Nacos监听器的对象地址赋值给所述Nacos监听器对应的全局变量,并删除当前执行线程的线程锁。
具体地,由于各类型数据源对应的连接池管理类均继承了抽象连接池管理类,因此在创建各类型数据源对应的连接池管理类的实例时均会隐式调用其父类即抽象连接池管理类的构造方法。然而,为了确保多线程执行环境下的可控性,在一个子节点的一个执行进程中将只创建一个Nacos监听类实例,因此需要在任一子节点创建各类型数据源对应的连接池管理类的实例过程中仅调用一次Nacos监听类的构造方法,从而确保Nacos监听类实例的全局唯一性。对此,本发明实施例定义了一个Nacos监听器对应的全局变量,用于指向Nacos监听器在内存中的地址,当Nacos监听器未被创建时,该全局变量则为空。在此基础上,抽象连接池管理类的构造方法会首先判断Nacos监听器对应的上述全局变量当前是否为空。
若Nacos监听器对应的全局变量当前为空,表明子节点当前未创建Nacos监听器。此时,对当前执行线程(即当前执行抽象连接池管理类的构造方法的线程)添加线程锁,并再次判断Nacos监听器对应的全局变量当前是否为空。此处,之所以要对当前执行线程添加线程锁之后再次判断Nacos监听器对应的全局变量当前是否为空,是因为在多线程执行环境下,可能有多个执行线程分别执行各类型数据源对应的连接池管理类的构造方法,存在多个执行线程同时调用抽象连接池管理类的构造方法的可能性。当多个执行线程同时调用抽象连接池管理类的构造方法时,即使当前检测到Nacos监听器对应的全局变量为空,也可能在下一时刻某个执行线程就创建了Nacos监听器,若不对执行线程添加线程锁并再次判断Nacos监听器对应的全局变量当前是否为空,极有可能会重复创建Nacos监听器。因此,在对当前执行线程(即当前执行抽象连接池管理类的构造方法的线程)添加线程锁之后,再次判断Nacos监听器对应的全局变量当前是否为空,以确认其他执行线程是否也未创建Nacos监听器。
若判断Nacos监听器对应的全局变量当前仍然为空,则调用Nacos监听类的构造方法创建Nacos监听类的实例,得到Nacos监听器,并将Nacos监听器的对象地址赋值给Nacos监听器对应的全局变量,然后删除当前执行线程的线程锁。此处,由于上述Nacos监听类的构造方法的调用过程是在当前执行线程添加线程锁之后,因此只有当前执行线程能够执行Nacos监听类的构造方法而其他执行线程不能执行Nacos监听类的构造方法,从而确保了Nacos监听器在当前子节点中的全局唯一性。
基于上述任一实施例,所述使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,具体包括:
调用各类型数据源对应的连接池管理类经static关键字修饰的getInstance方法创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器;
其中,任一类型数据源对应的连接池管理类的getInstance方法中显式调用了所述任一类型数据源对应的连接池管理类的构造方法,使得在实际执行所述任一类型数据源对应的连接池管理类的构造方法之前自动调用所述抽象连接池管理类的构造方法,以创建所述Nacos监听类的实例。
具体地,当Storm平台首次接收到数据连接请求并调用连接获取方法时,调用各类型数据源对应的连接池管理类中经static关键字修饰的getInstance方法,以创建各类型数据源对应的连接池管理类的实例,得到各类型数据源对应的连接池管理器。其中,经static关键字修饰的getInstance方法中,调用了相应类型数据源对应的连接池管理类的构造方法。通过使用经static关键字修饰的getInstance方法创建实例,可以在单例模式下创建相应连接池管理类的全局唯一实例。其中,任一类型数据源对应的连接池管理类的getInstance方法中显式调用了该类型数据源对应的连接池管理类的构造方法,使得在实际执行该类型数据源对应的连接池管理类的构造方法之前自动调用其父类(即抽象连接池管理类)的构造方法,从而首先创建Nacos监听类的实例,再完成相应连接池管理类实例的创建。
基于上述任一实施例,如图3所示,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
步骤310,将所述配置变化事件中包含的配置修改信息转换为Java对象后存储到配置管理器中后,对所述配置修改信息对应的Java对象进行解析,确定所述配置修改信息中包含的数据源名称;
步骤320,获取各类型数据源对应的配置管理类的类名,并对所述配置修改信息中包含的数据源名称与各类型数据源对应的配置管理类的类名进行匹配,得到所述配置修改信息匹配的实际数据源以及所述实际数据源的当前数据连接池;
步骤330,基于所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法,对所述配置修改信息匹配的实际数据源的数据连接池进行数据连接切换,将所述实际数据源的当前数据连接池切换为基于所述配置修改信息中包含的连接配置信息创建的数据连接池;其中,所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法继承自所述抽象连接池管理类。
具体地,为了统一管理各个数据源的连接配置信息,每次监听到Nacos客户端的配置变化接口的配置变化事件时,可以将配置变化事件中包含的配置修改信息转换为Java对象后存储到配置管理器中进行统一管理,需要调用连接配置信息的服务都需要向该配置管理器进行申请调用。其中,可以利用BeanFactory将配置修改信息转换为JavaBean后进行管理。当子节点的连接池管理器需要根据配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换时,可以对配置修改信息对应的Java对象进行解析,确定配置修改信息中包含的数据源名称,该数据源名称中应当包含该数据源的类型信息,并获取各类型数据源对应的配置管理类的类名。其中,可以预先定义各类型数据源对应的配置管理类,且配置管理类的类名与相应数据源的类型相一致,各类型数据源对应的配置管理类中管理了相应数据源的数据源信息,包括该数据源对应的连接池管理器,以及该数据源的当前数据连接池的连接池信息,包括数据连接池的内存地址。随后,对配置修改信息中包含的数据源类型与各类型数据源对应的配置管理类的类名进行匹配,得到与该配置修改信息相匹配的配置管理类,获取该匹配的配置管理类的实例化对象,即可获取上述配置修改信息匹配的实际数据源以及该实际数据源的当前数据连接池。
获取与该配置修改信息相匹配的配置管理类的实例化对象中管理的连接池管理器,作为该配置修改信息匹配的实际数据源对应的连接池管理器,调用该连接池管理器中的数据连接配置更新方法,对配置修改信息匹配的实际数据源的数据连接池进行数据连接切换。其中,可以调用上述数据连接配置更新方法,加载配置修改信息中包含的连接配置信息,并基于该连接配置信息新建一个新的数据连接池,并在新的数据连接池创建成功后更新该配置修改信息相匹配的配置管理类的实例化对象,重新指定上述实际数据源的当前数据连接池为上述新创建的数据连接池,然后再销毁该实际数据源的旧数据连接池。此处,配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法直接继承自抽象连接池管理类,抽象连接池管理类中可以统一设置数据连接配置更新方法的执行逻辑,使得不同类型数据源对应的连接池管理器可以统一进行数据连接切换操作。
基于上述任一实施例,所述抽象连接池管理类中包含均为抽象方法的配置加载方法、连接池创建方法和连接池释放方法,各类型数据源对应的连接池管理类中实现了所述抽象连接池管理类中的配置加载方法、连接池创建方法和连接池释放方法;
各类型数据源对应的连接池管理类中的配置加载方法用于从所述配置修改信息对应的Java对象中读取连接配置信息;各类型数据源对应的连接池管理类中的连接池创建方法用于基于所述连接配置信息创建新的数据连接池对象,将所述配置修改信息匹配的实际数据源的当前数据连接池存储至历史连接池对象,并重新指定所述配置修改信息匹配的实际数据源的当前数据连接池;各类型数据源对应的连接池管理类中的连接池释放方法用于释放所述配置修改信息匹配的实际数据源的历史连接池对象;所述数据连接配置更新方法依次调用了相应类的配置加载方法、连接池创建方法和连接池释放方法,且在所述配置加载方法、所述连接池创建方法和所述连接池释放方法的调用过程中全程捕获异常信息。
具体地,抽象连接池管理类中包含均为抽象方法的配置加载方法、连接池创建方法、连接池释放方法和连接获取方法,以及为具体方法的数据连接配置更新方法,各类型数据源对应的连接池管理类中实现了抽象连接池管理类中的配置加载方法、连接池创建方法连接池释放方法和连接获取方法。其中,各类型数据源对应的连接池管理类中的配置加载方法用于从配置修改信息对应的Java对象中读取连接配置信息;各类型数据源对应的连接池管理类中的连接池创建方法用于基于上述连接配置信息创建新的数据连接池对象,并将配置修改信息匹配的实际数据源的当前数据连接池存储至历史连接池对象,然后重新指定配置修改信息匹配的实际数据源的当前数据连接池为上述新的数据连接池对象;各类型数据源对应的连接池管理类中的连接池释放方法用于释放配置修改信息匹配的实际数据源的历史连接池对象。
在进行数据连接切换时,数据连接配置更新方法依次调用了相应类的配置加载方法、连接池创建方法和连接池释放方法,且在配置加载方法、连接池创建方法和连接池释放方法的调用过程中全程捕获异常信息。一旦在配置加载方法、连接池创建方法和连接池释放方法的调用过程中捕获到异常信息,则可以进行异常处理,且由于及时捕获了异常信息且暂停了数据连接配置更新方法的执行流程,若新的数据连接池未被创建成功,则连接池释放方法也未被成功调用,上述配置修改信息匹配的实际数据源的当前数据连接池仍然指向旧的数据连接池,因此能够照常向外提供服务。
基于上述任一实施例,如图4所示,所述修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径,具体包括:
步骤410,将Nacos客户端依赖的Guava类库的原始根路径修改为目标根路径后,再将修改了根路径的Guava类库重新打包,得到更新依赖库;所述原始根路径与所述目标根路径不同;
步骤420,获取Nacos客户端源码中的项目对象模型,重新指定所述项目对象模型引用的类库为所述更新依赖库,并将Nacos客户端代码中类库依赖的引用路径修改为所述更新依赖库的地址。
具体地,由于目前的Nacos客户端依赖的Guava类库版本与Storm平台环境中依赖的Guava类库版本不一致,因此Nacos的SDK与Storm平台无法共用同一个Guava类库。为了消除该版本冲突,通常的做法是修改低版本的类库代码使其包含高版本类库中的特殊类和特殊方法,然后使Nacos客户端和Storm平台可以同时依赖上述修改后的低版本类库。然而上述代码修改方法工程量浩大且容易出错,为了更便捷高效地解决上述版本冲突问题,本发明实施例提供了一种轻量级的冲突解决方式,通过修改Nacos客户端依赖的Guava类库的根目录,将其根目录的原始根路径修改为与该原始根路径名称不同的目标根路径,实现Guava类库中类路径的调整。再将修改了根路径的Guava类库重新打包,得到更新依赖库。
随后,获取Nacos客户端源码中的项目对象模型,重新指定该项目对象模型引用的类库为上述更新依赖库,并将Nacos客户端代码中类库依赖的引用路径修改为上述更新依赖库的地址,使得Nacos客户端代码依赖上述更新依赖库。由于更新依赖库中的类路径已经被修改,因此Nacos客户端依赖的更新依赖库的类路径与Storm平台依赖的GUava类库的类路径不同,因此Storm平台上的原生代码和Nacos提供的SDK可以各自建立与其对应的Guava依赖包之间的正确依赖关系,从而消除了上述版本冲突问题。
基于上述任一实施例,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
确定所述各个子节点中的测试节点;
所述测试节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,并获取所述测试节点的数据切换结果;
若所述测试节点的数据切换结果均为成功,则基于剩余子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
具体地,为了确保整个集群的稳定性,在进行数据热切换时,可以首先选取一个或多个子节点作为测试节点,在该测试节点上首先进行上述数据热切换操作,实现灰度发布功能。各个测试节点的连接池管理器根据配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换后,获取测试节点的数据切换结果。其中,可以在测试节点数据连接切换完毕后,在预设时间段内执行数据服务测试,若该预设时间段内数据服务测试的结果表明该测试节点可以正常提供数据服务,则表明该测试节点的数据切换结果为成功。若所有测试节点的数据切换结果均为成功,再基于剩余子节点的连接池管理器根据配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,完成整个集群的数据热切换。
此处,在选择测试节点时,可以基于各个子节点中各类型数据源的连接池管理器统计该子节点在历史日期的当前时间段接收的数据服务请求数量,具体可以通过统计该子节点在历史日期的当前时间段内各连接池管理器的连接获取方法的调用次数来确定。通常情况下在进行灰度发布时,会优先选择接收服务请求较少的子节点进行版本更新、微服务更新等发布任务,将该思路应用于数据热切换场景下,则会优先选择接收的数据服务请求数量较少的子节点优先进行数据热切换处理。然而,与通常的灰度发布场景不同的是,在上述实施例提供的数据热切换方法中是利用新旧数据连接池的切换实现数据热切换,且在切换新旧数据连接池时,直至新的数据连接池创建成功并被成功指定给相应数据源之前,均由旧的数据连接池对外提供数据连接服务,因此服务可以不中断但在此期间内无法访问变更后的数据源的新数据。若优先选择接收的数据服务请求数量较少的子节点作为测试节点优先进行数据热切换处理,则需要较长时间确定测试节点的数据切换结果,而服务密集型的子节点需要等待较长时间才能进行数据热切换,且在此时间内无法使用变更后的数据源数据,导致数据的实时性和准确性受损。因此,本发明实施例选择接收的数据服务请求数量较多的子节点作为测试节点优先进行数据热切换处理,以兼顾热切换的集群稳定性和热切换效率。
下面对本发明提供的基于Storm和Nacos的数据热切换装置进行描述,下文描述的基于Storm和Nacos的数据热切换装置与上文描述的基于Storm和Nacos的数据热切换方法可相互对应参照。
基于上述任一实施例,图5是本发明提供的基于Storm和Nacos的数据热切换装置的结构示意图,如图5所示,该装置包括:冲突解决单元510、服务启动单元520和数据连接切换单元530。
其中,冲突解决单元510用于修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;
服务启动单元520用于所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;
数据连接切换单元530用于若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
本发明实施例提供的装置,基于Storm平台实时计算集群应用场景,通过修改Nacos客户端依赖的Guava类库,得到更新依赖库,消除了更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于更新依赖库修改Nacos客户端依赖的类库的引用路径,使得Storm平台上的原生代码和Nacos提供的SDK可以各自建立与其对应的Guava依赖包之间的正确依赖关系,Storm平台中的集群节点得以正常开启Nacos的监听服务,解决了现有方案中Storm平台无法兼容Nacos的问题;随后,各个子节点分别实例化连接池管理器和Nacos监听器,以提供数据连接池管理服务和Nacos配置监听服务,当各个子节点基于各自的Nacos监听器监听到Nacos客户端的配置变化接口的配置变化事件时,基于各个子节点的连接池管理器根据配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,通过将发生变更的数据源的旧数据连接池切换为新数据连接池,当数据服务用户照常申请访问数据服务时,能够为其自动分配新数据连接池中的数据连接,从而自动访问变更之后的数据源的数据,而在数据连接池切换成功完成之前,发生变更的数据源的旧数据连接池仍然可以对外提供数据服务,实现了高效、安全、无感的数据热切换,填补了原生的Storm平台无法实现数据热切换的空白。
基于上述任一实施例,所述各个子节点接收到所述更新依赖库后分别实例化连接池管理器和Nacos监听器,具体包括:
在Storm平台首次接收到数据连接请求并调用连接获取方法时,使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,得到Nacos监听器;
其中,所述各类型数据源对应的连接池管理类均继承自抽象连接池管理类,所述抽象连接池管理类中包含了构造方法,所述抽象连接池管理类的构造方法中调用了所述Nacos监听类的构造方法,使得所述Nacos监听类的实例先于所述连接池管理类的实例被创建;所述各类型数据源对应的连接池管理类的构造方法中加载了相应类型数据源的连接配置信息并创建了相应类型数据源的数据连接池。
基于上述任一实施例,所述抽象连接池管理类的构造方法具体用于执行如下步骤:
判断所述Nacos监听器对应的全局变量当前是否为空;
若所述Nacos监听器对应的全局变量当前为空,则对当前执行线程添加线程锁,并再次判断所述Nacos监听器对应的全局变量当前是否为空;
若所述Nacos监听器对应的全局变量当前仍然为空,则调用所述Nacos监听类的构造方法创建所述Nacos监听类的实例,得到Nacos监听器,将所述Nacos监听器的对象地址赋值给所述Nacos监听器对应的全局变量,并删除当前执行线程的线程锁。
基于上述任一实施例,所述使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,具体包括:
调用各类型数据源对应的连接池管理类经static关键字修饰的getInstance方法创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器;
其中,任一类型数据源对应的连接池管理类的getInstance方法中显式调用了所述任一类型数据源对应的连接池管理类的构造方法,使得在实际执行所述任一类型数据源对应的连接池管理类的构造方法之前自动调用所述抽象连接池管理类的构造方法,以创建所述Nacos监听类的实例。
基于上述任一实施例,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
将所述配置变化事件中包含的配置修改信息转换为Java对象后存储到配置管理器中后,对所述配置修改信息对应的Java对象进行解析,确定所述配置修改信息中包含的数据源名称;
获取各类型数据源对应的配置管理类的类名,并对所述配置修改信息中包含的数据源名称与各类型数据源对应的配置管理类的类名进行匹配,得到所述配置修改信息匹配的实际数据源以及所述实际数据源的当前数据连接池;
基于所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法,对所述配置修改信息匹配的实际数据源的数据连接池进行数据连接切换,将所述实际数据源的当前数据连接池切换为基于所述配置修改信息中包含的连接配置信息创建的数据连接池;其中,所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法继承自所述抽象连接池管理类。
基于上述任一实施例,所述抽象连接池管理类中包含均为抽象方法的配置加载方法、连接池创建方法和连接池释放方法,各类型数据源对应的连接池管理类中实现了所述抽象连接池管理类中的配置加载方法、连接池创建方法和连接池释放方法;
各类型数据源对应的连接池管理类中的配置加载方法用于从所述配置修改信息对应的Java对象中读取连接配置信息;各类型数据源对应的连接池管理类中的连接池创建方法用于基于所述连接配置信息创建新的数据连接池对象,将所述配置修改信息匹配的实际数据源的当前数据连接池存储至历史连接池对象,并重新指定所述配置修改信息匹配的实际数据源的当前数据连接池;各类型数据源对应的连接池管理类中的连接池释放方法用于释放所述配置修改信息匹配的实际数据源的历史连接池对象;所述数据连接配置更新方法依次调用了相应类的配置加载方法、连接池创建方法和连接池释放方法,且在所述配置加载方法、所述连接池创建方法和所述连接池释放方法的调用过程中全程捕获异常信息。
基于上述任一实施例,所述修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径,具体包括:
将Nacos客户端依赖的Guava类库的原始根路径修改为目标根路径后,再将修改了根路径的Guava类库重新打包,得到更新依赖库;所述原始根路径与所述目标根路径不同;
获取Nacos客户端源码中的项目对象模型,重新指定所述项目对象模型引用的类库为所述更新依赖库,并将Nacos客户端代码中类库依赖的引用路径修改为所述更新依赖库的地址。
基于上述任一实施例,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
确定所述各个子节点中的测试节点;
所述测试节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,并获取所述测试节点的数据切换结果;
若所述测试节点的数据切换结果均为成功,则基于剩余子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
图6是本发明提供的电子设备的结构示意图,如图6所示,该电子设备可以包括:处理器(processor)610、存储器(memory)620、通信接口(CommunicationsInterface)630和通信总线640,其中,处理器610,存储器620,通信接口630通过通信总线640完成相互间的通信。处理器610可以调用存储器620中的逻辑指令,以执行基于Storm和Nacos的数据热切换方法,该方法包括:修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
此外,上述的存储器620中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的基于Storm和Nacos的数据热切换方法,该方法包括:修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的基于Storm和Nacos的数据热切换方法,该方法包括:修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (10)
1.一种基于Storm和Nacos的数据热切换方法,应用于Storm平台中,其特征在于,包括:
修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;
所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;
若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
2.根据权利要求1所述的基于Storm和Nacos的数据热切换方法,其特征在于,所述各个子节点接收到所述更新依赖库后分别实例化连接池管理器和Nacos监听器,具体包括:
在Storm平台首次接收到数据连接请求并调用连接获取方法时,使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,得到Nacos监听器;
其中,所述各类型数据源对应的连接池管理类均继承自抽象连接池管理类,所述抽象连接池管理类中包含了构造方法,所述抽象连接池管理类的构造方法中调用了所述Nacos监听类的构造方法,使得所述Nacos监听类的实例先于所述连接池管理类的实例被创建;所述各类型数据源对应的连接池管理类的构造方法中加载了相应类型数据源的连接配置信息并创建了相应类型数据源的数据连接池。
3.根据权利要求2所述的基于Storm和Nacos的数据热切换方法,其特征在于,所述抽象连接池管理类的构造方法具体用于执行如下步骤:
判断所述Nacos监听器对应的全局变量当前是否为空;
若所述Nacos监听器对应的全局变量当前为空,则对当前执行线程添加线程锁,并再次判断所述Nacos监听器对应的全局变量当前是否为空;
若所述Nacos监听器对应的全局变量当前仍然为空,则调用所述Nacos监听类的构造方法创建所述Nacos监听类的实例,得到Nacos监听器,将所述Nacos监听器的对象地址赋值给所述Nacos监听器对应的全局变量,并删除当前执行线程的线程锁。
4.根据权利要求3所述的基于Storm和Nacos的数据热切换方法,其特征在于,所述使用单例模式创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器,并在创建各类型数据源对应的连接池管理类的实例的过程中创建Nacos监听类的实例,具体包括:
调用各类型数据源对应的连接池管理类经static关键字修饰的getInstance方法创建各类型数据源对应的连接池管理类的实例,得到所述各类型数据源对应的连接池管理器;
其中,任一类型数据源对应的连接池管理类的getInstance方法中显式调用了所述任一类型数据源对应的连接池管理类的构造方法,使得在实际执行所述任一类型数据源对应的连接池管理类的构造方法之前自动调用所述抽象连接池管理类的构造方法,以创建所述Nacos监听类的实例。
5.根据权利要求2所述的基于Storm和Nacos的数据热切换方法,其特征在于,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
将所述配置变化事件中包含的配置修改信息转换为Java对象后存储到配置管理器中后,对所述配置修改信息对应的Java对象进行解析,确定所述配置修改信息中包含的数据源名称;
获取各类型数据源对应的配置管理类的类名,并对所述配置修改信息中包含的数据源名称与各类型数据源对应的配置管理类的类名进行匹配,得到所述配置修改信息匹配的实际数据源以及所述实际数据源的当前数据连接池;
基于所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法,对所述配置修改信息匹配的实际数据源的数据连接池进行数据连接切换,将所述实际数据源的当前数据连接池切换为基于所述配置修改信息中包含的连接配置信息创建的数据连接池;其中,所述配置修改信息匹配的实际数据源对应的连接池管理器的数据连接配置更新方法继承自所述抽象连接池管理类。
6.根据权利要求5所述的基于Storm和Nacos的数据热切换方法,其特征在于,所述抽象连接池管理类中包含均为抽象方法的配置加载方法、连接池创建方法和连接池释放方法,各类型数据源对应的连接池管理类中实现了所述抽象连接池管理类中的配置加载方法、连接池创建方法和连接池释放方法;
各类型数据源对应的连接池管理类中的配置加载方法用于从所述配置修改信息对应的Java对象中读取连接配置信息;各类型数据源对应的连接池管理类中的连接池创建方法用于基于所述连接配置信息创建新的数据连接池对象,将所述配置修改信息匹配的实际数据源的当前数据连接池存储至历史连接池对象,并重新指定所述配置修改信息匹配的实际数据源的当前数据连接池;各类型数据源对应的连接池管理类中的连接池释放方法用于释放所述配置修改信息匹配的实际数据源的历史连接池对象;所述数据连接配置更新方法依次调用了相应类的配置加载方法、连接池创建方法和连接池释放方法,且在所述配置加载方法、所述连接池创建方法和所述连接池释放方法的调用过程中全程捕获异常信息。
7.根据权利要求1所述的基于Storm和Nacos的数据热切换方法,其特征在于,所述修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径,具体包括:
将Nacos客户端依赖的Guava类库的原始根路径修改为目标根路径后,再将修改了根路径的Guava类库重新打包,得到更新依赖库;所述原始根路径与所述目标根路径不同;
获取Nacos客户端源码中的项目对象模型,重新指定所述项目对象模型引用的类库为所述更新依赖库,并将Nacos客户端代码中类库依赖的引用路径修改为所述更新依赖库的地址。
8.根据权利要求1所述的基于Storm和Nacos的数据热切换方法,其特征在于,所述基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,具体包括:
确定所述各个子节点中的测试节点;
所述测试节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换,并获取所述测试节点的数据切换结果;
若所述测试节点的数据切换结果均为成功,则基于剩余子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
9.一种基于Storm和Nacos的数据热切换装置,应用于Storm平台中,其特征在于,包括:
冲突解决单元,用于修改Nacos客户端依赖的Guava类库,得到更新依赖库,以消除所述更新依赖库与Storm平台依赖的Guava类库之间的版本冲突,并基于所述更新依赖库修改Nacos客户端依赖的类库的引用路径;
服务启动单元,用于所述Storm平台的主节点将所述更新依赖库分发至所述Storm平台的各个子节点,以供所述各个子节点开启Nacos配置监听服务;各个子节点接收到所述更新依赖库后分别实例化得到连接池管理器和Nacos监听器;其中,所述连接池管理器用于管理任一类型数据源的数据连接池,所述Nacos监听器用于提供Nacos配置监听服务,监听Nacos客户端的配置变化接口;
数据连接切换单元,用于若各个子节点基于各自的Nacos监听器监听到所述Nacos客户端的配置变化接口的配置变化事件,则基于所述各个子节点的连接池管理器根据所述配置变化事件中涉及的数据源对相应的数据连接池进行数据连接切换。
10.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至8任一项所述基于Storm和Nacos的数据热切换方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310051349.7A CN115794416B (zh) | 2023-02-02 | 2023-02-02 | 基于Storm和Nacos的数据热切换方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310051349.7A CN115794416B (zh) | 2023-02-02 | 2023-02-02 | 基于Storm和Nacos的数据热切换方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115794416A CN115794416A (zh) | 2023-03-14 |
CN115794416B true CN115794416B (zh) | 2023-04-07 |
Family
ID=85429517
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310051349.7A Active CN115794416B (zh) | 2023-02-02 | 2023-02-02 | 基于Storm和Nacos的数据热切换方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115794416B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107688555A (zh) * | 2017-08-24 | 2018-02-13 | 无锡清华信息科学与技术国家实验室物联网技术中心 | 一种函数托管计算中依赖服务的通用提供方法 |
CN110569144A (zh) * | 2019-08-09 | 2019-12-13 | 苏宁金融科技(南京)有限公司 | 基于storm流式计算的数据处理方法和数据处理系统 |
CN110968340A (zh) * | 2018-09-29 | 2020-04-07 | 京东数字科技控股有限公司 | 一种实现多版本依赖隔离的方法和装置 |
CN114942933A (zh) * | 2022-04-14 | 2022-08-26 | 中国银行股份有限公司 | 一种自动更新数据库的方法及相关装置 |
CN115328987A (zh) * | 2022-08-16 | 2022-11-11 | 平安付科技服务有限公司 | 数据库切换方法、装置、计算机设备及存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11290536B2 (en) * | 2019-11-19 | 2022-03-29 | International Business Machines Corporation | Updating automated communication replies based on detected situations |
-
2023
- 2023-02-02 CN CN202310051349.7A patent/CN115794416B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107688555A (zh) * | 2017-08-24 | 2018-02-13 | 无锡清华信息科学与技术国家实验室物联网技术中心 | 一种函数托管计算中依赖服务的通用提供方法 |
CN110968340A (zh) * | 2018-09-29 | 2020-04-07 | 京东数字科技控股有限公司 | 一种实现多版本依赖隔离的方法和装置 |
CN110569144A (zh) * | 2019-08-09 | 2019-12-13 | 苏宁金融科技(南京)有限公司 | 基于storm流式计算的数据处理方法和数据处理系统 |
CN114942933A (zh) * | 2022-04-14 | 2022-08-26 | 中国银行股份有限公司 | 一种自动更新数据库的方法及相关装置 |
CN115328987A (zh) * | 2022-08-16 | 2022-11-11 | 平安付科技服务有限公司 | 数据库切换方法、装置、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115794416A (zh) | 2023-03-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9317338B2 (en) | Method and system for modeling and analyzing computing resource requirements of software applications in a shared and distributed computing environment | |
CN107844343B (zh) | 一种复杂服务端应用系统的升级系统及方法 | |
US9003389B2 (en) | Generating an encoded package profile based on executing host processes | |
CN112416581B (zh) | 定时任务的分布式调用系统 | |
US11550615B2 (en) | Kubernetes resource policy enforcement | |
US20050268136A1 (en) | Timeout manager | |
US20110214111A1 (en) | Systems and methods for detecting computing processes requiring reinitialization after a software package update | |
CN113037794B (zh) | 计算资源配置调度方法、装置及系统 | |
US9342369B2 (en) | System and method for increasing throughput of a PaaS system | |
CN113569987A (zh) | 模型训练方法和装置 | |
CN110532025B (zh) | 基于微服务架构的数据处理方法、装置、设备及存储介质 | |
US20150261570A1 (en) | Managing metadata for a distributed processing system | |
US8224933B2 (en) | Method and apparatus for case-based service composition | |
CN111190732A (zh) | 定时任务处理系统及方法、存储介质和电子设备 | |
Dhakate et al. | Distributed cloud monitoring using Docker as next generation container virtualization technology | |
CN112925648B (zh) | 业务策略的发布方法和装置 | |
CN114006815B (zh) | 云平台节点的自动化部署方法、装置、节点及存储介质 | |
CN115794416B (zh) | 基于Storm和Nacos的数据热切换方法和装置 | |
CN113342499B (zh) | 分布式任务调用方法、装置、设备、存储介质、程序产品 | |
CN115373886A (zh) | 服务群组容器停机方法、装置、计算机设备和存储介质 | |
CN115729590A (zh) | 服务部署方法、装置、设备和计算机可读存储介质 | |
CN111176959B (zh) | 跨域的应用服务器的预警方法、系统及存储介质 | |
CN112148420B (zh) | 基于容器技术的异常任务处理方法、服务器及云平台 | |
US9753789B2 (en) | Distributed system for scheduling action requests | |
CN112422308A (zh) | 一种实现运维监控的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |