如何获取服务请求的 JBoss EAP 7 实例的实例名称 (instance-id)
How to get the instance name (instance-id) of a JBoss EAP 7 instance serving the request
JBoss EAP 7 服务器 instance-id 在 standalone.xml 上配置,如下所示:
<subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node2">
我的环境具有负载平衡和粘性 session。因此,客户端收到 JSESSIONID cookie,其值如下:"ckvLpSqtsN2EjA8WpFqml3UMU5ZIyH2YI29Ir-i.node2".
问题是:我在 MBean 上(可以访问 FacesContext)。我怎样才能得到服务请求的服务器的instance-id?在上面的场景中,"node2".
我已经尝试过的:
- FacesContext.getCurrentInstance().getExternalContext().getSessionId(真)。
- 不起作用,因为它从 JSESSIONID 中的值中删除了 instance-id。
- 从 "Cookie" header 中读取 JSESSIONID 值(可通过 HttpServletRequest 获得)。
- 当用户还没有 session(他没有 JSESSIONID cookie)时不起作用。
我考虑通过在环境变量中设置实例 ID 并配置 standalone.xml 来定义 instance-id="${my.instance.name}" 来避免这个问题。然后,应用程序读取环境变量以获取 instance-id。这是跨 AS 可移植的,但容易出现配置错误。理想情况下,应用程序应该准确获取 instance-id 上的内容,我不需要应用程序可移植。
此问题类似于 "Getting instance name of a WebSphere app Server" (Getting instance name of a WebSphere app Server),但针对的是 JBoss EAP 7 服务器。
我不确定这是错误还是功能,但问题中描述的设置 instance-id 不会更改 jboss.node.name 或 jboss.server.name:
- jboss.node.name 设置为 主机名;
- jboss.server.name 设置为 主机名;
- Cookie JSESSIONID 的末尾附加了 instance-id。
However,在 <server>
标签(standalone.xml 上的顶级元素)上添加 name="node123" 属性并删除 instance-id来自undertow的属性有以下效果:
- jboss.node.name 设置为 "node123";
- jboss.server.name 设置为 "node123";
- Cookie JSESSIONID 在末尾附加了 "node123"。
这不是我所期待的答案,但我发现它比定义自定义 属性 并确保 属性 在 "instance-id" 上更容易接受。
它可能与问题没有直接关系,但在 wildfly10 中执行一些测试后,我们得出以下与节点之间唯一的不同属性相关的结论:
-Djboss.node.name=clusternode1
唯一标识集群中的每个节点。您可以在日志中看到它。如果缺少 jboss.server.name
的值,通常是主机名。
<subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node1"
这会影响每个节点生成的 return cookie。负载均衡器可以利用它来维护粘性会话,而无需跟踪 cookie。
例如:如果 cookie 以 .node1
为后缀,我将在 backend-server1 上发送它/如果 cookie 以 .node2
为后缀,我将在 backend-server2
上发送它
<subsystem xmlns="urn:jboss:domain:transaction:3.0"> <core-environment node-identifier="node1"
文档说它应该是独一无二的。
这用于 以防多个服务器 运行 在同一主机 上。看这张图:operating-modes
如果您保留默认值,您将收到警告。 wildfly11 中的警告更改为更具描述性:https://github.com/wildfly/wildfly/commit/732429b98fc08a01410058a707c73c1dd52c75b1
JBoss EAP 7 服务器 instance-id 在 standalone.xml 上配置,如下所示:
<subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node2">
我的环境具有负载平衡和粘性 session。因此,客户端收到 JSESSIONID cookie,其值如下:"ckvLpSqtsN2EjA8WpFqml3UMU5ZIyH2YI29Ir-i.node2".
问题是:我在 MBean 上(可以访问 FacesContext)。我怎样才能得到服务请求的服务器的instance-id?在上面的场景中,"node2".
我已经尝试过的:
- FacesContext.getCurrentInstance().getExternalContext().getSessionId(真)。
- 不起作用,因为它从 JSESSIONID 中的值中删除了 instance-id。
- 从 "Cookie" header 中读取 JSESSIONID 值(可通过 HttpServletRequest 获得)。
- 当用户还没有 session(他没有 JSESSIONID cookie)时不起作用。
我考虑通过在环境变量中设置实例 ID 并配置 standalone.xml 来定义 instance-id="${my.instance.name}" 来避免这个问题。然后,应用程序读取环境变量以获取 instance-id。这是跨 AS 可移植的,但容易出现配置错误。理想情况下,应用程序应该准确获取 instance-id 上的内容,我不需要应用程序可移植。
此问题类似于 "Getting instance name of a WebSphere app Server" (Getting instance name of a WebSphere app Server),但针对的是 JBoss EAP 7 服务器。
我不确定这是错误还是功能,但问题中描述的设置 instance-id 不会更改 jboss.node.name 或 jboss.server.name:
- jboss.node.name 设置为 主机名;
- jboss.server.name 设置为 主机名;
- Cookie JSESSIONID 的末尾附加了 instance-id。
However,在 <server>
标签(standalone.xml 上的顶级元素)上添加 name="node123" 属性并删除 instance-id来自undertow的属性有以下效果:
- jboss.node.name 设置为 "node123";
- jboss.server.name 设置为 "node123";
- Cookie JSESSIONID 在末尾附加了 "node123"。
这不是我所期待的答案,但我发现它比定义自定义 属性 并确保 属性 在 "instance-id" 上更容易接受。
它可能与问题没有直接关系,但在 wildfly10 中执行一些测试后,我们得出以下与节点之间唯一的不同属性相关的结论:
-Djboss.node.name=clusternode1
唯一标识集群中的每个节点。您可以在日志中看到它。如果缺少jboss.server.name
的值,通常是主机名。<subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node1"
这会影响每个节点生成的 return cookie。负载均衡器可以利用它来维护粘性会话,而无需跟踪 cookie。 例如:如果 cookie 以.node1
为后缀,我将在 backend-server1 上发送它/如果 cookie 以.node2
为后缀,我将在 backend-server2 上发送它
<subsystem xmlns="urn:jboss:domain:transaction:3.0"> <core-environment node-identifier="node1"
文档说它应该是独一无二的。 这用于 以防多个服务器 运行 在同一主机 上。看这张图:operating-modes 如果您保留默认值,您将收到警告。 wildfly11 中的警告更改为更具描述性:https://github.com/wildfly/wildfly/commit/732429b98fc08a01410058a707c73c1dd52c75b1