如何实现session共享的⼏种解决⽅案?
先了解⼀下为什么会出现这种session共享的解决⽅案?
随着互联⽹公司的项⽬在微服务和分布式的环境下进⾏的搭建,导致⼀个项⽬可能分别部署在⼏个甚⾄很多的服务器集下,此时就会出现⼀个问题
当⽤户进⾏⼀个session会话的时候,⽐如⼀个⽤户去登录项⽬,⼀般的⼤公司的项⽬都是有Nginx进⾏反向代理的,但是这⾥简单列举⼀下Nginx常⽤的⼏种反向代理策略:1.轮询策略,2. 权重⽐例策略,3. ip_hash策略,4. 还可以⾃定义的策略,在Nginx的反向代理下,⼀般会把⽤户的请求分发到不同的服务器上,但是如果⽤户请求的请求是存放在该请求的服务器A上,那么该⽤户的sessionID 就存储在该服务器上JVM的⼀个ConcurrentHashmap中,以sessionID为key。
但是如果此时⽤户请求的⼀个服务模块可能需要调⽤到服务器B,当⽤户发起请求的时候,此时的服务器B上并没有存储该⽤户的sessionID,所以就会再次让⽤户进⾏⼀个登陆操作。还有可能会导致⽤户本来就想完成⼀个下单操作,但是却还登陆了好⼏次的情况。
所以session共享⽅案在分布式环境和微服务系统下,显得尤其重要。
解决⽅案⼀:基于Nginx的ip_hash 负载均衡
其实就是对请求过来的ip地址对你的多少台可⽤的服务器进⾏取模,然后就会把你的请求通过Nginx的反向代理给分发到对应的服务器上。(这⾥会把可⽤的服务器放到⼀个数组中,如果取模得到的结果是⼏,就把请求分到服务器数组中的下标为⼏ 的服务器上)
具体实现:
需要你在f⽂件中进⾏对应的修改,根据⾃⼰的可⽤服务器
upstream backend{
ip_hash;
server 192.168.128.1:8080 ;
server 192.168.128.2:8080 ;
server 192.168.128.3:8080 down;
server 192.168.128.4:8080 down;
}
server {
listen 8081;
server_name test.csdn;
root /home/system/test.csdn/test;
location ^~ /Upload/upload {
proxy_pass backend;
}
}
这种实现的优缺点:
解决⽅案⼆:基于Tomcat的session复制
这个解决⽅案其实就是当⽤户请求的时候,把产⽣的sessionID给复制到系统所有的服务器中,这样就能保证当⽤户请求的时候从服务器A可能调⽤到服务器B上的模块的时候,也能保证服务B也有该⽤户
的sessionID,这样就不会再次让⽤户进⾏再次登录操作了。也就解决问题了。
具体代码中如何实现session复制呢?
使⽤session复制的优缺点:
解决⽅案三:使⽤Redis做缓存session的统⼀缓存
这种⽅案呢,其实就是把每次⽤户的请求的时候⽣成的sessionID给放到Redis的服务器上。然后在基于Redis的特性进⾏设置⼀个失效时间的机制,这样就能保证⽤户在我们设置的Redis中的session失效时间内,都不需要进⾏再次登录。
如何进⾏代码的实现:session如何设置和读取
使⽤Redis实现session共享的优缺点:
解决⽅案四:其实还可以把session放到cookie中去,因为每次⽤户请求的时候,都会把⾃⼰的cookie放到请求中,所以这样就能保证每次⽤户请求的时候都能保证⽤户在分布式环境下,也不会在进⾏⼆次登陆。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论