大型网站分布式架构(十)—— Springboot + SpringSession + Redis实现Tomcat集群Session共享
前言
上一章我们集群给web服务带来的关于会话Session的问题——大型网站分布式架构(九)—— 从Cookie机制到会话Session再到集群中Session的场景,这一章博主就通过Redis来解决集群中会话的状态的保持。
首先我们需要完成以下准备
Nginx:
Tomcat:
大型网站分布式架构(二)—— Linux下Tomcat的安装和项目部署
大型网站分布式架构(七)—— Nginx整合Tomcat实现动静分离
大型网站分布式架构(八)—— Tomcat集群横向拓展 + Nginx负载均衡
Web项目:该项目在各章节中都有些许的改变
Redis数据库:
修改pom.xml
[code]<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zaomianbao</groupId> <artifactId>appdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <!--<packaging>jar</packaging>--> <name>appdemo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- SpringSession 相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> </dependencies> <build> <finalName>appdemo</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
修改application.properties
添加以下内容
[code]#Redis所在主机IP spring.redis.host=192.168.214.150 #Redis端口 spring.redis.port=6379
[code]对应自己的Redis的ip和端口
添加RedisSessionConfig配置类
代码如下
[code]package com.zaomianbao.appdemo; import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @Configuration @EnableRedisHttpSession public class RedisSessionConfig { }
部署项目
[code][root@centos6-1 webapps]# rz rz waiting to receive. Starting zmodem transfer. Press Ctrl+C to cancel. Transferring appdemo.war... 100% 24822 KB 12411 KB/sec 00:00:02 0 Errors [root@centos6-1 webapps]# ll total 24844 -rw-r--r--. 1 root root 25418170 Aug 28 2018 appdemo.war drwxr-xr-x. 14 root root 4096 Aug 20 08:19 docs drwxr-xr-x. 6 root root 4096 Aug 20 08:19 examples drwxr-xr-x. 5 root root 4096 Aug 20 08:19 host-manager drwxr-xr-x. 5 root root 4096 Aug 20 08:19 manager drwxr-xr-x. 3 root root 4096 Aug 20 08:19 ROOT [root@centos6-1 webapps]# scp -r appdemo.war root@centos6-2:$PWD appdemo.war 100% 24MB 24.2MB/s 00:00 [root@centos6-1 webapps]# scp -r appdemo.war root@centos6-3:$PWD appdemo.war
重启Tomcat
这里看情况,热部署就不需要重启
[code][root@centos6-1 bin]# ./shutdown.sh [root@centos6-1 bin]# ./startup.sh [root@centos6-2 bin]# ./shutdown.sh [root@centos6-2 bin]# ./startup.sh [root@centos6-3 bin]# ./shutdown.sh [root@centos6-3 bin]# ./startup.sh
如果shutdown不能关闭tomcat,直接使用kill即可
浏览器访问
1.直接访问不带参数
2.携带random参数访问
3.多次刷新直接访问不带参数
可以看到,当random参数的值被注入到session中后,集群中所有的节点都能够拿到session中的random的值,可见Session在集群中实现了共享。
Redis中的Session存储形式
总结
到这里我们便已经解决了Session共享的问题。到这里其实我们的整个web服务的架构还存在单点故障的隐患,那就是nginx服务。因为Nginx是整个web服务的入口,如果nginx服务挂了,那么整个web服务将不能再向外提供服务,几十Tomcat集群完好无损,所以,保证Nginx的高可用是我们需要解决的一个问题。下一张博主带大家实现Nginx的高可用。
---------------------
作者:枣面包
来源:CSDN
原文:https://blog.csdn.net/weixin_37490221/article/details/82154266
版权声明:本文为博主原创文章,转载请附上博文链接!
- 搭建nginx+tomcat+memcache三套集群,开发简单springboot工程,实现session共享(持续更新中)
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- Spring+Shiro+Redis实现tomcat集群session共享问题
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- SpringBoot+redis 实现shiro集群,共享session。亲测可用
- springboot项目Nginx+Tomcat实现负载均衡结合Redis实现session共享问题
- 分布式架构学习之:032--使用Redis3.0集群实现Tomcat集群的Session共享
- 分布式架构学习之:使用Redis3.0集群实现Tomcat集群的Session共享
- 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享
- 使用springboot+redis实现session共享
- spring boot + redis 实现session共享
- 分布式集群Session共享 简单多tomcat8+redis的session共享实现
- 使用springboot+redis实现session共享
- spring boot之Session实现集群-redis
- CentOS7 Nginx+Redis+Tomcat集群实现session保持和共享
- 使用Tomcat+Redis来实现集群部署中的Session共享问题
- 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题
- SpringBoot+Redis+Nginx实现负载均衡以及Session缓存共享