溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)

發(fā)布時(shí)間:2021-12-16 16:18:54 來源:億速云 閱讀:211 作者:iii 欄目:云計(jì)算

這篇文章主要講解了“Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)”吧!

作為一個(gè)系統(tǒng),一個(gè)可能的架構(gòu)由如下層次組成:

  • Ignite集群層

  • 持久化存儲層

  • 外部應(yīng)用層

Ignite如何定義一個(gè)數(shù)據(jù)節(jié)點(diǎn)

本文中會關(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)用。

微服務(wù)位于內(nèi)存數(shù)據(jù)網(wǎng)格架構(gòu)之上時(shí)的數(shù)據(jù)節(jié)點(diǎn)

數(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)的類路徑中。

微服務(wù)位于內(nèi)存數(shù)據(jù)網(wǎng)格架構(gòu)之上時(shí)的服務(wù)節(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)的類路徑上。

在內(nèi)存數(shù)據(jù)網(wǎng)格之上運(yùn)行微服務(wù)的示例應(yīng)用

一旦準(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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI