今天,深层次和群里同学讨论关于分布式系统问题
汇总如下:
单体应用,分布式部署:保存会话信息(spring-session)
客户端cookies + 服务端 redis = 用户信息
单机应用中,HttpSession是通过Servlet容器创建和管理的,servlet容器一旦停止服务,那么session也随之消失;但如果session被保存到redis中,只要redis服务没停且session在有效期间内,那么servlet容器停止服务了,session还是存在的,这有什么好处了,好处就是servlet容器出现闪停闪修复的情况,用户就不用重新登录了。
使用redis存储用户会话信息,客户端web请求每次携带cookies,在拦截器中,获取通过cookies获取redis中用户信息
集群部署时(3台服务器部署3个tomcat, 其中tomcat部署同一个项目) ,其session是无法共享的, 可以使用spring-session 共享session;
分布式应用:保存会话信息(sso单点登录)
sso登录
分布式系统部署时, 多服务器, session是无法共享的,这是公认的, 同时顶级域名下, 不同服务,前端请求是无法跨域获取cookie的,要想实现效果, 参考使用sso登录 模式;
逻辑: 抽离登录业务逻辑为公共服务,统一验证是否登录未登录,反馈cookies等参数;
单点登录参考: https://yq.aliyun.com/articles/636281
A 访问
- 用户访问app系统,app系统是需要登录的,但用户现在没有登录。
- 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。
- 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
- SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
- app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
- 验证通过后,app系统将登录状态写入session并设置app域下的Cookie。
A 访问关联app2系统
- 用户访问app2系统,app2系统没有登录,跳转到SSO。
- 由于SSO已经登录了,不需要重新登录认证。
- SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
- app2拿到ST,后台访问SSO,验证ST是否有效。
- 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。
分布式模式模块分层简略模型
写的问题, 请留言, 不慎感觉;
来源:oschina
链接:https://my.oschina.net/u/1995134/blog/3035535