分布式组件生命周期管理

时间:2013-04-17 13:15:42

标签: java spring distributed

我的公司计划实施一个集群系统,其中包含许多服务,这些服务将自动部署在不同的机器中,并相互连接(SOA风格)。有时服务会有相互依赖性。

例如: 只有在服务A(数据库)启动并运行时,才能启动服务B(应用程序)。

每个服务都计划作为一个不同的java进程运行,可能部署为WAR(在专用的tomcat内部),甚至根本没有web。

现在我们在同一个WAR中拥有所有服务,并且只有部署了部署WAR的tomcat。 所有服务都是通过Spring和Spring定义的,为我们管理依赖。

所以我问自己是否存在一些有助于在分布式环境中管理服务的框架,如上所述?

提前致谢

2 个答案:

答案 0 :(得分:2)

Netflix 发布了他们的开源工具 - Asgard,用于管理实例并将其部署到云端。它与EC2紧密耦合(我最后一次检查)。根据您是否部署到亚马逊云,您可能会发现它非常有用。我不知道它是否支持依赖,但它确实管理分布式环境上的部署。 Netflix确实在他们的博客上讨论了很多服务依赖关系,因此部署解决方案可能有一个功能可以解决这个问题。

我不知道有任何其他服务/框架可以做到这一点。如果你自己编写这个,我猜你可以配置一些部署服务的 Jenkins 任务。一个任务可以依赖于另一个任务来模拟服务依赖性。 Ping部署URL端点可以在部署B之前检查服务A是否存在。

还有另一种看待这个的方法。如果确保服务正常运行,则无需检查依赖性。像 Nagios 这样的监控工具可以在这里提供帮助。立即对故障服务进行故障排除可以帮助您专注于部署服务A,而不是检查每个部署的依赖关系。

答案 1 :(得分:2)

使用 ZooKeeper

更正,使用Netflix的策展人,一个位于zookeeper之上的框架,简化了它的工作。

在我工作的地方,我最近实现了一个Coordinator类,它有两种方法:

waitForDependencies - 一种同步方法,用于检查当前服务的依赖性的活跃程度,并阻止当前线程,直到通知所有依赖服务都处于活动状态。通过调用notifyUp

,在初始化过程结束时验证由依赖服务创建的节点是否存在,从而完成活动性检查。

notifyUp - 一种同步方法,通知全世界调用该方法的当前服务是活动的。通过使用{{1}创建一个短暂的(临时的,保持活动的,只要它创建的连接是活的)节点在zk集群中完成,该节点由依赖它的其他服务查找。 }