我有多个客户:
我有一个应该为所有客户服务的Web应用程序。 该应用程序部署到Tomcat中。每个客户都有自己的数据库。
我想要实现的是为所有客户端提供服务的单个Web应用程序实例。客户端(以及要连接的数据库)由URL的上下文路径标识。
即。我暗示了以下情况:
当客户端2请求http://mydomain.com/client2/时,我希望我的应用程序(同一实例)现在处理它,就像它被部署到/ client2上下文路径一样。
Tomcat可以实现吗?
答案 0 :(得分:1)
你的应用程序必须这样做而不是tomcat。现在,您可以在三个新的上下文(client1,client2,client3)中部署应用程序,对数据库的配置略有不同,如果您小心使用相对URL(即不要执行/ images这样的操作),那么您可以这样做没有变化。这是使您的应用程序可重用的透明方式,因为您的应用程序不知道您有3个不同的自身运行实例的全局图片。这意味着您可以轻松部署更多或更多,而无需更改您的应用程序。您只需配置一个新实例即可。这只要求您不要将绝对URL用于资源。使用ServletContext.getContextPath()并在CSS中使用..,脚本等也很有帮助。
以这种方式工作的最大优势之一可能是您的应用并不关心全球问题。因为它不参与这些决策,所以你可以在一个tomcat服务器上运行3个实例,或者如果一个客户端需要更多的扩展,它们可以很容易地移动到自己的tomcat服务器上。通过使您的应用程序可移植,它迫使您处理如何在任何环境中安装您的应用程序。这是水平扩展的支柱,您的情况可以非常有利,因为您可以分割您的数据库数据而无需重新加入它们(巨大的优势)。您询问的选项并没有强迫您处理这个问题,所以当需要处理它时会很痛苦。
另一个选项涉及更多,需要对您的应用程序进行重大更改才能解决此问题。这是通过解析传入的URL并拉出客户端的名称,然后使用该名称在配置文件中查找应该用于该客户端的数据库。 SpringMVC可以处理诸如从URL路径中提取变量之类的事情。然后确保将所有内容呈现给它们,使其指向URL的一部分。这可能需要与第一个相同的许多要求。您可以对javascript,CSS和图像等内容使用绝对URL,但是必须在运行时重写应用程序的URL,以使其与请求客户端相关。好处是您只需加载一次应用程序。
另外,如果您在生产中的CDN上托管CSS,Javascript,图像,那么这两个选项必须是相对URL感知的。使用CDN的好处和缺点。
虽然听起来不错,但这可能不是一件好事,因为所有客户都使用相同版本的应用程序。此外,如果您关闭应用程序以修复client1进行维护,则会影响所有客户端。如果您认为您必须为每个客户端进行自定义,那么此选项将很快变得混乱。升级单个客户端意味着所有客户端都必须升级,并且根据您的业务模型,这可能不兼容。此外,我并不完全确定您是否只会运行单个版本的应用程序来节省大量内存,因为大多数应用程序只占用10MB的代码。绝大多数内存位于VM和处理请求中,使用单个Tomcat实例意味着您共享VM。并且运行1或3个实例时,您仍然具有相同数量的请求。您可能会看到30-100MB的差异,这在当今世界是变化的,如果您选择仅保存几MB,那么所有其他问题都不是地址。
本质上,Tomcat中有一些工具可以帮助您完成此操作(多个上下文),但主要由您的应用程序来处理,尤其是在单个实例的情况下。