在这样的架构中,会出现一些单服务中不存在的问题,例如客户端发起一个请求发到 Tomcat A 上,然后在 Tomcat A 上往 session 中保存了一份数据,下次又来一个请求,这个请求被转发到 Tomcat B 上,此时再去 Session 中获取数据,发现没有之前的数据。对于这一类问题的解决,思路很简单,就是将各个服务之间需要共享的数据,保存到一个公共的地方.
seesion共享:
使用Redis实现session共享原理如下,简单来说就是把session存到redis中去!多个服务器都能够通过Redis共享这个Session,因此我们在访问不同的服务器时,虽然不是原来拥有session服务器,但是我们仍然可以通过Redis共享的session进行成功的访问!
Spring Session作用
Spring Session 就是使用 Spring 中的代理过滤器,将所有的 Session 操作拦截下来,自动的将数据 同步到 Redis 中,或者自动的从 Redis 中读取数据。
对于开发者来说,所有关于 Session 同步的操作都是透明的,开发者使用 Spring Session,一旦配置完成后,具体的用法就像使用一个普通的 Session 一样。
为什么引入security?
spring 2.1.5开始,远程连接Redis必须引入Spring security,这里虽然仅仅在本地进行,但是后面远程连接服务器,仍会用到这个示例。
一、服务器相关配置和安装
1.开放8080端口
&6379端口
方式一:在阿里云平台开放
阿里云服务器ECS处于安全考虑默认自带安全组(仅开放了22号和3389号端口),Tomcat的默认端口号为8080,所以想使用Tomcat不开放8080端口是不行的。很多用户通过修改iptables来开放8080号端口,结果失败,这是由于安全组,对安全组,阿里云亘古不变的安全组开放端口问题。
如果不配置80端口会导致nginx欢迎界面无法返回!
参考链接:阿里云ECS云服务器如何开放8080端口?
方式二:使用防火墙开放
参考链接:CentOS7防火墙、端口开放常用命令
3.Redis安装配置
参考链接:Aliyun租了ESC服务器,第一件事我用它安装Redis
二、创建SpringBoot工程
选用依赖:
application.properties
配置文件下面配置我们的Redis
spring.redis.host=121.40.83.80 #远程服务器ip
spring.redis.port=6379 #Redis默认端口
spring.redis.password=123456 #Redis密码
spring.redis.database=0 #Redis数据
server.port=8080
如果对密码设置有疑问 参考链接:Aliyun租了ESC服务器,第一件事我用它安装Redis
写控制类接口
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
public class TestController {
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/set")
public String set(HttpSession session) {
session.setAttribute("user", "alvin");
return String.valueOf(port);
}
@GetMapping("/get")
public String get(HttpSession session) {
return session.getAttribute("user") + ":" + port;
}
}
}
三、将项目打包成jar
包并运行
1.将项目打包为jar包
2.分别在8080
和8081
端口执行jar
包
- 8080
cd target
java -jar session-0.0.1-SNAPSHOT.jar
- 8081
cd target
java -jar session-0.0.1-SNAPSHOT.jar server.port=8081
此时我们已经执行了两个seesion实例,这样我们可以通过登录来验证他们是否进行了session共享
3. 登陆验证
首先测试8080端口
:
因为加入了SpringSecurity因此需要输入密码
测试8081端口:
不难发现,虽然8080和8081端口密码并不一致,但是此时,8081端口已经无需登录,就可以进入页面,说明已经实现了session共享!
远程服务器Redis中也已经缓存了我们的session数据
参考链接:
https://yq.aliyun.com/articles/701181
https://github.com/lenve/javaboy-code-samples
https://www.runoob.com/linux/nginx-install-setup.html