集群的分布式场景中,我们需要把众多服务的会话状态保持一致,常见的就是把会话信息保存到redis中实现共享,那么你知道shiro集成redis实现会话共享有多简单吗?真的只需要4步!
在一些分布式场景中,比如一个简单负载均衡场景,一个nginx,反向代理到两个tomcat,tomcat运行这同样的项目,那么这时候,服务的会话需要共享,因为我们已经使用了shiro来完成我们的认证授权逻辑,那么shiro完成登录之后,如何让另外一个服务同时也是登录状态呢?
我们延用上篇文章的项目代码,使用两个端口8080、8081分别启动项目。
-
http://localhost:8080
-
http://localhost:8081
有些同学不知道怎么用idea同一个项目分别启动两个端口,其实很简单,只需要在 Run/DebugConfigurations
的 VM options
上,指定启动端口 -Dserver.port=8081
即可!
ok,分别启动8080和8081项目之后,登录8080项目,然后访问8081,发现8081未登录!图示如下:
那么,如何才能8080登录之后,8081也同时完成登录呢?
特殊解决方式
其实在负载均衡集群中,有些人是这样解决问题,给ip指定服务,比如某个用户请求经过nginx反向代理到8080服务,那么nginx上指定 ip_hash:依据ip分配方式
,那么这个用户就一直访问同一个服务,不会访问到8081服务,所以用户就一直是访问统一服务,所以在用户看来,他就一直是登录状态的。
但是,这是有缺陷的,因为ip和服务绑定了,加入这个服务挂了之后,是不会转发到其他服务,所以对这用户来说,就访问异常。
所以我们需要使用更常用的负载均衡策略,比如轮询、权重等。
回顾shiro的架构与组件
ok,进入正题,