在Jhipster

时间:2017-04-05 10:51:46

标签: spring-boot jhipster hazelcast

上下文

我使用Jhipster(v4.1.0)创建了一个Monolithic应用程序,并包含以下功能:

  • HTTP会话身份验证(有状态,默认的Spring安全机制)
  • Hibernate二级缓存?:是的,使用HazelCast(分布式缓存,用于多个节点)
  • 使用Hazelcast的群集HTTP会话

当我运行应用程序的单个实例时,一切都按预期工作。我可以登录,并在不登出的情况下使用该应用程序。

问题和我尝试的内容:

然而,当我启动应用程序的第二个实例(使用docker-compose scale)时,我会遇到以下情况:

  • 当第二个实例启动时,我可以看到Hazelcast实例成功连接
  

成员2 {

  Member [172.18.0.3]:5701 - 782c21f9-5065-4bfc-bc13-23dfb42cf6f7
  Member [172.18.0.5]:5701 - d4fcf306-e20a-497b-a6b8-000341881419 this
}
  • 我可以在任一实例上成功访问该应用程序
  • 我可以在任一实例上登录并在该实例上使用该应用程序而无需注销
  • 当我切换到另一个实例时,我在两个实例上都已注销

我最初的想法是使用Hazelcast的Clustered HTTP会话无法正常工作,但是当我实现一个简单的控制器来检查会话详细信息时(完全按照this example中的建议),我发现了以下内容:

  • 我访问了第一个实例,并且给出了拒绝访问错误
  • 我在第一个实例上登录,我的控制器现在向我显示我的会话详细信息,我可以在登录时刷新页面,保持会话ID和会话中的计数器变量增加: enter image description here
  • 我访问第二个实例并立即给出拒绝访问错误
  • 我再次访问第一个实例并收到拒绝访问错误(我明确注销)
  • 如果我再次登录第一个实例,我的会话ID仍然是相同的 并且计数器仍在计算
  • 如果我在第二个实例上登录,我的会话ID与第一个实例相同,并且计数器从第一个实例的中断处继续

我的结论是使用Hazelcast的群集HTTP会话正常工作。我还在两个实例之间实现了负载均衡器(HAProxy),但是当我登录时我立即再次注销。我后来更新了HAProxy以使用粘性会话,然后允许应用程序运行,但是当处理会话的实例失败(停止)时,用户被注销而不会移动到另一个实例,从而打败了分配会议的目的。

最后,我的问题:

  • 我认为应该维护身份验证是错误的,因为会话是在实例之间共享的吗? (即其他负责保持身份验证的会话)
  • 为什么我要退出?
  • 我应该在哪里尝试调试此问题?

更新

我上传了一个包含完整应用程序的存储库:

只有使用jhipster生成后进行的更改才能添加loadbalancer到src / main / docker / app.yml,并添加控制器和html来查看会话详细信息

应用程序以

开始

./mvnw package -Pprod docker:build docker-compose -f src/main/docker/app.yml up -d

缩放
`docker-compose -f src/main/docker/app.yml scale jhipster3-app=2`

0 个答案:

没有答案