单点登录Redis存储Session及SessionId问题说明与集群实战-1 - Go语言中文社区

单点登录Redis存储Session及SessionId问题说明与集群实战-1


断点已经到这儿了,sessionId我们看一下,sessionId是B218,我们把value copy一下

放到这里,然后让Redis存上,key就是session的id,value就是user,后边就是有效期,30分钟,然后F8,

我们检查一下redis,先开一个窗口,然后进入redis,可以看到这个key已经存在这里了,我们再get一下,

这里面就是user的登陆信息,这个没有关系,存的是汉字,type一下,这个key是一个string,因为我们把这个对象

JSON序列话存在这里了,那我们看一下他的有效期,1759,还有1759秒,30分钟,那第二次就变了,现在倒计时,现在已经

把用户信息存到这里了

然后我们继续看,这块非常重要,涉及的点也比较多,包括redis,cookie,还有我们的JAVA代码,还有tomcat,

一会我们还会把nginx加在这里,所以这里相对来说比较复杂,那也正因为复杂,难度高,所以对我们来说,才不能放弃,

越是难的点,我们越要沉下心来,好好学,这个就是弯车到,我们就要在这里超过别人,毕竟还是有门槛的,那我们继续,

刚才就是给大家打打气,咱们看一下,localhost,刷新一下,看一下,network刷新,看这里的请求,可以看到,他JESSIONID,

正是我们拿的sessionId,在request-header里面

把这个也放过来,放到这里,把前面的删掉,可以看到呢,这两个sessionId是一样的

在Application里面,有一个cookie,点开他,在这里可以看到,这里面的value也是sessionId,那这个就是JSESSIONID

那这个就是JSESSIONID,放到这里,可以看到呢,request里面这个sessionId,正是我们在后台拿到的sessionId,

这个就是为了对比看一下,这个值是不是我们想要的,接下来因为我们要做集群,那对tomcat1是OK了,每次他的JSESSIONID

都是这个,他的用户信息也都能找到,根据这个JESSIONID,拿这个value也能拿到,那我们现在就要模拟集群的情况,我们再开

一个TOMCAT2,但是IDEA不能同时打开两个窗口,就是说对于同一个项目,在open的时候,没有反应,那很简单,看一下,我们复制一下

项目,tomcat2,然后再打开他,现在我们就要多进程debug了,我们有两个进程,把tomcat2用idea打开,这个是tomcat2,也放到这里,

那tomcat2呢,肯定不能向tomcat1一样,我们这里只要把它部署到tomcat2里面,我们新建一个tomcat,那这里也不需要新增了,我们把

这个1改一下就可以了,但是重要的是这里,一定要把tomcat server改成tomcat2,然后是9080端口,然后启动tomcat2,在新的tomcat2

里面debug启动,这里报错了,是因为rmi端口已经在用了,我们修改一下

但是呢,这里强调一下,就是在我们tomcat里面,之前讲的那三个端口,一定是已经改好的状态,并且tomcat1和tomcat2都OK,

那我们在启动tomcat2的时候,JMX端口改一下,同样加一千,检查一下,9080,2099,Tomcat2 OK,然后我们再启动一下debug,

我们访问一下,9080,8080和9080都访问上了,为了更清楚一点呢,我们把jsp也改一下,这个是tomcat2的,左边这个是tomcat1的,

然后我们刷新tomcat1和tomcat2,可以看到tomcat1报错了,然后我们把tomcat1重启,因为我们刚刚在创建UserController的时候,

加了一些代码,这边还是有改动的,重启一下tomcat1,然后访问一下tomcat1,那么tomcat2也重启一下,tomcat2也启动了,从首页

很清楚的分辨出来,那现在问题来了,我们再看一下,因为tomcat1刚刚重启了,我们看一下他的network,可以看到JSSIONID已经变了

也就是说TOMCAT在重启的时候,REQUEST里面的JSESSIONID,已经改变,那我们之前登陆的呢,是白登陆了,因为他的key是

B218,不是456,那有的小伙伴可能会说,那我的服务放到现在就不重启了,那这个JSESSIONID是不变的,对,是这样的,那就是说,

那tomcat1登陆信息是有效地,我们假设这个是成立的,我们这个服务器永远不重启,那我们继续,那我们自己来认证,看一下

tomcat2的,检查,看一下TOMCAT2的JSESSIONID

B6A0肯定也不是我们这个,那很简单,我们清空一下

flushdb

keys *

操作给你看,同样的,8080断点肯定过来了

看一下Redis

keys *

81B49

那这次请求的是81B49,TOMCAT1

再刷新一下,还是81B49,那81B49已经存到REDIS里边,没有问题

那现在的问题是,因为我们是要做成集群的,那我们下次请求,请求到localhost 9080呢,刷新tomcat2,

看一下tomcat2的JSESSIONID,存的是2B26

那我要说的是,我们登录在8080上,8080的session存到了redis服务器里,第二次请求,负载均衡到9080,而这里面的

JSESSIONID,是另外一个,那根据这个key,我们在redis里,肯定是找不到的,那会认为请求9080,认为他没有登录,那我们继续

来测试,很简单,我们继续开一个端口,我们要干什么呢,打开我们的nginx,然后请求localhost,nginx已经启动,现在我们开始

配置host,来模拟这个集群,进一下conf,之前我们用的是imoc.com,这个就是我们的线上,做的这么一个电商的服务,那我们在

本地开发的时候,就开始模拟了,很简单,我们把imoc.com.cnf,copy一份出来,happymall.com.cnf,然后我们编辑他,那server就要

改一下了,这里也是happymall.com,分别是8080和9080,这两个权重都是1,然后接着往下看,那么servername也要改一下,请求

happymall.com,然后proxy_mall改成happymall.com,上面的upstream也要改

我们把它置成bak,以bak为结尾就不会被加载进来

现在只有这么一个配置文件,reload一下

sudo ./nginx -s reload

然后编辑我们的host

vim /etc/hosts

聪明的小伙伴呢,一定会想到,把这个打开,127.0.0.1指向happymall.com,那这里面我要讲一个扩展的知识点,我们再写一个

127.0.0.1,user.happymall.com,很简单,我们的项目不断演进,我们会把用户中心单独抽取出去,成立一个二级域名,

user.happymall.com,所有关于登陆,权限,各种验证,都将走user.happymall.com,这个是为了以后演进,放到这里,做一个知识点

扩展,那首先还是关注我们的www,user会领着大家来测试,后边使用cookie,操作cookie时候的一些操作

就得保存我们的host文件,然后ping一下

ping www.happymal.com

ping一下user.happymall.com

虽然我们线上没有user,这个二级子域名,但是我们一会演示cookie的时候,讲解domain非常重要的一个知识点,

那我们继续,回到浏览器,那这个我们现在看到的网站,是在配置host,之前你所看到的网站,那请求的是一个正常的

网站,那host已经配置完了,我们再请求一下,看到还没有生效,那我们清空一下浏览器,清除浏览器,再请求一下,这个时候

已经提示502,Gate way,没关系,那我们可以把浏览器全部关闭之后,再重新reload一下,因为我们reload是在配置,host之前,

所以我们再reload一下

sudo ./nginx -s reload

然后再刷新,OK,也就是说,我们配置完host,之前reload的,那为什么出现问题呢,来一起来看一下,很简单,我们这个配置文件

是这么写的,写的是happymall.com,并不是127.0.0.1:8080,happymall我们在加载nginx的时候,他并没有指向127.0.0.1,因为那个

时候,host还没配置,所以如果我们这个配置文件配置的是,域名这种方式,我们本地host一定要reload之前,配置好,并且使他生效,

然后再reload nginx的配置,那或者还有一种方式,我们把server里面的节点,配置成127.0.0.1:8080,因为它是不需要通过host来

进行解析了,哪还有一种保守的方法,无论你这里面是配域名,还是127.0.0.1,我们在host修改完之后,都reload一下即可

同样的还要注意,像window,linux,部分浏览器的版本,要清空浏览器的数据,清除浏览器数据,关闭所有的浏览器,

重新打开,然后再重新请求,我们现在刷新一下,可以看到,这里面很明显,一会tomcat1,一会tomcat2,因为我们是有

权重的,那现在问题来了,现在域名请求happymall.com,我们再请求一个,user.happymall.com,这个呢因为我们没有

配置nginx配置,他就跳到本地localhost,80端口,正常的,这个呢也生效了,那一会我们要讲一下,我们继续,那现在请求

happymall.com,就是刚刚说的,登陆sessionId的问题,TOMCAT1和TOMCAT2,登陆的时候在tomcat1上,sessionId我们也存到

redis里面,但是下次请求的时候,我们在线上肯定是用域名的方式,当我们登陆完之后,在tomcat2请求的时候,并不会拿到

登陆的信息,因为tomcat2的JSESSIONID,肯定不是TOMACT1的JSESSIONID,可以看一下,这块呢我们用了nginx,两个tomcat打开了

两个IDEA,然后配置了host,配置了nginx的反向代理,然后又讲解了redis,现在问题已经说明白了,那我们现在就要推翻之前的

假设,之前的假设是说,我这个服务器到线上肯定不重启,那我们既然要做集群,肯定不是一台服务器,即使你TOMCAT1不重启,我

请求你这个域名的时候,还是有可能把请求打到TOMCAT2,TOMCAT3,TOMCAT4上,所以你不重启TOMCAT1,想保证session信息也被推翻了,

当然不可能不重启,难道你的网站不更新了,问题显而易见,那么我们现在就来搞定他

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Leon_Jinhai_Sun/article/details/97657840
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 13:06:23
  • 阅读 ( 1169 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢