您好,登錄后才能下訂單哦!
這篇文章主要講解了“Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)”吧!
Ignite集群層
持久化存儲層
外部應(yīng)用層
本文中會關(guān)注第一層(Ignite集群層),可以參考一個(gè)GitHub項(xiàng)目,他包含了日常中實(shí)現(xiàn)擬議的微服務(wù)架構(gòu)所必須的構(gòu)建塊,尤其是要覆蓋如下部分:
配置和啟動(dòng)數(shù)據(jù)節(jié)點(diǎn);
使用Ignite的服務(wù)API的典型服務(wù)實(shí)現(xiàn);
配置和啟動(dòng)駐有Ignite服務(wù)的服務(wù)節(jié)點(diǎn);
一個(gè)連接到集群并且觸發(fā)服務(wù)執(zhí)行的虛擬應(yīng)用。
數(shù)據(jù)節(jié)點(diǎn)是持有數(shù)據(jù)集一部分?jǐn)?shù)據(jù)的服務(wù)端節(jié)點(diǎn),應(yīng)用邏輯端會在這個(gè)數(shù)據(jù)集上執(zhí)行查詢和計(jì)算。通常來說,這種類型的節(jié)點(diǎn)對應(yīng)用邏輯是透明的,因?yàn)檫@些節(jié)點(diǎn)只是簡單地存儲數(shù)據(jù)集,然后當(dāng)應(yīng)用訪問數(shù)據(jù)時(shí)高效地進(jìn)行處理就可以了。
可以下載這個(gè)GitHub項(xiàng)目然后找到 data-node-config.xml,它會用于創(chuàng)建一個(gè)新的數(shù)據(jù)節(jié)點(diǎn),這個(gè)配置包含了一組與數(shù)據(jù)節(jié)點(diǎn)有關(guān)的段落和參數(shù)。
首先,需要為每一個(gè)要部署到集群中的Ignite緩存配置一個(gè)特定的節(jié)點(diǎn)過濾器。這個(gè)過濾器會在緩存啟動(dòng)時(shí)被調(diào)用,它會定義一個(gè)要存儲緩存數(shù)據(jù)的集群節(jié)點(diǎn)的子集--數(shù)據(jù)節(jié)點(diǎn)。同樣的過濾器在網(wǎng)絡(luò)拓?fù)浒l(fā)生變化時(shí)也會被調(diào)用,比如新節(jié)點(diǎn)加入集群或者舊節(jié)點(diǎn)離開集群。過濾器的實(shí)現(xiàn)需要加入每個(gè)節(jié)點(diǎn)的類路徑中,不管該節(jié)點(diǎn)是否會成為數(shù)據(jù)節(jié)點(diǎn)。
<bean class="org.apache.ignite.configuration.CacheConfiguration"> ... <property name="nodeFilter"> <bean class="common.filters.DataNodeFilter"/> </property> </bean>
第二,實(shí)現(xiàn)過濾器,在本例中,使用了一個(gè)非常明確的實(shí)現(xiàn),DataNodeFilter,它通過檢查data.node參數(shù)來確定一個(gè)節(jié)點(diǎn)是否會被視為數(shù)據(jù)節(jié)點(diǎn)。如果一個(gè)節(jié)點(diǎn)在屬性映射中配置了這個(gè)參數(shù),那么他會成為一個(gè)數(shù)據(jù)節(jié)點(diǎn)然后數(shù)據(jù)會駐留于此,否則該節(jié)點(diǎn)會被忽略。
public boolean apply(ClusterNode node) { Boolean dataNode = node.attribute("data.node"); return dataNode != null && dataNode; }
第三,data-node-config.xml為每個(gè)使用這個(gè)配置啟動(dòng)的節(jié)點(diǎn)的屬性映射添加了data.node屬性,就像下面這樣:
<property name="userAttributes"> <map key-type="java.lang.String" value-type="java.lang.Boolean"> <entry key="data.node" value="true"/> </map> </property>
最后,通過使用示例中的DataNodeStartup文件,或者將data-node-config.xml傳遞給Ignite的ignite.sh/bat腳本來啟動(dòng)一個(gè)數(shù)據(jù)節(jié)點(diǎn)的實(shí)例。如果選擇了后者,那么一定要將java/app/common目錄中的所有類文件構(gòu)建成一個(gè)jar包,然后還要將這個(gè)jar文件加入到每個(gè)數(shù)據(jù)節(jié)點(diǎn)的類路徑中。
在實(shí)現(xiàn)層次上服務(wù)節(jié)點(diǎn)的定義與前述數(shù)據(jù)節(jié)點(diǎn)的用法沒有什么大的不同?;旧?,需要建立一個(gè)方式,即指定一個(gè)特定的微服務(wù)將要部署在哪些節(jié)點(diǎn)上,它們會是整個(gè)集群的一個(gè)子集。
最初,需要使用服務(wù)網(wǎng)格API實(shí)現(xiàn)一個(gè)微服務(wù),為后文起見,可以回顧一下那個(gè)GitHub示例中的已有服務(wù)實(shí)現(xiàn),即Maintenance Service。
這個(gè)服務(wù)可以調(diào)度一個(gè)車輛維護(hù)的服務(wù),并且可以查看已做保養(yǎng)的清單,它實(shí)現(xiàn)了所有服務(wù)網(wǎng)格的必要方法,包括init(...),execute(...)以及cancel(...),并且在這個(gè)接口中增加了新的方法:
public interface MaintenanceService extends Service { public Date scheduleVehicleMaintenance(int vehicleId); public List<Maintenance> getMaintenanceRecords(int vehicleId); }
將這個(gè)維護(hù)服務(wù)配置并且部署到特定的Ignite節(jié)點(diǎn)(服務(wù)節(jié)點(diǎn))上有幾種方式。在本例中,通過maintenance-service-node-config.xml啟動(dòng)的每個(gè)節(jié)點(diǎn),都可以考慮進(jìn)行維護(hù)服務(wù)的部署,下面可以看一下配置。
首先,確保維護(hù)服務(wù)的實(shí)例只會被部署到指定了節(jié)點(diǎn)過濾器的節(jié)點(diǎn)上:
<bean class="org.apache.ignite.services.ServiceConfiguration"> <property name="nodeFilter"> <bean class="common.filters.MaintenanceServiceFilter"/> </property> </bean>
第二,維護(hù)服務(wù)使用的過濾器,只會被部署到在屬性映射中配置了maintenance.service.node的節(jié)點(diǎn)上:
public boolean apply(ClusterNode node) { Boolean dataNode = node.attribute("maintenance.service.node"); return dataNode != null && dataNode; }
最后,通過如下的XML片段,使用maintenance-service-node-config.xml啟動(dòng)的每個(gè)節(jié)點(diǎn)在映射中都會包含這個(gè)屬性:
<property name="userAttributes"> <map key-type="java.lang.String" value-type="java.lang.Boolean"> <entry key="maintenance.service.node" value="true"/> </map> </property>
就這些了,使用MaintenanceServiceNodeStartup文件,或者將maintenance-service-node-config.xml傳遞給Ignite的ignite.sh/bat腳本,就可以啟動(dòng)維護(hù)服務(wù)節(jié)點(diǎn)的一個(gè)或者多個(gè)實(shí)例,如果選擇了后者,一定要確保將java/app/common和java/services/maintenance目錄中的所有文件打包成一個(gè)jar文件,然后將這個(gè)jar文件添加到每個(gè)服務(wù)將要被部署的節(jié)點(diǎn)的類路徑上。
示例中包含了另一個(gè)與車輛管理有關(guān)的Ignite服務(wù),使用VehicleServiceNodeStartup文件或者使用經(jīng)過vehicle-service-node-config.xml配置的ignite.sh/bat,可以啟動(dòng)至少一個(gè)部署有該服務(wù)的服務(wù)節(jié)點(diǎn),如果選擇了ignite.sh/bat方式,不要忘了組裝一個(gè)jar文件然后將其加入相關(guān)節(jié)點(diǎn)的類路徑上。
一旦準(zhǔn)備好了數(shù)據(jù)節(jié)點(diǎn),維護(hù)服務(wù)和車輛服務(wù)節(jié)點(diǎn)也都啟動(dòng)運(yùn)行了,那么就可以運(yùn)行第一個(gè)示例應(yīng)用來訪問這個(gè)分布式微服務(wù)了。
在示例中找到并且啟動(dòng)TestAppStartup,這個(gè)應(yīng)用會接入集群,往預(yù)定義的緩存中注入虛擬數(shù)據(jù),然后與服務(wù)進(jìn)行交互。
MaintenanceService maintenanceService = ignite.services().serviceProxy(MaintenanceService.SERVICE_NAME, MaintenanceService.class, false); int vehicleId = rand.nextInt(maxVehicles); Date date = maintenanceService.scheduleVehicleMaintenance(vehicleId);
如果注意了,應(yīng)用會使用服務(wù)代理來與服務(wù)進(jìn)行交互,代理的好處就是,啟動(dòng)應(yīng)用的節(jié)點(diǎn)不需要在本地類路徑中持有服務(wù)的實(shí)現(xiàn),也不需要在本地部署一個(gè)服務(wù)。
感謝各位的閱讀,以上就是“Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。