这篇文章主要讲解了“Ignite如何定义一个数据节点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Ignite如何定义一个数据节点”吧!
作为一个系统,一个可能的架构由如下层次组成:
本文中会关注第一层(Ignite集群层),可以参考一个GitHub项目,他包含了日常中实现拟议的微服务架构所必须的构建块,尤其是要覆盖如下部分:
配置和启动数据节点;
使用Ignite的服务API的典型服务实现;
配置和启动驻有Ignite服务的服务节点;
一个连接到集群并且触发服务执行的虚拟应用。
微服务位于内存数据网格架构之上时的数据节点
数据节点是持有数据集一部分数据的服务端节点,应用逻辑端会在这个数据集上执行查询和计算。通常来说,这种类型的节点对应用逻辑是透明的,因为这些节点只是简单地存储数据集,然后当应用访问数据时高效地进行处理就可以了。
可以下载这个GitHub项目然后找到 data-node-config.xml,它会用于创建一个新的数据节点,这个配置包含了一组与数据节点有关的段落和参数。
首先,需要为每一个要部署到集群中的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文件加入到每个数据节点的类路径中。
微服务位于内存数据网格架构之上时的服务节点
在实现层次上服务节点的定义与前述数据节点的用法没有什么大的不同。基本上,需要建立一个方式,即指定一个特定的微服务将要部署在哪些节点上,它们会是整个集群的一个子集。
最初,需要使用服务网格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/common和java/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如何定义一个数据节点”的内容了,经过本文的学习后,相信大家对Ignite如何定义一个数据节点这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是天达云,小编将为大家推送更多相关知识点的文章,欢迎关注!