文档章节

在Ignite上运行微服务:第二部分

李玉珏
 李玉珏
发布于 2017/01/23 00:08
字数 1807
阅读 1010
收藏 10

在Ignite上运行微服务:第二部分

本文是系列文章的第二篇,这个系列会详细描述如何使用像Ignite这样的内存数据网格(IMDG)技术来构建容错和可扩展的微服务解决方案。 在第一篇中,作为一个系统,一个可能的架构由如下层次组成:

  • Ignite集群层
  • 持久化存储层
  • 外部应用层

1

本文中会关注第一层(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/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的集群层,本系列的下一篇文章中,会看到如下内容的实现细节:

  • 持久化存储层
  • 外部应用层

© 著作权归作者所有

李玉珏

李玉珏

粉丝 379
博文 77
码字总数 145991
作品 0
沈阳
架构师
私信 提问
加载中

评论(2)

wangbo888
wangbo888

引用来自“zhouhenry”的评论

大神,整一个开放环境配置的例子吧;很多人都不会,不利于推广
官网有中文的文档
z
zhouhenry
大神,整一个开放环境配置的例子吧;很多人都不会,不利于推广
在Ignite上运行微服务:第一部分

在Ignite上运行微服务:第一部分 从本文开始,会通过一个系列的篇幅来介绍使用Apache Ignite内存数据组织平台来构建容错、可扩展的基于微服务的解决方案。 介绍 当前,很多公司都会将自己的应...

李玉珏
2016/12/15
1K
2
在Ignite上运行微服务:第三部分

在Ignite上运行微服务:第三部分 这是关于如何在Ignite内存数据网格之上设计和实现微服务架构的系列文章的最后一篇,前两篇文章如下: 第一部分 整体介绍 第二部分 在在线环境中实现这个解决方...

李玉珏
2017/05/04
2.2K
4
敢说 Apache Ignite 比 Tachyon 好?删帖!

编者说:本文的原作者在网上发表了 Apache Ignite 与 Tachyon 优劣的言论后,竟然发现帖子被无情的删除了,于是他贴出了与 Google 团队成员交流的邮件,顺便写下了下面的文章以表达愤懑之情。...

oschina
2015/05/01
7.7K
16
搭建第一个Ignite集群时的注意事项

开发者在搭建第一个Ignite集群时,常常会遇到各种障碍,社区在收集了各种常见问题后,整理了一份检查清单帮助开发者,总之,本文的目的是帮助开发者在一开始就搭建一个正常的集群,走在正确的...

李玉珏
03/27
874
3
在Ignite中使用线性回归算法

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。 如果要找合适的数据集,会发现可用的有很多,但是对于...

李玉珏
2018/11/22
248
0

没有更多内容

加载失败,请刷新页面

加载更多

RxJava进行单元测试的方式

@Test public void completeTask_retrievedTaskIsComplete() { // Given a new task in the persistent repository final Task newTask = new Task(TITLE, ""); ......

SuShine
刚刚
0
0
正则表达式大全

检验手机号码 # 要求:手机号码必须为11位数字,以1开头,第二位为1或5或8。import redef verify_mobile(): mob = input("请输入手机号码:") ret = re.match(r"1[358]\d{9}", m......

彩色泡泡糖
4分钟前
0
0
QT之border-image属性

一、border-image的兼容性 border-image可以说是CSS3中的一员大将,将来一定会大放光彩,其应用潜力真的是非常的惊人。可惜目前支持的浏览器有限,仅Firefox3.5,chrome浏览器,Safari3+支持...

shzwork
5分钟前
0
0
Kubernetes Operator简易教程

1. 安装operator-sdk //安装 operator-sdk$ apt-get install operator-sdk.....$ operator-sdk versionoperator-sdk version: v0.7.0$ go versiongo version go1.11.4 darwin/amd64 2......

Robotcl_Blog
5分钟前
1
0
再谈DAG任务分解和Shuffle RDD

1、DagScheduler分析 DagScheduler功能主要是负责RDD的各个stage的分解和任务提交。Stage分解是从触发任务调度过程的finalStage开始倒推寻找父stage,如果父stage没有提交任务则循环提交缺失...

守望者之父
11分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部