在Ignite上運行微服務:第二部分

在Ignite上運行微服務:第二部分

本文是系列文章的第二篇,這個系列會詳細描述如何使用像Ignite這樣的內存數據網格(IMDG)技術來構建容錯和可擴展的微服務解決方案。 在第一篇中,做爲一個系統,一個可能的架構由以下層次組成:java

  • Ignite集羣層
  • 持久化存儲層
  • 外部應用層

1

本文中會關注第一層(Ignite集羣層),能夠參考一個GitHub項目,他包含了平常中實現擬議的微服務架構所必須的構建塊,尤爲是要覆蓋以下部分:node

  • 配置和啓動數據節點;
  • 使用Ignite的服務API的典型服務實現;
  • 配置和啓動駐有Ignite服務的服務節點;
  • 一個鏈接到集羣而且觸發服務執行的虛擬應用。

微服務位於內存數據網格架構之上時的數據節點

正如第一篇中提到的,數據節點是持有數據集一部分數據的服務端節點,應用邏輯端會在這個數據集上執行查詢和計算。一般來講,這種類型的節點對應用邏輯是透明的,由於這些節點只是簡單地存儲數據集,而後當應用訪問數據時高效地進行處理就能夠了。git

下面會看一下在實現層面如何定義一個數據節點。github

能夠下載這個GitHub項目而後找到 data-node-config.xml,它會用於建立一個新的數據節點,這個配置包含了一組與數據節點有關的段落和參數。apache

首先,須要爲每個要部署到集羣中的Ignite緩存配置一個特定的節點過濾器。這個過濾器會在緩存啓動時被調用,它會定義一個要存儲緩存數據的集羣節點的子集--數據節點。一樣的過濾器在網絡拓撲發生變化時也會被調用,好比新節點加入集羣或者舊節點離開集羣。過濾器的實現須要加入每一個節點的類路徑中,無論該節點是否會成爲數據節點。緩存

<bean class="org.apache.ignite.configuration.CacheConfiguration">
...
  <property name="nodeFilter">
    <bean class="common.filters.DataNodeFilter"/>
  </property>
</bean>

第二,實現過濾器,在本例中,使用了一個很是明確的實現,DataNodeFilter,它經過檢查data.node參數來肯定一個節點是否會被視爲數據節點。若是一個節點在屬性映射中配置了這個參數,那麼他會成爲一個數據節點而後數據會駐留於此,不然該節點會被忽略。網絡

public boolean apply(ClusterNode node) {
  Boolean dataNode = node.attribute("data.node");
  return dataNode != null && dataNode;
}

第三,data-node-config.xml爲每一個使用這個配置啓動的節點的屬性映射添加了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腳原本啓動一個數據節點的實例。若是選擇了後者,那麼必定要將java/app/common目錄中的全部類文件構建成一個jar包,而後還要將這個jar文件加入到每一個數據節點的類路徑中。app

微服務位於內存數據網格架構之上時的服務節點

在實現層次上服務節點的定義與前述數據節點的用法沒有什麼大的不一樣。基本上,須要創建一個方式,即指定一個特定的微服務將要部署在哪些節點上,它們會是整個集羣的一個子集。分佈式

最初,須要使用服務網格API實現一個微服務,爲後文起見,能夠回顧一下那個GitHub示例中的已有服務實現,即Maintenance Service

這個服務能夠調度一個車輛維護的服務,而且能夠查看已作保養的清單,它實現了全部服務網格的必要方法,包括init(...)execute(...)以及cancel(...),而且在這個接口中增長了新的方法:

public interface MaintenanceService extends Service {
  public Date scheduleVehicleMaintenance(int vehicleId);
  public List<Maintenance> getMaintenanceRecords(int vehicleId);
}

將這個維護服務配置而且部署到特定的Ignite節點(服務節點)上有幾種方式。在本例中,經過maintenance-service-node-config.xml啓動的每一個節點,均可以考慮進行維護服務的部署,下面能夠看一下配置。

首先,確保維護服務的實例只會被部署到指定了節點過濾器的節點上:

<bean class="org.apache.ignite.services.ServiceConfiguration">
  <property name="nodeFilter">
    <bean class="common.filters.MaintenanceServiceFilter"/>
  </property>
</bean>

第二,維護服務使用的過濾器,只會被部署到在屬性映射中配置了maintenance.service.node的節點上:

public boolean apply(ClusterNode node) {
  Boolean dataNode = node.attribute("maintenance.service.node");
  return dataNode != null && dataNode;
}

最後,經過以下的XML片斷,使用maintenance-service-node-config.xml啓動的每一個節點在映射中都會包含這個屬性:

<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腳本,就能夠啓動維護服務節點的一個或者多個實例,若是選擇了後者,必定要確保將java/app/commonjava/services/maintenance目錄中的全部文件打包成一個jar文件,而後將這個jar文件添加到每一個服務將要被部署的節點的類路徑上。

示例中包含了另外一個與車輛管理有關的Ignite服務,使用VehicleServiceNodeStartup文件或者使用通過vehicle-service-node-config.xml配置的ignite.sh/bat,能夠啓動至少一個部署有該服務的服務節點,若是選擇了ignite.sh/bat方式,不要忘了組裝一個jar文件而後將其加入相關節點的類路徑上。

在內存數據網格之上運行微服務的示例應用

一旦準備好了數據節點,維護服務和車輛服務節點也都啓動運行了,那麼就能夠運行第一個示例應用來訪問這個分佈式微服務了。

在示例中找到而且啓動TestAppStartup,這個應用會接入集羣,往預約義的緩存中注入虛擬數據,而後與服務進行交互。

MaintenanceService maintenanceService = ignite.services().serviceProxy(MaintenanceService.SERVICE_NAME,
MaintenanceService.class, false);
int vehicleId = rand.nextInt(maxVehicles);
Date date = maintenanceService.scheduleVehicleMaintenance(vehicleId);

若是注意了,應用會使用服務代理來與服務進行交互,代理的好處就是,啓動應用的節點不須要在本地類路徑中持有服務的實現,也不須要在本地部署一個服務。

未完待續

在本文中,能夠看到從擬議的微服務架構如何實現Ignite的集羣層,本系列的下一篇文章中,會看到以下內容的實現細節:

  • 持久化存儲層
  • 外部應用層
相關文章
相關標籤/搜索