Jetty集群配置Session存储到MySQL、MongoDB

在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录、购物车等。

Session一般情况下是保存在服务器内存中。如果服务器重启,Session就会丢失。另外,如果是集群环境,一个Web应用部署在多台服务器上,一个用户多次请求可能会由不同的服务器来处理,Session如果保存在各自的服务器上,就无法共享了。

针对这个问题,Jetty服务器提供了用于集群环境下的Session实现方式,即通过多台Jetty服务器连接到同一个Session数据库来实现Session共享。

1、配置Session存储到关系数据库(MySQL为例):

配置jetty.xml:

打开etc/jetty.xml,在Configure元素内部加入XML片段:

<Set name="sessionIdManager">
	<New id="jdbcidmgr" class="org.eclipse.jetty.server.session.JDBCSessionIdManager">
		<Arg>
			<Ref id="Server" />
		</Arg>
		<Set name="workerName">fred</Set>
		<Call name="setDriverInfo">
			<Arg>com.mysql.jdbc.Driver</Arg>
			<Arg>jdbc:mysql://192.168.20.1:3306/jetty_session?user=root&amp;password=123</Arg>
		</Call>
		<Set name="scavengeInterval">60</Set>
	</New>
</Set>
<Call name="setAttribute">
	<Arg>jdbcIdMgr</Arg>
	<Arg>
		<Ref id="jdbcidmgr" />
	</Arg>
</Call>

修改上面XML片段中的数据库连接的URL,如果用其他关系数据库,还要修改数据库驱动。要注意在XML中&符号要转义成&amp;。

配置context xml:

在jetty的webapps目录下,新建一个XML文件,例如test.xml,这个XML用于配置一个web应用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
	<Set name="contextPath">/test</Set>
	<Set name="war">D:\test.war</Set>

	<Ref name="Server" id="Server">
		<Call id="jdbcIdMgr" name="getAttribute">
			<Arg>jdbcIdMgr</Arg>
		</Call>
	</Ref>

	<Set name="sessionHandler">
		<New class="org.eclipse.jetty.server.session.SessionHandler">
			<Arg>
				<New id="jdbcmgr" class="org.eclipse.jetty.server.session.JDBCSessionManager">
					<Set name="sessionIdManager">
						<Ref id="jdbcIdMgr" />
					</Set>
				</New>
			</Arg>
		</New>
	</Set>

</Configure>

其中,<Set name="war">D:\test.war</Set>配置web应用的war包,<Set name="contextPath">/test</Set>配置web应用的contextPath,例如http://localhost:8080/test。

启动Jetty测试:

在启动Jetty之前,还需要把MySQL驱动jar包放在lib/ext目录下。此外,还要创建好数据库,准备好war包。

一切就绪以后,就可以启动Jetty服务器测试Session是否已经保存在数据库中。

通过java -jar start.jar命令启动Jetty服务器,打开浏览器访问页面。可以看到在数据库中会生成两个表:jettysessionids、jettysessions,分别用于存储session id和session的信息。如果重启Jetty服务器,由于Session已经持久化到数据库中,所以Session不会丢失。

需要注意的是,由于Session保存的是Java对象,会通过Java的序列化写入数据库,也就是Session中的对象必须支持序列化和反序列化,即实现Serializable接口。

配置文件说明:

如果看不懂上面两段XML配置的话,这里做一个简单的说明。

上面的这些XML实际上是Jetty的IOC配置文件,说到IOC首先会想到Spring框架,实际上Jetty的IOC和Spring的IOC解决的问题是类似的,只是XML的格式有些区别。

Jetty的IOC配置也很好理解,例如<Set name="contextPath">/test</Set>即调用setContextPath("/test"),<Call name="getAttribute"><Arg>jdbcIdMgr</Arg></Call>即调用getAttribute("jdbcIdMgr"),<New class="org.eclipse.jetty.server.session.SessionHandler"></New>即为Java实例化对象new SessionHandler()。

将上面的两段XML“翻译”成Java代码:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.session.JDBCSessionIdManager;
import org.eclipse.jetty.server.session.JDBCSessionManager;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.webapp.WebAppContext;

public class Main {

	public static void main(String[] args) throws Exception {

		Server server = new Server(8080);

		// 以下对应jetty.xml的配置
		JDBCSessionIdManager sessionIdManager = new JDBCSessionIdManager(server);
		sessionIdManager.setWorkerName("fred");
		sessionIdManager.setDriverInfo("com.mysql.jdbc.Driver",
				"jdbc:mysql://192.168.20.1:3306/jetty_session?user=root&password=123");
		sessionIdManager.setScavengeInterval(60);
		server.setAttribute("jdbcIdMgr", sessionIdManager);

		// 以下对应context xml的配置
		WebAppContext webapp = new WebAppContext();
		webapp.setContextPath("/test");
		webapp.setWar("D:\\test.war");
		JDBCSessionIdManager jdbcIdMgr = (JDBCSessionIdManager) server.getAttribute("jdbcIdMgr");
		JDBCSessionManager sessionManager = new JDBCSessionManager();
		sessionManager.setSessionIdManager(jdbcIdMgr);
		SessionHandler sessionHandler = new SessionHandler(sessionManager);
		webapp.setSessionHandler(sessionHandler);

		// 启动服务器
		server.setHandler(webapp);
		server.start();
		server.join();
	}
}

运行Java代码,同样可以启动服务器,将Session存入数据库,实现同样的效果。

2、配置Session存储到MongoDB

配置jetty.xml:

打开etc/jetty.xml,在Configure元素内部加入XML片段:

<New id="mongodb" class="com.mongodb.MongoClient">
	<Arg type="java.lang.String">192.168.20.1</Arg>
	<Arg type="int">27017</Arg>
	<Call name="getDB">
		<Arg>jetty_session</Arg>
		<Call id="sessionDocument" name="getCollection">
			<Arg>jetty_session_collection</Arg>
		</Call>
	</Call>
</New>
<Set name="sessionIdManager">
	<New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager">
		<Arg>
			<Ref id="Server" />
		</Arg>
		<Arg>
			<Ref id="sessionDocument" />
		</Arg>
		<Set name="workerName">fred</Set>
		<Set name="scavengePeriod">60</Set>
	</New>
</Set>
<Call name="setAttribute">
	<Arg>mongoIdMgr</Arg>
	<Arg>
		<Ref id="mongoIdMgr" />
	</Arg>
</Call>

修改上面XML片段中的MongoDB的IP、端口号、数据库名、Collection名。

配置context xml:

在jetty的webapps目录下,新建一个XML文件,例如test.xml,这个XML用于配置一个web应用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/test</Set>
  <Set name="war">D:\test.war</Set>

  <Ref name="Server" id="Server">
    <Call id="mongoIdMgr" name="getSessionIdManager"/>
  </Ref>

  <Set name="sessionHandler">
    <New class="org.eclipse.jetty.server.session.SessionHandler">
      <Arg>
        <New id="mongoMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionManager">
          <Set name="sessionIdManager">
            <Ref id="mongoIdMgr"/>
          </Set>
        </New>
      </Arg>
    </New>
  </Set>

</Configure>

启动Jetty测试:

测试前,首先要吧两个jar包放在Jetty的lib/ext目录下,一个是MongoDB的驱动包,另一个是jetty-nosql的jar包,在http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-nosql/下载对应版本的jar包。此外,在MongoDB中创建好对应的数据库。

通过java -jar start.jar命令启动Jetty服务器,打开浏览器打开页面。可以看到在MongoDB中创建了配置的Collection并插入了数据:

“翻译”成Java代码:

将上面的两段Jetty的IOC配置文件转成Java代码,直接运行可以实现同样的功能:

import org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager;
import org.eclipse.jetty.nosql.mongodb.MongoSessionManager;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.webapp.WebAppContext;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;

public class Main {

	public static void main(String[] args) throws Exception {

		Server server = new Server(8080);

		// 以下对应jetty.xml的配置
		MongoClient mongoClient = new MongoClient("192.168.20.1", 27017);
		DB db = mongoClient.getDB("jetty_session");
		DBCollection collection = db.getCollection("jetty_session_collection");
		MongoSessionIdManager sessionIdManager = new MongoSessionIdManager(server, collection);
		sessionIdManager.setWorkerName("fred");
		sessionIdManager.setScavengePeriod(60);
		server.setAttribute("mongoIdMgr", sessionIdManager);

		// 以下对应context xml的配置
		WebAppContext webapp = new WebAppContext();
		webapp.setContextPath("/test");
		webapp.setWar("D:\\test.war");
		MongoSessionIdManager mongoIdMgr = (MongoSessionIdManager) server.getAttribute("mongoIdMgr");
		MongoSessionManager sessionManager = new MongoSessionManager();
		sessionManager.setSessionIdManager(mongoIdMgr);
		SessionHandler sessionHandler = new SessionHandler(sessionManager);
		webapp.setSessionHandler(sessionHandler);

		// 启动服务器
		server.setHandler(webapp);
		server.start();
		server.join();
	}
}

作者:叉叉哥   转载请注明出处:http://blog.csdn.net/xiao__gui/article/details/43271509

时间: 2024-08-23 10:48:44

Jetty集群配置Session存储到MySQL、MongoDB的相关文章

基于apache的tomcat负载均衡和集群配置session共享

接上面的话题接着继续完善.为什么没接到上篇呢?原因很简单太长的文章不爱看!就像有人写了上千行的方法一样,不是逼得没办法谁爱看谁看,反正我不看. 期间我没有一次配置成功,从失败的开始说起, 1.准备jar包 注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一样,需要针对tomcat版本下载对应的包. 这是采用的最新稳定版1.6 首先我到官网:http://code.google.com/p/memcached-session-manager/下载了最新的jar 由于公司网络

MySql 集群配置

MYSQL CLUSTER方案介绍 本文的大致框架来自罗志威.黄川的报告, 在它的基础上进行简化和修改一些bug并且添加了主从复制的章节,最后做出该文档 MySQL Cluster 是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.现在mysql cluster 被独立出来, 作为一个专门的产品进行运营, mysql-server-5.6+ 就不在存在对mysql cluster的支持,需要独立

mysql集群配置

最近好不容易抽空研究了下Cobar,感觉这个产品确实很不错(在文档方面比Amoeba强多了),特此推荐给大家.Cobar是阿里巴巴研发的关系型数据的分布式处理系统,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均每天处理近50亿次的SQL执行请求. 首先,使用Cobar的核心功能如下: 分布式: Cobar的分布式主要是通过将表放入不同的库来实现: 1. Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分 2.

Mysql、MariaDB 新型主从集群配置GTID

前文谢了<Mysql.MariaDB 传统主从集群配置>,该技术已经非常成熟.从Mysql5.6和MariaDB10.0开始,有了新型的主从方案GTID,不过这两个系统到这个版本出现了分支,具体实现已经不同,配置方法也不同,下文分别讲述. MariaDB: 我用的版本还是10.1版,目前该版本还不是稳定版,但不影响测试.先部署部署好两个数据库实例,参见http://bangbangba.blog.51cto.com/3180873/1701857 直到创建好复制用户. 我们这里的由于是新创建的

Linux环境MySQL集群配置

一.介绍 ======== 这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群.并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行. 注意! 虽 然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭.同时需要注意的是并不推荐在 集群启动完成后关闭作为管理节点的服务器.尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群就无法继 续正常工作了,这样也就失去了集群的意义了

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">

Web应用优化之nginx+tomcat集群配置+redis管理session

1.nginx的安装 从官网下载一个nginx事务tar.gz版本,centos系统,安装好jdk 第一步解压 第二步:解压完成进入解压目录,执行./configure命令 需要安装gcc编译和pcre库,zlib库 yum -y install gcc yum install pcre-devel yum install zlib-devel ./configure完成后执行make install即可安装成功 2.集群配置流程 一.克隆2台CentOS虚拟机,并安装jdk+tomcat 二.

Web集群实现共享存储的架构演变及MogileFS

本篇博客从Web集群中亟需解决的大容量存储问题引入,分析了几类常用的共享存储架构,重点解析了分布式存储系统的原理及配置实现: =================================================================== 1 共享存储的架构演变 2 分布式存储系统 2.1 基础知识 2.2 分类 2.3 CAP理论 2.4 协议 3 MogileFS 3.1 特性 3.2 架构 3.3 组成 3.4 服务安装及启动 3.5 配置部署 3.6 配置前端代理N

Quartz集群配置

Quartz集群配置(100%成功) 先看看quartz的持久化基本介绍: 引用 1 大家都清楚quartz最基本的概念就是job,在job内调用具体service完成具体功能,quartz需要把每个job存储起来,方便调度,quartz存储job方式就分三种,我们最常用的也是quartz默认的是RAMJobStore,RAMJobStore顾名思义就是把job的相关信息存储在内存里,如果用spring配置quartz的job信息的话,所有信息是配置在xml里,当spirng context启动