欢迎来到天天爱彩票手机版下载_天天爱彩票手机版苹果_天天爱彩票最新版下载! 联系我们 网站地图

天天爱彩票手机版下载_天天爱彩票手机版苹果_天天爱彩票最新版下载

0379-65557469

节能报告
全国服务热线
0379-65557469

电话: 0379-65557469
0379-63930906
0379-63900388 
0379-63253525   
传真: 0379-65557469
地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室 

节能报告
当前位置: 首页 | 咨询案例 > 节能报告

分布式 Session 解决方案

作者:admin 发布时间:2019-07-11 21:30:36 浏览次数:118
打印 收藏 关闭
字体【
视力保护色
  • 分布式Session存在的问题?
  • 现在项目中存在的问题
  • 怎么处理这两个服务之间的同享问题呢?

分布式Session共同性?

说白了便是服务器集群Session同享的问题

Session的效果?

Session 是客户端与服务器通讯会话盯梢技能,服务器与客户端坚持整个通讯的会话根本信息。

客户端在第一次拜访服务端的时分,服务端会呼应一个sessionId而且将它存入到本地cookie中,在之后的拜访会将cookie中的sessionId放入到恳求头中去拜访服务器,假如经过这个sessionid没有找到对应的数据那么服务器会创立一个新的sessionid而且呼应给客户端。

分布式Session存在的问题?

假定第一次拜访服务A生成一个sessionid而且存入cookie中,第2次却拜访服务B客户端会在cookie中读取sessionid参加到恳求头中,假如在服务B经过sessionid没有找到对应的数据那么它创立一个新的而且将sessionid回来给客户端,这样并不能同享咱们的Session无法到达咱们想要的意图。

处理方案:

  • 运用cookie来完结(很明显这种不安全的操作并不牢靠)
  • 运用Nginx中的ip绑定战略,同一个ip只能在指定的同一个机器拜访(不支持负载均衡)
  • 运用数据库同步session(功率不高)
  • 运用tomcat内置的session同步(同步可能会发生推迟)
  • 运用token替代session
  • 咱们运用spring-session以及集成好的处理方案,存放在redis中

现在项目中存在的问题

发动两个项目端口号分别为8080,8081。

依靠:



org.springframework.boot
spring-boot-start分布式 Session 解决方案er-parent
2.1.1.RELEASE





org.springframework.boot
spring-boot-starter-web


创立测验类:

/**
* Author: SimpleWu
* date: 2018/12/14
*/
@RestController
public class TestSessionController {
@Value("${server.port}")
private Integer projectPort;// 项目端口
@RequestMapping("/createSession")
public String createSession(HttpSession session, String name) {
session.setAttribute("name", name);
return "当时项目端口:" + projectPort + " 当时sessionId :" + session.getId() + "在Session中存入成功!";
}
@RequestMapping("/getSession")
public String getSession(HttpSession session) {
return "当时项目端口:" + projectPort + " 当时sessionId :" + session.getId() + " 获取的名字:" + session.getAttribute("name");
}
}

yml装备:

server:
port: 8080

修正映射文件

#将本机ip映射到www.hello.com上
127.0.0.1 www.hello.com

在这里咱们敞开nginx集群,修正装备:

#参加
#默许运用轮询,
upstream backserver{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
#修正server中的local
location / {
proxy_pass http://backserver;
index index.html index.htm;
}

咱们直接经过轮询机制来拜访首要向Session中存入一个名字,http://www.hello.com/createSession?name=SimpleWu

当时项目端口:8081 当时sessionId :0F20F73170AE6780B1EC06D9B06210DB在Session中存入成功!

由于咱们运用的是默许的轮询机制那么下次必定拜访的是8080端口,咱们直接获取以下方才存入的值http://www.hello.com/getSession

当时项目端口:8080 当时sessionId :C6663EA93572FB8DAE27736A553EAB89 获取的名字:null

这个时分发现8080端口中并没有咱们存入的值,而且sessionId也是与8081端口中的不同。

别急持续拜访,由于轮询机制这个时分咱们是8081端口的服务器,那么之前咱们是在8081中存入了一个小吃名字。那么咱们现在来拜访以下看看是否能够获取到咱们存入的名字:SimpleWu,持续拜访:http://www.hello.com/getSession

当时项目端口:8081 当时sessionId :005EE6198C30D7CD32FBD8B073531347 获取的名字:null

为什么8080端口咱们没有存入连8081端口存入的都没有了呢?

咱们仔细观察一下第三次拜访8081的端口sessionid都不相同了,是由于咱们在第2次去拜访的时分拜访的是8080端口这个时分客户端在cookie中获取8081的端口去8080服务器上去找,没有找到后从头创立了一个session而且将sessionid呼应给客户端,客户端又坚持到cookid中替换了之前8081的sessionid,那么第三次拜访的时分拿着第2次拜访的sessionid去找又找不到然后又创立。一向重复循环。

怎么处理这两个服务之间的同享问题呢?

spring现已给咱们想好了问题而且现已提供出处理方案:spring-session 不了解的能够去百度了解下。

咱们首要翻开redis而且在pom.xml中增加依靠:


com.alibaba
fastjson
1.2.47


org.springframework.boot
spring-boot-starter-data-redis



org.springframework.session
spring-session-data-redis


org.apache.commons
commons-pool2


redis.clients
jedis

修正yml装备文件:

server:
port: 8081
spring:
redis:
database: 0
host: localhost
port: 6379
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
timeout: 10000
redis:
hostname: localhost
port: 6379
#password: 123456

增加Session装备类

/**
* Author: SimpleWu
* d分布式 Session 解决方案ate: 2018/12/14
*/
//这个类用装备redis服分布式 Session 解决方案务器的衔接
//maxInactiveIntervalInSeconds为SpringSession的过期时刻(单位:秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
// 冒号后的值为没有装备文件时,制动装载的默许值
@Value("${redis.hostname:localhost}")
private String hostName;
@Value("${redis.port:6379}")
private int port;
// @Value("${redis.password}")
// private String password;
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory();
connection.setPort(port);
connection.setHostName(hostName);
//connection.setPassword(password);
// connection.setDatabase(0);
return connection;
}
}

初始化Session装备

/**
* Author: SimpleWu
* date: 2018/12/14
*/
//初始化Session装备
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer {
public SessionInitializer() {
super(SessionConfig.class);
}
}

然后咱们持续发动8080,8081来进行测验:

首要存入一个名字http://www.hello.com/createSession?name=SimpleWu:

当时项目端口:8080 当时sessionId :cf5c029a-2f90-4b7e-8345-bf61e0279254在Session中存入成功!

应该轮询机制那么下次一定是8081,居然现已处理session同享问题了那么必定能够获取到了,居然这样那么咱们直接来获取下名字http://www.hello.com/getSession:

当时项目端口:8081 当时sessionId :cf5c029a-2f90-4b7e-8345-bf61e0279254 获取的名字:SimpleWu

这个时分咱们发现不只能够获取到值而且连sessionid都共同了。

完成原理:

便是当Web服务器接收到http恳求后,当恳求进入对应的Filter进行过滤,将原本需求由web服务器创立会话的进程转交给Spring-Session进行创立,原本创立的会话保存在Web服务器内存中,经过Spring-Session创立的会话信息能够保存第三方的服务中,如:redis,mysql等。Web服务器之间经过衔接第三方服务来同享数据,完成Session同享!

来历:http://tinyurl.com/yyn39gfm


:-D 查找微信号(ID:芋道源码),能够获得分布式 Session 解决方案各种 Java 源码解析、原理解说、面试题、学习指南。

:-D 而且,回复【书本】后,能够收取笔者引荐的各种 Java 从入门到架构的 100 本书本。

:-D 而且,回复【技能群】后,能够参加专门评论 Java、后端、架构的技能群。

来吧,骚年~

版权所有:洛阳市建设工程咨询有限责任公司 联系人:李经理 电话: 地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室
版权所有 天天爱彩票手机版下载 苏ICP备123838753号-6