1

这是我想要实现的目标:

我有一个 Web 服务 A,我希望它能够与 A 类型的其他 Web 服务(不同版本)并排部署。现在我假设 2 个实例并排。我需要它,因为该服务有一个预热阶段,这需要一些时间来从数据库构建东西,只有在它准备好之后它才能开始服务请求......

我正在考虑部署到Tomcat6上下文路径,例如:“/ServiceA-1.0”, “/ServiceA -2.0” ,然后有一个“虚拟”上下文,如“/ServiceA”,它将指向所需的物理服务,例如“/ServiceA- 1.0" . 所以外部世界会知道 ServiceA,但在内部,我的 ServiceA 相关堆栈会知道版本化的 ServiceA url(涉及更多组件,但只有 ServiceA 服务于外部世界)。当新服务准备就绪时,我只需重新配置“虚拟”上下文以指向新服务。

到目前为止,我无法找到如何使用 Tomcat 执行此操作,并且开始 tkink 这是不可能的。我找到了将 Apache Server 放在 Tomcat 前面并在那里进行路由的建议,但除非必要,否则我不想注册另一个软件。

我的问题是:
- 这种“虚拟”上下文和路由是否可以与 Tomcat6 一起使用?
- 任何其他选择、智慧和经验教训如何实现这种服务交换场景?

最好的,
约瑟夫

4

3 回答 3

2

鉴于您提到的热身期,我假设您在切换实现时或多或少想要不间断的服务。这真的很容易用前面的 Apache 处理。

我通常喜欢从这个额外的层中获得的灵活性。Apache 对您的系统没有太大的侵入性。另外 - 如果你在 unix 上运行 - 让 Apache 在端口 80 上侦听是微不足道的(阅读:默认),而你必须加倍努力才能让 tomcat 在端口 80 上侦听而不是以 root 身份运行

如果您从未接触过 Apache,请放心,它很容易在短时间内学会。特别是当您不需要它带来的全部功能时。配置反向代理(或 mod_jk)随处可见。您提到的功能是反向代理和负载均衡器的混合体 - 即使您只有一台服务器来平衡“之间”的负载,您也会有两个不同的上下文/版本。

不要害怕 Apache,你在正确的道路上 :)

于 2012-06-15T07:33:32.327 回答
0

我不记得 Tomcat 是否具有执行此操作的本机能力,但是您应该能够使用简单的 Web 应用程序 servlet 相当容易地完成您正在寻找的东西。基本上创建一个监听“/ServiceA”并将所有内容重定向到您需要的 URL 的 servlet。您可以创建一个简单的管理页面(使用阀门来控制对它的访问?)或一个 JMX 服务来控制您想要重定向的端点。

不像在前面使用Apache HTTPDLighttpd这样简单,但可能同样有效,并且允许您将所有内容保留在 Tomcat 中(如果您确实想要的话)。

Pound也是一个非常快速/轻量级的负载均衡器,你可以在你的服务之前运行它,但是如果有内存,它就不能动态地改变配置;它必须停止并重新启动。但是,停止和启动或发送 SIGHUP 是闪电般的快,所以应该不会太痛苦。当然,这确实意味着除了 Tomcat 之外,您还必须运行/配置/支持一个单独的二进制文件。

我只是在重读您最初的问题,并意识到没有人回答您关于切换服务警告的问题。您没有说明您的服务是否是无状态的,但您需要担心/考虑在两种服务之间切换时丢失会话/状态的影响。除此之外,我预计影响很小。

于 2012-06-15T15:26:29.577 回答
0

Tomcat 7 支持开箱即用的版本控制。您只需部署例如 Service##1.war、Service##2.war 等,它们都显示为 /Service,并且存在的最新版本是默认版本,或者您可以与特定版本交谈。使用运行 mod_proxy 的 Apache HTTPD 将其作为前端,您就完成了。我会推荐 mod_proxy_ajp 而不是 mod_proxy_jk,因为它更容易配置并且对我来说似乎没有任何功能。

于 2012-06-18T15:23:34.613 回答