【问题标题】:What is a good way to uniquely identify a Server in the init of a java servlet在java servlet的init中唯一标识服务器的好方法是什么
【发布时间】:2012-07-31 15:36:05
【问题描述】:

我有一个 Java Web 应用程序,它在多个服务器上运行。此应用程序中的一些 servlet 在启动时加载以预加载一些数据。加载此数据的协议将根据应用程序部署在哪个服务器上而改变。 (要加载的文件的路径会发生变化,而且安全性也存在差异,因此获取一些文件比其他文件更复杂)。有没有一种方法可以在 java servlet 的 init 函数中唯一标识我的应用程序所在的服务器/机器?我最初正在使用HttpServletRequest.getServerName(),,这已经足够了,但它在 init 中不可用。我知道延迟初始化,所以不要告诉我这样做,如果可能的话,我会尽量避免这种情况,因为这些文件的加载时间很长。如果我能找到完美的机器名称,但我不知道如何从 api 中得到它。我所需要的只是一种从初始化中唯一识别机器的方法。

感谢您的帮助。

【问题讨论】:

  • 真正的需求是基于服务器名称,还是更多基于服务器角色,您通过将名称隐式映射到角色来确定?例如,您是否需要您的测试服务器以不同于生产服务器的方式处理事情?
  • 服务器名称,问题是我们服务器上的文件系统由于遗留问题而具有不同的结构。服务器 A B 和 C 都需要访问相同的通用文件集,但 prod 副本与 qa 服务器或 dev 服务器位于不同的位置。 prod 还具有测试环境所没有的安全性。如果只是安全性,我们可以基于角色来做,但文件位置不是基于角色的,所以这个应用程序也不能。
  • 您说它不是基于角色的,然后您描述了我认为基于角色的内容:-) 所以也许您有两组角色,一组用于安全性,一组用于文件系统位置类型。您目前确实拥有映射到每个服务器名称的具有不同文件系统位置和不同安全约束的特定服务器列表?硬编码,还是像在属性文件中一样?我想知道的是,您是否可以使用系统属性(类似于@cjstehno 建议的)为任何特定服务器分配其“文件系统”选项和“安全”选项,而根本不必寻找特定的服务器名称。跨度>
  • 我目前确实有特定服务器的列表以及特定文件系统位置的列表。它令人不快,但处理其他人的糟糕设计是我工作的 90%。 David a. 的解决方案看起来效果最好,它似乎是您和 cjstehno 所描述的 Websphere 特定实现,这不涉及我必须去管理员并要求他们以特殊方式启动服务器,只添加一些他们更可能想要做的资源。我同时与大约 20-30 个应用共享此服务器。
  • 很公平。一个小想法:如果文件系统位置只是一些基本目录,请考虑使用符号链接来简化该部分。

标签: java jsp servlets websphere


【解决方案1】:

我不会让我的应用程序依赖于一组(硬编码的)IP,而是使用绑定到 JNDI 的简单字符串属性来识别每个服务器。

硬编码 IP/主机名通常不是一个好主意。部署应用程序后可能会立即更改基础架构:)

另一方面,JNDI 是获取应用服务器资源的标准方式。将资源(字符串属性)绑定到 JNDI 可以在 WAS 管理控制台中完成,并且从 JNDI 获取属性值很容易。 IBM 甚至 published a tutorial 也对此有所了解。

【讨论】:

  • 很好的答案,但是您是否需要它提供的任何额外功能,而不是简单地使用系统属性?也就是说,您是否需要跨单个 JVM 的不同值?还是在同一个 Cell 中的多个 JVM 之间共享值?访问 JNDI 需要更多代码,而 IMO 管理起来并不容易。
  • 我认为是这样 - 在集群环境中。人们可能会使用这种共享值来识别 JVM 的测试/产品集群。另一个优点可能是无需回收服务器即可重新绑定值。
【解决方案2】:

也许一种方法是使用以下命令检查主机的名称:

java.util.InetAddress.getLocalHost().getHostName()

【讨论】:

  • 看起来这会起作用,但我感到非常惊讶的是,似乎没有一种方法可以在 api 中内置。
  • 我认为 API 是故意让您不知道 servlet 上下文之外的实际环境——我认为这没关系。如果您确实需要了解您的应用程序部署到的实际主机,那么您的架构可能还有一些改进空间。此外,我建议的解决方案并不那么可靠,这只是我知道的实现您所要求的唯一方法。
  • 再看一遍,这始终返回正确的机器名称。我想他们没有把它放到 servlet api 中,因为它已经在 java.util api 中了。我找不到它,因为我找错了地方:D
  • 我们正在开发的应用程序是一个工具,用于控制运行这些应用程序的服务器环境的一部分。因此,对于我们来说,试图不了解我们的环境是非常困难的。
  • 正如我所说,它不是 100% 可靠的;在某些情况下,它可能会返回“localhost”,当您有多个 IP 地址用于同一主机时,它可能会变得有趣。检查此答案以调整解决方案:stackoverflow.com/a/2381398/262683
【解决方案3】:

我曾经有过类似的需求,我们使用了系统属性。基本上,您使用 -D 参数在服务器的启动命令中定义属性:

-DserverId=serverA

然后在您的 servlet 中,您可以使用以下方式访问它:

System.getProperty("serverId")

您只需给每个服务器启动一个不同的 id。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 2011-03-27
    • 2011-01-05
    • 1970-01-01
    • 2012-06-19
    • 2012-01-25
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多