Java面试笔试,Java技术每天学一点
公众号Java面试
小心不要迷路
作者:依本多情
资料来源: https://blog.csdn.net/QQ _ 36520235/article/details/87830929
首先,为什么会出现这样的session共享解决方案? 随着互联网公司的项目在微服务和分布式环境中构建,一个项目可能分别位于几个或多个服务器群集之下,这种情况下会出现问题。
当用户进行session会话时(例如,当用户登录到项目时),典型的大型企业项目由Nginx进行反向代理
这里简要列举了Nginx中几种常用的反向代理策略。
轮询策略、
加权比例策略、
ip_hash策略、
可定制的战略、
在Nginx反向代理中,通常将用户的请求分发到不同的服务器,但如果用户请求的请求存储在请求的服务器a上,则该用户的sessionID存储在该服务器上JVM的ConcurrentHashmap中
但是,此时在需要向服务器b调用用户请求的服务模块的情况下,在用户开始请求时,由于在那时的服务器b中没有存储该用户的sessionID,所以再次使用户进行登录操作。 另外,用户本来想完成一个订单操作,但有时会多次登录。
所以,session共享方案在分布式环境和微服务系统下显得尤为重要。
解决方案1 :基于nginx的ip_hash负载平衡实际上是对请求的ip地址的可用服务器数量进行建模,然后通过nginx反向代理将请求分发到相应的服务器。 (在此,将可用服务配置在一个数组中,如果取模型得到的结果是数,则服务数组内的下标对数个服务进行请求)
具体实现:
必须在Nginx.conf文件中进行相应的修改,并根据可用服务进行修改
upstreambackend{ip_hash; 服务器192.168.128.1:8080; 服务器192.168.128.2:8080; 服务器192.168.128.8080 down; 服务器192.168.128.433608080 down; }服务器{ listen 8081; server_nametest.csdn.net; 根/家庭/系统/test.csdn.net/test; 位置^~~/upload/upload { proxy _ pass http://back end; }实现这一目标的优缺点:
解决方案基于Tomcat的session复制实际上是在用户请求时将生成的sessionID复制到系统的所有服务器,从而在用户请求时从服务器a调用服务器b上的模块解决了问题。
具体代码中如何实现session复制呢?
使用session复制的优缺点:
解决方案3 :使用3:Redis制作缓存会话的统一缓存的方案吧。 其实就是将每次用户请求时生成的sessionID放在redis的服务器上。 并且,通过进行基于Redis的特性设定失效时间的机制,可以保证用户在我们设定的Redis的session失效时间内不需要再次登录。
如何进行代码的实现:
使用Redis实现session共享的优缺点:
解决方案四:结合cookie其实也可以把session放在cookie里。 每次用户请求时,都会将自己的cookie放在请求中,这样可以确保每次用户请求时,用户都不会在分布式环境中进行辅助登录。