我们的一个 Spring MVC Web 应用程序部署在多个带有 tomcat 7 的 Web 服务器上,LB 位于前端以平衡请求并将请求分发到适当的 tomcat 服务器。
这种 web farming 的问题是每个 tomcat 服务器都能够存储和检索自己的 HTTP session ,但是 LB 可以向任何一个 web 服务器发送请求。因此,如果通过 tomcatServer1 为用户提供登录页面,那么它将在其受尊重的服务器上创建 HTTP session ,并且可能会发生仪表板页面的第二次请求,LB 将其发送到 HTTP session 不可用的 tomcatServer2,结果用户再次被重定向登录页面。
为了克服这个问题,
- 我们在 LB 上使用“Sticky Session”属性,这样如果用户(HTTP session + 用户的公共(public) IP)第一次从 tomcatServer1 获得服务,那么它将绑定(bind)到该服务器。设置“粘性 session ”没有帮助,因为它没有平等地利用所有服务器。
- 另一种方法是,开发我们自己的 session 状态服务器并部署在服务器上,然后所有服务器都应与该服务器通信以存储和检索 session 对象/数据。
- 提供定制SessionManager到 Servlet 容器。
关于 #2,如果我们能够开发状态服务器,那么我也必须修改与 HttpSession.setAttribute()
相关的代码和 HttpSession.getAttribute()
. 所以问题是,是否可以覆盖 HttpSession
的实现?对于方法 setAttribute 和 getAttribute? 还有关于 #3,我不知道这个解决方案是否会提供分布式状态 session 服务器?
最佳答案
我开发了session state server对于使用 python 的 tomcat。
因此,我不需要更改已经为创建/访问和销毁 session 编写的代码。此外,由于有单独的服务器/服务正在处理和存储 session ,因此不需要主集群。
关于java - 用于 tomcat 的分布式 HTTP session 状态服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47634411/