本發(fā)明涉及計(jì)算機(jī)科學(xué),特別是基于多租戶應(yīng)用場景下的spring應(yīng)用設(shè)計(jì),尤其涉及一種基于spring父子容器熱加載多租戶的class方法及裝置。
背景技術(shù):
1、spring是一個(gè)開源框架,用于簡化企業(yè)級(jí)java應(yīng)用開發(fā)。它提供了數(shù)據(jù)訪問、web支持、消息傳遞等功能,并與多種技術(shù)棧和框架集成。spring的出現(xiàn)提高了開發(fā)效率、同時(shí)降低了維護(hù)成本,是構(gòu)建高質(zhì)量應(yīng)用程序的理想選擇。
2、但是,spring不具備熱加載能力,所謂熱加載是指在應(yīng)用程序運(yùn)行時(shí),能夠動(dòng)態(tài)地加載和更新代碼或配置,而無需重啟整個(gè)應(yīng)用。以此來達(dá)到每次更新時(shí)只需替換或加載新的代碼或配置,無需進(jìn)行繁瑣的打包和重啟操作,從而顯著提高上線速度。為此,spring-boot-devtools模塊就提供了自動(dòng)應(yīng)用代碼更改的能力,能夠在代碼發(fā)生更改時(shí)自動(dòng)重新加載應(yīng)用,而無需手動(dòng)重啟。此外,還有一些第三方的熱加載解決方案,也可以與spring框架集成使用。但是這些解決方案都存在一定的局限性,spring-boot-devtools模塊的引入會(huì)帶來額外的復(fù)雜性,并且需要確保熱加載過程中數(shù)據(jù)的一致性和安全性,另外一些第三方的熱加載解決方案的引入會(huì)降低部署速度。
3、因此,如何提供一種簡單有效的技術(shù)方案能夠在不重啟服務(wù)器的前提下,動(dòng)態(tài)更新應(yīng)用邏輯,提高應(yīng)用的更新部署速度是亟待解決的技術(shù)問題。
技術(shù)實(shí)現(xiàn)思路
1、為此,本技術(shù)提供一種技術(shù)方案用以解決上述所述的現(xiàn)有技術(shù)問題,實(shí)現(xiàn)在不重啟服務(wù)器的前提下,動(dòng)態(tài)更新應(yīng)用邏輯,提高應(yīng)用的更新部署速度。本發(fā)明提供一種基于spring父子容器熱加載多租戶的class方法及裝置用以解決上述所述的技術(shù)問題。
2、為實(shí)現(xiàn)上述目的,第一方面,本發(fā)明提供一種基于spring父子容器熱加載多租戶的class方法,包括:
3、初始化spring父容器,加載應(yīng)用的通用邏輯class。
4、為所述應(yīng)用設(shè)置配置源用以存儲(chǔ)租戶信息,所述信息用于在所述應(yīng)用運(yùn)行時(shí)創(chuàng)建和配置租戶特定的子容器。
5、將每個(gè)租戶的個(gè)性化邏輯打包成獨(dú)立的jar文件,所述獨(dú)立的jar文件獨(dú)立于所述通用邏輯單獨(dú)進(jìn)行更新及部署。
6、為所述每個(gè)租戶分配一個(gè)獨(dú)立的類加載器,所述類加載器用于加載所述每個(gè)租戶特定的jar文件。
7、為所述每個(gè)租戶創(chuàng)建一個(gè)spring子容器,通過與其對(duì)應(yīng)的所述類加載器來加載和初始化所述每個(gè)租戶特定的bean。
8、自定義tenantscope注解,所述tenantscope注解用于標(biāo)識(shí)需要根據(jù)所述租戶來區(qū)分實(shí)例的bean。
9、當(dāng)處理業(yè)務(wù)請(qǐng)求時(shí),通過面向切面編程或其他機(jī)制攔截請(qǐng)求,根據(jù)所述租戶信息將tenantscope注解的bean請(qǐng)求路由到相應(yīng)的租戶子容器中。
10、當(dāng)新的子容器創(chuàng)建并初始化完成,將業(yè)務(wù)請(qǐng)求路由到所述新的子容器,并關(guān)閉舊的子容器,同時(shí)釋放相關(guān)資源。
11、進(jìn)一步地,當(dāng)所述租戶首次訪問應(yīng)用時(shí),或當(dāng)所述租戶的jar文件更新時(shí),spring父容器根據(jù)所述租戶信息動(dòng)態(tài)地創(chuàng)建一個(gè)新的子容器,所述每個(gè)新的子容器將繼承所述父容器的通用bean定義,同時(shí)也有自己特定的bean配置。
12、進(jìn)一步地,所述在所述tenantscope注解用于標(biāo)識(shí)需要根據(jù)所述租戶來區(qū)分實(shí)例的bean還包括:所述tenantscope注解用于擴(kuò)展spring的scope功能,當(dāng)獲取這些bean時(shí),根據(jù)當(dāng)前租戶的信息來返回正確的實(shí)例;對(duì)于有tenantscope注解的bean,當(dāng)獲取bean時(shí),根據(jù)租戶編號(hào)從所述租戶子容器中獲取所述租戶個(gè)性化的bean。
13、進(jìn)一步地,當(dāng)所述租戶的個(gè)性化jar更新時(shí),所述spring父容器動(dòng)態(tài)地創(chuàng)建一個(gè)新的子容器,通過使用新的類加載器加載更新后的jar文件,所述過程在不中斷其他租戶服務(wù)的情況下進(jìn)行。
14、第二方面,本發(fā)明還提供了一種基于spring父子容器熱加載多租戶的class裝置,所述裝置包括:初始化單元、第一配置單元、第二配置單元、第三配置單元、第四配置單元、自定義單元。
15、初始化單元:用于初始化spring父容器,加載應(yīng)用的通用邏輯class。
16、第一配置單元:用于為所述應(yīng)用設(shè)置配置源用以存儲(chǔ)租戶信息,所述信息用于在所述應(yīng)用運(yùn)行時(shí)創(chuàng)建和配置租戶特定的子容器。
17、第二配置單元:用于將每個(gè)租戶的個(gè)性化邏輯打包成獨(dú)立的jar文件,所述獨(dú)立的jar文件獨(dú)立于所述通用邏輯單獨(dú)進(jìn)行更新及部署。
18、第三配置單元:用于為所述每個(gè)租戶分配一個(gè)獨(dú)立的類加載器,所述類加載器用于加載所述每個(gè)租戶特定的jar文件。
19、第四配置單元:用于為所述每個(gè)租戶創(chuàng)建一個(gè)spring子容器,通過與其對(duì)應(yīng)的所述類加載器來加載和初始化所述每個(gè)租戶特定的bean。
20、自定義單元:用于自定義tenantscope注解,所述tenantscope注解用于標(biāo)識(shí)需要根據(jù)所述租戶來區(qū)分實(shí)例的bean。
21、當(dāng)處理業(yè)務(wù)請(qǐng)求時(shí),通過面向切面編程或其他機(jī)制攔截請(qǐng)求,根據(jù)所述租戶信息將tenantscope注解的bean請(qǐng)求路由到相應(yīng)的租戶子容器中。
22、當(dāng)新的子容器創(chuàng)建并初始化完成,將業(yè)務(wù)請(qǐng)求路由到所述新的子容器,并關(guān)閉舊的子容器,同時(shí)釋放相關(guān)資源。
23、進(jìn)一步地,當(dāng)所述租戶首次訪問應(yīng)用時(shí),或當(dāng)所述租戶的jar文件更新時(shí),spring父容器根據(jù)所述租戶信息動(dòng)態(tài)地創(chuàng)建一個(gè)新的子容器,所述每個(gè)新的子容器將繼承所述父容器的通用bean定義,同時(shí)也有自己特定的bean配置。
24、進(jìn)一步地,所述在所述tenantscope注解用于標(biāo)識(shí)需要根據(jù)所述租戶來區(qū)分實(shí)例的bean還包括:所述tenantscope注解用于擴(kuò)展spring的scope功能,當(dāng)獲取這些bean時(shí),根據(jù)當(dāng)前租戶的信息來返回正確的實(shí)例;對(duì)于有tenantscope注解的bean,當(dāng)獲取bean時(shí),根據(jù)租戶編號(hào)從所述租戶子容器中獲取所述租戶個(gè)性化的bean。
25、進(jìn)一步地,當(dāng)所述租戶的個(gè)性化jar更新時(shí),所述spring父容器動(dòng)態(tài)地創(chuàng)建一個(gè)新的子容器,通過使用新的類加載器加載更新后的jar文件,所述過程在不中斷其他租戶服務(wù)的情況下進(jìn)行。
26、第三方面,本發(fā)明提供了一種計(jì)算設(shè)備,包括:
27、存儲(chǔ)器,用于存儲(chǔ)程序指令;
28、處理器,用于調(diào)用所述存儲(chǔ)器中存儲(chǔ)的程序指令,按照獲得的程序指令執(zhí)行上述所述的一種基于spring父子容器熱加載多租戶的class方法。
29、第四方面,本發(fā)明提供一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),包括,計(jì)算機(jī)可讀指令,當(dāng)計(jì)算機(jī)讀取并執(zhí)行所述計(jì)算機(jī)可讀指令時(shí),實(shí)現(xiàn)上述所述的一種基于spring父子容器熱加載多租戶的class方法,所述可讀介質(zhì)可以為多個(gè),所述多個(gè)可讀介質(zhì)相互之間能夠獨(dú)立運(yùn)行。
30、與現(xiàn)有技術(shù)相比,本方案通過為應(yīng)用設(shè)置配置源存儲(chǔ)租戶信息,并在應(yīng)用運(yùn)行時(shí)創(chuàng)建和配置租戶特定的子容器;將每個(gè)租戶的個(gè)性化邏輯打包成獨(dú)立的jar文件,獨(dú)立于通用邏輯單獨(dú)進(jìn)行更新及部署;為每個(gè)租戶分配一個(gè)獨(dú)立的類加載器,用于加載每個(gè)租戶特定的jar文件;為每個(gè)租戶創(chuàng)建一個(gè)spring子容器,與其對(duì)應(yīng)的類加載器來加載和初始化每個(gè)租戶特定的bean;自定義tenantscope注解,標(biāo)識(shí)需要根據(jù)租戶來區(qū)分實(shí)例的bean;當(dāng)處理業(yè)務(wù)請(qǐng)求時(shí),被注解的bean自動(dòng)路由到租戶的spring子容器中獲取bean;當(dāng)租戶的個(gè)性化jar升級(jí)更新時(shí),spring父容器為租戶創(chuàng)建一個(gè)的新的spring子容器,加載新jar中的class,并關(guān)閉舊的子容器,同時(shí)釋放相關(guān)資源。通過本技術(shù)方案實(shí)現(xiàn)在不重啟服務(wù)器的前提下,動(dòng)態(tài)更新應(yīng)用邏輯,提高應(yīng)用的更新上線速度,節(jié)省研發(fā)及運(yùn)維時(shí)間。