jboss eap 6.3 集群(cluster)-Session 复制(Replication)

本文算是前一篇的后续,java web application中,难免会用到session,集群环境中apache会将http请求智能转发到其中某台jboss server。假设有二个jboss server:Server A,Server B,Session值在Server A上。用户在访问某一个依赖session的页面时,如果第一次访问到Server A,能正常取到Session值,刷新一下,如果这时转发到Server B,Session值取不到,问题就来了。

解决的办法简单到让人不敢相信,在app的web.xml中加一行 <distributable /> 即可(前提:jboss cluster是使用mod_cluster实现的),有了这个节点后,向某台server写入session时,session会自动复制到其它server node。

下面来具体验证一下:

网络环境:

如上图,有二台机器:172.21.129.181(Master Server & Apacha Server)、172.21.129.128(Slave Server)

User所在的计算机IP为: 172.21.129.57 (图中未标出)

Sample Application:

为了验证,我们建一个最简单的spring mvc web应用

Controller代码如下:

 1 package com.cnblogs.yjmyzz;
 2
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpSession;
 5
 6 import org.apache.log4j.Logger;
 7 import org.springframework.stereotype.Controller;
 8 import org.springframework.ui.Model;
 9 import org.springframework.web.bind.annotation.RequestMapping;
10 import org.springframework.web.bind.annotation.RequestMethod;
11 import org.springframework.web.servlet.ModelAndView;
12
13 @Controller
14 public class HomeController {
15
16     Logger log = Logger.getLogger(this.getClass());
17
18     private static final String sessionKey = "test";
19
20     /**
21      * 写入session
22      * @param request
23      * @return
24      */
25     @RequestMapping(value = "/session-write", method = RequestMethod.GET)
26     public String writeSession(HttpServletRequest request) {
27         HttpSession session = request.getSession();
28         session.setAttribute(sessionKey, "sample value");
29         return "session/write";
30     }
31
32     /**
33      * 读取session
34      * @param request
35      * @return
36      */
37     @RequestMapping(value = "/session-read", method = RequestMethod.GET)
38     public ModelAndView readSession(HttpServletRequest request) {
39         HttpSession session = request.getSession();
40         Object sessionValue = session.getAttribute(sessionKey);
41         ModelAndView model = new ModelAndView();
42         if (sessionValue != null) {
43             model.addObject(sessionKey, sessionValue);
44         }
45
46         try {
47             //显示几个IP到页面,用于辅助判断本次Http请求转发到了哪台server
48             String hostInfo = "InetAddress.getLocalHost() = "
49                     + java.net.InetAddress.getLocalHost()
50                     + "<br/>request.getRemoteAddr() = "
51                     + request.getRemoteAddr() + ":" + request.getRemotePort()
52                     + "<br/>x-forwarded-for = " + getUserReadIP(request)
53                     + "<br/>request.getLocalAddr() = " + request.getLocalAddr()
54                     + ":" + request.getLocalPort();
55             model.addObject("host", hostInfo);
56
57         } catch (Exception e) {
58
59         }
60         model.setViewName("session/read");
61         return model;
62     }
63
64     // 获取用户真实IP
65     private String getUserReadIP(HttpServletRequest request) {
66         if (request.getHeader("x-forwarded-for") == null) {
67             return request.getRemoteAddr();
68         }
69         return request.getHeader("x-forwarded-for");
70     }
71
72 }

write.jsp:(写入session)

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <html>
 4 <head>
 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 6 <title>session write test</title>
 7 </head>
 8 <body>
 9     <h1>Session写入成功!</h1>
10 </body>
11 </html>

read.jsp:(显示session)

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <html>
 4 <head>
 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 6 <title>session read test</title>
 7 </head>
 8 <body>
 9     <h1>Session("test"):${test}</h1>
10     <h1>${host}</h1>
11 </body>
12 </html>

准备就绪,依次以domain模式启动master server、slave server上的jboss,最后启动apache server。

然后访问:

http://172.21.129.181/ModClusterSample/session-write.do 写入session

继续访问:

http://172.21.129.181/ModClusterSample/session-read.do 读取session

从输出的几个IP看,本次请求apache转发到了 172.21.129.128上(即:slave Server),user客户端的IP为 172.21.129.57,而apache server的IP为172.21.129.181

另外第一行表明正确读取到了session值:sample value

这时进入master server的jboss控制台,将slave master上的jboss server给stop掉

再次刷新user机器上的http://172.21.129.181/ModClusterSample/session-read.do

可以看到,因为slave server上的jboss server已经被停掉了,所以本次http请求被转发到了172.21.129.181上(即master server),但是session值仍然能正常输出,说明session值在写入的同时,确实已经被复制到二台jboss server上了,session replication验证成功!

时间: 2024-08-01 00:22:14

jboss eap 6.3 集群(cluster)-Session 复制(Replication)的相关文章

inux下jboss eap 6.3 集群(cluster)-Session 复制(Replication)

本文算是前一篇的后续,java web application中,难免会用到session,集群环境中apache会将http请求智能转发到其中某台jboss server.假设有二个jboss server:Server A,Server B,Session值在Server A上.用户在访问某一个依赖session的页面时,如果第一次访问到Server A,能正常取到Session值,刷新一下,如果这时转发到Server B,Session值取不到,问题就来了. 解决的办法简单到让人不敢相信,

linux下jboss eap 6.3 集群(cluster)配置

jboss eap 6.3 集群(cluster)配置 接上一篇继续,Domain模式解决了统一管理多台jboss的问题,今天我们来学习如何利用mod_cluster来实现负载均衡.容错. mod_cluster是jboss的一个开源集群模块(基于apache 2.2.x),官网地址为http://mod-cluster.jboss.org/ ,下面是使用步骤: 一.从官网下载binary文件 http://mod-cluster.jboss.org/downloads/1-2-6-Final-

Tomcat集群的session复制配置

此处我们采用的是在一台服务器上配置3台Tomcat,为了达到访问任何一台Tomcat都共享session的目的,我们这里采用Tomcat在集群中的session复制,以下是具体的配置 1.我们将Tomcat复制3份,更改名字为Tomcat1.Tomcat2.Tomcat3,修改每个Tomcat中的Server节点端口分别为8005.8006.8007 1 #Tomcat1 2 <Server port="8005" shutdown="SHUTDOWN">

JBOSS EAP实战(2)-集群、NGINX集成、队列与安全

JBOSS HTTP的Thread Group概念 JBOSS是一个企业级的J2EE APP Container,因此它和任何一种成熟的企业级中间件一样具有Thread Group的概念.所谓Thread Group就是一个HTTP队列机制,利用Thread Group在JBOSS内可以设置如"阻断","升级","降级"等机制.来看一个这样的实际应用场景:当你的JBOSS连着一堆核心应用时,此时突然你的HTTP的并发请求在某一个点激增,如果把这些

nginx+tomcat的集群和session复制

前端服务器采用nginx,后端应用服务器采用tomcat.nginx负责负载均衡,session复制在tomcat上处理. 1.nginx安装(略) 2.nginx配置负载均衡 http { include       mime.types; default_type  application/octet-stream; sendfile        on; keepalive_timeout  65; #设置负载均衡列表 upstream backend { #ip_hash; server

Nginx+tomcat+memcached解决集群的session问题

Tomcat集群session同步方案有以下几种方式: · 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单.但这个方案的效率比较低,在大并发下表现并不好.原理:http://zyycaesar.iteye.com/blog/296606 · 利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单.但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了. · 利用ngi

Tomcat集群---Cluster节点配置(转)

<!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. className 表示tomcat集群时,之间相互传递信息使用那个类来实现信息之间的传递. channelSendOptions可以设置为2.4.8.10,每个数字代表一种方式 2 = Channel.SEND_OPTIONS_USE_ACK(确认发送) 4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送) 8 = Channel.SEND_OPTIONS_A

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http://www.cnblogs.com/fanshuyao/ 代码美化版或附件下载见:http://fanshuyao.iteye.com/blog/2400975 一.Session共享使用tomcat-cluster-redis-session-manager插件实现 插件地址见:https://g

Akka(10): 分布式运算:集群-Cluster

Akka-Cluster可以在一部物理机或一组网络连接的服务器上搭建部署.用Akka开发同一版本的分布式程序可以在任何硬件环境中运行,这样我们就可以确定以Akka分布式程序作为标准的编程方式了. 在上面两篇讨论里我们介绍了Akka-Remoting.Akka-Remoting其实是一种ActorSystem之间Actor对Actor点对点的沟通协议.通过Akka-Remoting来实现一个ActorSystem中的一个Actor与另一个Actorsystem中的另一个Actor之间的沟通.在Re