Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
小伙伴们好久不见!最近略忙,博客写的有点少,嗯,要加把劲。OK,今天给大家带来一个JavaWeb中常用的架构搭建,即Nginx+Tomcat搭建服务集群,然后通过Spring Session+Redis实现Session共享。
阅读本文需要有如下知识点:
1.Nginx的安装、配置
2.Spring+SpringMVC基本配置
3.Redis缓存的使用
Nginx和Redis我打算后期写几篇博客来介绍,这里小伙伴如果对这两个概念不懂的话可以先自行百度,对于Spring+SpringMVC的使用如果小伙伴有疑问,可以移步这里Spring&SpringMVC框架。
创建Maven项目,添加依赖
使用IntelliJ IDEA创建Maven项目,并添加相关依赖,依赖如下:
<dependencies>
<!-- Jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- Spring Data Redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.4.RELEASE</version>
</dependency>
<!-- Spring Session -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<!-- Apache Commons Pool -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-framework.version}</version>
</dependency>
</dependencies>
这里要添加的依赖略多,不过大致可以分为如下三类:
1.Redis的Java客户端,这个通过Java代码来操作Redis
2.Spring Data Redis,这个用来简化Redis操作
3.Spring Session,这个用来进行Session的管理
4.Spring
搭建Spring+SpringMVC环境
首先在resources文件夹下创建spring+springmvc的配置文件:
然后在web.xml文件中配置spring和springmvc,如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然后在applicationContext.xml文件中简单的配置一下spring,如下:
<context:component-scan base-package="org.sang" use-default-filters="false">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
配置Spring容器要扫描的注解。
然后在spring-servlet.xml中配置SpringMVC容器要扫描的注解,如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="org.sang" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
spring-servlet.xml的配置相对要简单一些。
OK,至此,Spring+SpringMVC的环境就搭建成功了。
配置Spring Session和Redis
Session一直是我们做集群时一个比较头疼的问题,之前有一个GitHub上的开源控件tomcat-redis-session-manager,但是这个东西目前只支持到Tomcat7,不是最佳选项,我们也可以使用Nginx提供的ip_tables,将同一个请求ip定位到同一台服务器上,但是这样没有办法充分利用服务集群的性能,Spring Session的出现可以很好的帮助我们解决这些问题,它具有如下特点:
1.Spring Session提供了redis、jvm的map、mongo、gemfire、hazelcast、jdbc等多种存储session的容器的方式。
2.同一个浏览器同一个网站,支持多个session。
3.不依赖于cookie。可通过header来传递sessionID
4.WebSocket和spring-session结合,同步生命周期管理。
5.使用简单
OK,接下来我们来看看怎么配置我们的Spring Session,首先在web.xml文件中添加过滤器:
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这里使用了Spring Web提供的代理过滤器,将拦截到的请求全部交给一个名为springSessionRepositoryFilter的过滤器进行处理。OK,然后在applicationContext.xml中配置Spring Session和Redis,如下:
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="192.168.248.128"/>
<property name="port" value="6379"/>
<property name="database" value="0"/>
</bean>
hostName即为redis的地址,port为redis的服务端口。
OK,写完这一切就OK了,我们来写一个简单的jsp页面测试一下,测试前记得启动你的redis服务哦。
测试
index.jsp页面如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/setsession">
<input type="text" name="name"><input type="submit" value="提交">
</form>
<form action="/getsession">
<input type="submit" value="获取">
</form>
</body>
</html>
该页面我尽量做得简单,有两个按钮,第一个向session中存数据,第二个按钮从session中取数据,对应的Controller如下:
@Controller
public class HelloController {
@RequestMapping("/setsession")
@ResponseBody
public void setSession(HttpSession session, String name) {
session.setAttribute("name", name);
}
@RequestMapping(value = "/getsession",produces = "text/html;charset=utf-8")
@ResponseBody
public String getSession(HttpSession session, HttpServletRequest req) {
return session.getAttribute("name").toString()+"-----"+req.getServletContext().getRealPath("/");
}
}
当我向httpsession中写数据时,这些数据会自动存储到redis缓存/数据库中。在返回session数据时我加上了项目部署路径,是为了在部署到集群上之后区分这个请求是由哪台服务器处理的。启动项目,页面如下:
点击提交,会将数据保存到redis 中,如下:
然后再回到起始页面,点击获取按钮,即可以拿到Session中的值,如下:
OK,很简单吧!
至此,我们的Spring Session+Redis实现Session共享这个功能就完成了。接下来我们来看看如何为这个简单的web项目搭建集群。
搭建集群的准备工作
1.下载Nginx(地址http://nginx.org/),我这里使用的Nginx版本是nginx-1.12.0
2.下载Tomcat,我这里使用的Tomcat版本是apache-tomcat-8.5.12
网络拓扑图如下:
将下载的Tomcat复制成两份,如下:
修改Tomcat的配置文件(conf/server.xml),重新设置端口号,每一个Tomcat的server.xml都需要修改三处,如下:
要修改的地方有三处,我将给默认的端口号前面都加1,然后第二个Tomcat我给这三个地方的端口号前面都加2,这样方便我一会在同一台机器上跑多个Tomcat。
OK,做好这一切之后,可以先启动这两个Tomcat,看看能不能正常访问。
部署项目
OK,两台Tomcat都配置好之后,我们将刚才的项目拷贝到tomcat的webapps目录下,给两个Tomcat都拷贝。这里就不赘述了。
配置Nginx
下载Nginx,解压后,配置conf/nginx.conf文件,如下:
配置完成后,启动nginx。再测试。
测试
向session中存数据:
从session中取数据:
多取几次,你会看到请求是由不同的服务器处理的,如下:
OK,至此,我们的所有工作就做完啦!有问题欢迎留言交流。项目下载地址:
http://download.csdn.net/detail/u012702547/9866761
关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!
以上。
Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享的更多相关文章
- Nginx + Tomcat搭建集群
一.Tomcat集群带来的好处 1.提高服务的性能,并发能力,以及高可用性 2.提供项目架构的横向扩展能力 二.Tomcat集群实现原理 通过Nginx负载均衡进行请求转发 三.Nginx + Tom ...
- nginx+tomcat实现集群,redis实现session共享,软连接实现文件共享:http://blog.csdn.net/hua1586981/article/details/78132710
转载 2017年02月08日 16:52:41 730 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额.那究竟它有什么作用呢?可能很多人未必了解. 说到反向代理,可能 ...
- 图文解说:Nginx+tomcat配置集群负载均衡
图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用 作者:niumd Blog:http://ari.iteye ...
- Nginx+Tomcat+MemCached 集群配置手册
系统实施文档 Nginx+Tomcat+MemCached 集群配置手册 目 录 第1章 概述 1.1 目标 互联网的快速发展带来了互联网系统的高负载和高可用性, 这要求我们在设计系统架 ...
- Nginx集群配置与redis的session共享策略
一.什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ramb ...
- nginx与tomcat搭建集群,负载均衡
--------------------------------------------------- 搭建环境(在桌面上即可完成测试) 先准备2个tomcat服务器 解压tomcat压缩包 得到 把 ...
- Nginx+Tomcat+Memcached 集群
写过一篇 Apache Httpd+Tomcat 的集群, 现在来看看Nginx+Tomcat+Memcached是怎么集群的. 先看看用的版本和工具: Nginx: nginx-1.8.1 Tomc ...
- 注意这几点,轻轻松松配置 Nginx + Tomcat 的集群和负载均衡
Tomcat 集群是当单台服务器达到性能瓶颈,通过横向扩展的方式提高整体系统性能的有效手段.Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,可以通过简单的配置实现 Tomcat 集群 ...
- 用apache和tomcat搭建集群,实现负载均衡
型的企业应用每天都需要承受巨大的访问量,在着巨大访问量的背后有数台服务器支撑着,如果一台服务器崩溃了,那么其他服务器可以使企业应用继续运行,用户对服务器的运作是透明化的,如何实现这种透明化呢?由如下问 ...
随机推荐
- Codeforces 813C The Tag Game (BFS最短路)
<题目链接> 题目大意:A.B两人在一颗树上,A在根节点1上,B在节点x上,现在他们轮流走,每次只能走一步,或者不走.A以尽可能靠近B的方式行走,B以尽可能远离A的方式走,B先开始走.问你 ...
- tp5 mkdir(): Permission denied 问题
今天使用tp5 线上上传图片的时候遇到了一个问题 mkdir(): Permission denied 如图 百度了一下 发现大家都说 chmod -R 777 runtime 能解决问题 尝试了一下 ...
- git创建本地分支以及推送本地分之至远程分支
Git分支策略 实际开发中,应当按照以下几个基本原则进行管理: 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能再上边干活. 那在哪干活呢?干活都在dev分支上,也就是说,de ...
- 安装es6编译babel
1.它的安装命令如下. 全局安装 :$ npm install --global babel-cli项目下安装: $ npm install -g babel-cli --save-dev 2.配置. ...
- 20181115 python-第一章学习小结part2
Python基本知识 变量,用来存储中间计算结果,在后面可进行调用被使用的东西,叫做变量. 变量的命名规则: 字母,数字,下划线组合 不能用数字开头 常见的关键字不能用啊 常量,不会变的量,称作常量. ...
- vue实现二级联动效果
你如城市与省份间的二级联动效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- 微信小程序之canvas绘制海报分享到朋友圈
绘制canvas内容 首先,需要写一个canvas标签,给canvas-id命名为shareBox <canvas canvas-id="shareBox"></ ...
- python 面试题知识回顾
1. python 函数 的参数传递 a = 1 def fun(a): a = 2 fun(a) print a # 1 a = [] def fun(a): a.append(1) fun(a) ...
- 批量引用iconfont字体图标到项目
打开https://www.iconfont.cn/网址登录后选择你需要的图标添加到购物车中 点击下载代码或者添加到项目后再下载代码,再找到之前下载的的文件,拷贝到项目中
- R语言S3类的理解与构建
R语言类 R语言的类有S3类和S4类,S3类用的比较广,创建简单粗糙但是灵活,而S4类比较精细,具有跟C++一样严格的结构.这里我们主要讲S3类. S3类的结构 S3类内部是一个list,append ...