Spring Pivotal GemFire 多会话会话
Spring Session for Pivotal GemFire Multi-Session
我们正在为零售商尝试跨服务器的非粘性会话解决方案。
使用的服务器是 WebLogic 12.2.1.3 和 TomcatEE 7.0.5。我们能够看到跨服务器持续存在的会话。
httpServletRequest.getSession()
有时会尝试从容器而不是 GemFire 中检索会话。
此外,我们在客户端 cookie 和服务器日志中看到的会话 ID 与在 GemFire 中看到的不同。这是预期的吗?
编辑:
在 GemFire 中创建的会话 ID 在客户端浏览器上进行了 base64 编码。这将回答上述问题。
请确保您在所有 (Spring Boot) 您已经跨 WebLogic 和 TomcatEE 部署的应用程序实例。这很简单,如下所示:
@SpringBootApplication
@EnableGemFireHttpSession
class MySpringBootWebApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
...
}
@EnableGemFireHttpSession
是关键。还要确保部署在每个 WebLogic 和 TomcatEE 中的应用程序实例在后端 Pivotal GemFire 集群中共享相同的区域,假设有一个 GemFire 集群为 WebLogic 和 TomcatEE 中的应用程序提供服务。
例如,如果您明确设置区域,使用:
@EnableGemFireHttpSession(regionName = "MySessionRegion")
确保所有应用程序实例使用相同的区域名称(即 "MySessionRegion")。或者,从 SSDG 2.0.5.RELEASE
开始,可以使用 Spring Boot 的 application.properties
文件中的 属性 配置区域名称:
spring.session.data.gemfire.session.region.name=MySessionRegion
此外,确保所有应用程序都配置为与同一个 GemFire 集群通信。这取决于 Spring 会话区域用来与 GemFire 集群对话的 Pool
。 Pool 名称可以使用注释配置,如下所示:
@EnableGemFireHttpSession(..., poolName = "SessionPool")
然后,您必须为所有应用程序实例配置池以连接到同一个 GemFire 集群,最好使用定位器,如下所示:
@配置
class MyGemFireConfiguration {
@Bean("SessionPool")
PoolFactoryBean sessionPool() {
PoolFactoryBean sessionPool = new PoolFactoryBean();
sessionPool.setName("SessionPool");
sessionPool.setLocators(Arrays.asList(new ConnectionEndpoint("host1", port1),
new ConnectionEndpoint("host2", port2),
...,
new ConnectionEndpoint("hostN", portN));
return sessionPool;
}
...
}
或者,您可以配置 "DEFAULT" GemFire 池,假设配置的客户端 PROXY 区域存储会话状态使用 "DEFAULT" 池,当没有池明确时它会 configured/named .对于 example.
最后要注意的是,如果您使用的是 GemFire WAN 拓扑,并且有多个站点,其中每个站点都服务于应用服务器隔离的特定应用程序集合,也许(即 WebLogic 与 TomcatEE)。然后您必须确保您已配置 GemFire WAN 适当地协调您的多个 GemFire 集群。这超出了这个答案的范围,所以我鼓励你看看 this.
随时分享任何示例代码、配置 and/or 测试,它们可能会阐明您遇到的问题。
我们正在为零售商尝试跨服务器的非粘性会话解决方案。 使用的服务器是 WebLogic 12.2.1.3 和 TomcatEE 7.0.5。我们能够看到跨服务器持续存在的会话。
httpServletRequest.getSession()
有时会尝试从容器而不是 GemFire 中检索会话。
此外,我们在客户端 cookie 和服务器日志中看到的会话 ID 与在 GemFire 中看到的不同。这是预期的吗?
编辑: 在 GemFire 中创建的会话 ID 在客户端浏览器上进行了 base64 编码。这将回答上述问题。
请确保您在所有 (Spring Boot) 您已经跨 WebLogic 和 TomcatEE 部署的应用程序实例。这很简单,如下所示:
@SpringBootApplication
@EnableGemFireHttpSession
class MySpringBootWebApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
...
}
@EnableGemFireHttpSession
是关键。还要确保部署在每个 WebLogic 和 TomcatEE 中的应用程序实例在后端 Pivotal GemFire 集群中共享相同的区域,假设有一个 GemFire 集群为 WebLogic 和 TomcatEE 中的应用程序提供服务。
例如,如果您明确设置区域,使用:
@EnableGemFireHttpSession(regionName = "MySessionRegion")
确保所有应用程序实例使用相同的区域名称(即 "MySessionRegion")。或者,从 SSDG 2.0.5.RELEASE
开始,可以使用 Spring Boot 的 application.properties
文件中的 属性 配置区域名称:
spring.session.data.gemfire.session.region.name=MySessionRegion
此外,确保所有应用程序都配置为与同一个 GemFire 集群通信。这取决于 Spring 会话区域用来与 GemFire 集群对话的 Pool
。 Pool 名称可以使用注释配置,如下所示:
@EnableGemFireHttpSession(..., poolName = "SessionPool")
然后,您必须为所有应用程序实例配置池以连接到同一个 GemFire 集群,最好使用定位器,如下所示:
@配置 class MyGemFireConfiguration {
@Bean("SessionPool")
PoolFactoryBean sessionPool() {
PoolFactoryBean sessionPool = new PoolFactoryBean();
sessionPool.setName("SessionPool");
sessionPool.setLocators(Arrays.asList(new ConnectionEndpoint("host1", port1),
new ConnectionEndpoint("host2", port2),
...,
new ConnectionEndpoint("hostN", portN));
return sessionPool;
}
...
}
或者,您可以配置 "DEFAULT" GemFire 池,假设配置的客户端 PROXY 区域存储会话状态使用 "DEFAULT" 池,当没有池明确时它会 configured/named .对于 example.
最后要注意的是,如果您使用的是 GemFire WAN 拓扑,并且有多个站点,其中每个站点都服务于应用服务器隔离的特定应用程序集合,也许(即 WebLogic 与 TomcatEE)。然后您必须确保您已配置 GemFire WAN 适当地协调您的多个 GemFire 集群。这超出了这个答案的范围,所以我鼓励你看看 this.
随时分享任何示例代码、配置 and/or 测试,它们可能会阐明您遇到的问题。