1

JBoss EAP 7 服务器 instance-id 在standalone.xml 上配置,如下所示:

<subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node2">

我有负载平衡和粘性会话的环境。因此,客户端接收到 JSESSIONID cookie,其值为:“ckvLpSqtsN2EjA8WpFqml3UMU5ZIyH2YI29Ir-i.node2”。

问题是:我在 MBean 上(可以访问 FacesContext)。如何获取为请求提供服务的服务器的实例 ID?在上述场景中,“node2”。

我已经尝试过的:

  1. FacesContext.getCurrentInstance().getExternalContext().getSessionId(true)。
    • 不起作用,因为它从 JSESSIONID 中的值中删除了实例 ID。
  2. 从“Cookie”标头中读取 JSESSIONID 值(可通过 HttpServletRequest 获得)。
    • 当用户还没有会话时不起作用(他没有 JSESSIONID cookie)。

我已经考虑通过在环境变量中设置实例 id 并配置standalone.xml 来定义 instance-id="${my.instance.name}" 来避免这个问题。然后,应用程序读取环境变量以获取实例 ID。这是跨 AS 可移植的,但容易出现配置错误。理想情况下,应用程序应该准确地获得 instance-id 上的内容,并且我不需要应用程序是可移植的。

这个问题类似于“Getting instance name of a WebSphere app Server”(Getting instance name of a WebSphere app Server),但针对的是 JBoss EAP 7 服务器。

4

2 回答 2

1

我不确定这是错误还是功能,但是按照问题中的描述设置实例 ID 不会更改 jboss.node.name 或 jboss.server.name:

  • jboss.node.name 设置为主机名
  • jboss.server.name 设置为主机名
  • Cookie JSESSIONID在末尾附加了实例 ID 。

但是<server>,在标签(standalone.xml 上的顶级元素)上添加 name="node123" 属性并从 undertow 中删除 instance-id 属性具有以下效果:

  • jboss.node.name 设置为“node123”;
  • jboss.server.name 设置为“node123”;
  • Cookie JSESSIONID 在末尾附加了“node123”。

这并不是我所期望的答案,但我发现它比定义自定义属性并确保该属性位于“instance-id”上更容易接受。

于 2017-01-23T19:46:14.913 回答
0

它可能与问题没有直接关系,但在 wildfly10 中执行一些测试后,我们得出以下与节点之间唯一的不同属性相关的结论:

  • -Djboss.node.name=clusternode1 唯一标识集群中的每个节点。您可以在日志中看到它。如果缺少,jboss.server.name则使用通常是主机名的值。

  • <subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node1" 这会影响每个节点生成的返回 cookie。负载均衡器可以使用它来维护粘性会话,而无需跟踪 cookie。例如:如果 cookie 后缀为,.node1我将在 backend-server1 上发送/如果 cookie 后缀为,.node2我将在 backend-server2 上发送

  • <subsystem xmlns="urn:jboss:domain:transaction:3.0"> <core-environment node-identifier="node1" 文档说它应该是独一无二的。这用于在同一主机上运行多个服务器的情况。参见此图:操作模式 如果您保留默认值,您将收到警告。wildfly11 中的警告更改为更具描述性:https ://github.com/wildfly/wildfly/commit/732429b98fc08a01410058a707c73c1dd52c75b1

于 2019-01-16T16:14:18.707 回答