首页 > 解决方案 > websphere中的Spring Restful服务

问题描述

我们在Websphere Application Server中的应用环境有3个集群1.UI集群2.服务集群3.集成集群

我们有大约 50 个战争文件(微服务)部署到服务集群。所有服务都基于 REST 并通过 SPRING API 公开。重新启动服务集群大约需要 30 分钟。这个时间对于生产中的实时事件至关重要。由于某些原因,如果需要重新启动服务集群,我们需要为所有最终用户提供 30 分钟的停机时间。我们正在寻求减少回收时间,请向我们提出任何解决方案。

有没有办法在应用程序启动之前加载所有基于 Spring 的 jar 文件?即,例如有一个名为 xyz-1.0.war 的服务战争文件,并且有基于 Spring 的 jar 文件作为 maven 依赖项。所有 50 个 WAR 文件都具有相同的依赖项集,我正在考虑是否可以在 websphere 服务器启动应用程序之前加载所有基于 Spring 的 jar。

请建议。

标签: restwebsphere

解决方案


我不知道您可以在应用程序启动之前加载它们(类加载通常是按需加载的),但是您可以通过对公共文件使用共享库来加快速度,因此它们会被加载由单个类加载器而不是来自每个 WAR 的类加载器。它不会消除类加载活动,因为每个 WAR 仍然需要加载必要的类,但它会加速类加载的机制,因为共享库加载器将返回已经加载的类而不是搜索它类路径。

您可以采取两种不同的方法来解决这个问题。在这两种情况下,第一步是创建一个共享库,其中包含在应用程序之间共享的类。第二步的选项:

1)在服务器上创建一个自定义类加载器,并将共享库与这个新的类加载器相关联。这将使共享库中的类对服务器上运行的所有应用程序可见。

2) 在共享库配置中,选择“为此共享库使用隔离类加载器”,然后将共享库与任何需要它的应用程序关联。如果共享类仅由某些应用程序需要,这将仅将它们提供给需要它们的应用程序。

几点注意事项:

  • 如果您需要唯一的 Class 实例(例如,每个 WAR 唯一的静态值),这种方法将不起作用,因为共享库加载器只会加载 Class 的一个实例。在这种情况下,您将不得不坚持使用 WAR 级别的包装。
  • 如果您使用隔离类加载器解决方案,请注意这些加载器使用“最后一个父级”类加载,其中它们在服务器类加载器之前被搜索。如果您在这些库中有任何与服务器提供的类冲突的内容,则可能会导致 ClassCastExceptions 或 LinkageErrors。
  • 请注意,共享库加载器作为 WAR 加载器的父级运行,因此,库中的类将无法“看到”WAR 中的类。您需要确保这些库本质上是自包含的,才能使这些方法取得成功。

可以在此博客文章中找到有关配置步骤的更多详细信息:https ://www.ibm.com/developerworks/community/blogs/aimsupport/entry/create_shared_library_and_associate_it_with_the_application_server_or_application_on_websphere_application_server?lang=en_us


推荐阅读