SSO - 我们为何需要单点登录系统

SSO,Single Sign On,也就是单点登录,保证一个账户在多个系统上实现单一用户的登录

现在随着网站的壮大,很多服务会进行拆分,会做SOA服务,会使用dubbo做微服务,或者简单的小型分布式,

这样在服务与服务之间,或者系统与系统之间都是通过HTTP或者restful来进行通信的,

在以往的单系统应用中,我们都是把user存入session中的,需要用到的时候随时取,如果取不到就跳转到登录注册页面,非常简单的原理

但是在现如今的分布式应用中,如何保证session同步呢?

比如订单服务是在 order.jd.com

购物车服务在 cart.jd.com

那么这2个二级域名下的用户信息如何实现同步呢?

解决方案:

1. tomcat有一个session同步方案,就是一个传播机制,打个比方有A B C 3台tomcat,这3台tomcat的user信息都在session中并且保持一致,如果其中一台的user信息变化了,那么就会传播至另外两台,则实现同步,这样做没问题,但是仅仅只是在做tomcat集群的时候tomcat很少的时候会用,一旦集群增大,有100台,那么就互相传播吧,传播是需要性能损耗的,那么整个网站的性能就会被拉低,你的网站在你的网络风暴中就会晕死

2. nginx 非粘性session,说穿了就是一个session绑定传播,起初user的session在tomcatA上,tomcatA宕机了,那么session会把所有的信息传播到tomcatB,以此实现session共享,但是这也有个问题,就是传播的时候需要等待,快的时候1分钟左右,慢的时候要5分钟,用户的耐性有限,所以也不能这么做

3. 自己研发一套session高性能共享系统,我见过有这么做的公司,但是需要时间人力成本,所以不建议,如果你是BAT,随意~

4. SSO解决方案,目前比较流行的方案,自行开发一套单点登录系统,比如就使用 sso.jd.com,可以在这个二级域名下进行登录和注册,登录和注册都是以restful形式,为了可以同时提供给cms以及手机端的支持

登陆后把用户的相关信息存入redis,redis设置好过期时间,key为一个token,使用uuid,uuid生成后需要存入cookie中,失效时间随意定,但是再登录后需要重置redis和cookie中的失效时间

京东的实现:

sso的登录系统

sso的注册系统(京东是两套都分开了,这样布个集群怎么也得至少4台嘛)

首页

商品(商品详情应该都是生成的静态页面)

交易系统

这些都实现了sso,在soa各个系统中user可以随意走

拦截器配置:

在需要user信息的时候肯定需要使用到拦截器,如果获取不到user信息,那么就跳转到登录页面,但是需要注意的是需要把原页面作为redirectUrl暂时保存,登陆成功后需要跳转

获取user的时候就是从cookie中读取token,调用sso服务从redis中查询用户信息,如果有则继续,没有则登录

淘宝的二级域名:

原文发布于微信公众号 - BeJavaGod(wxleechenxiang)

原文发表时间:2016-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏崔庆才的专栏

付费代理的使用

1.2K40
来自专栏云加头条

腾讯云服务器配置不用愁 只需这几步

作为云计算服务的重要组成部分,云服务器以其简单高效、安全可靠、弹性扩展的特性成为核心力量,构建了包括计算、网络、存储在内的综合服务平台。以腾讯云服务器为例,CV...

24.8K70
来自专栏IT技术精选文摘

架构师眼中的高并发架构

28350
来自专栏蛋未明的专栏

【myweb2.0】框架的新思想

18240
来自专栏左瞅瞅,右瞅瞅

DNS上线之路(五)——DNS视图

智能DNS是域名服务在业界首创的智能解析服务。能自动判断访问者的IP地址并解析出对应的IP地址,使网通用户会访问到网通服务器,电信用户会访问到电信服...

27140
来自专栏张戈的专栏

单机MySQL数据库优化推荐的编译安装参数

MySQL 编译参数多而复杂,让新手感到很头大,如果是正式生成环境安装 MySQL,没有充足的时间去研究每一个参数代表的意义,个人建议使用余洪春前辈整理的编译参...

33530
来自专栏架构说

大流量Web系统性能优化实践

系统性能优化一般方法 1 通过工具寻找瓶颈 2 水平扩展机器 这遇到很多问题 分布式事务和cache问题等 需要调整架构和组件 ? ? ? ? ?...

45280
来自专栏java闲聊

natapp 内网穿透神器

31260
来自专栏沈唁志

API接口开发简述示例

28020
来自专栏JAVA高级架构

如何实现大型网站架构设计的负载均衡

负载均衡 (Load Balancing) 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处...

551100

扫码关注云+社区

领取腾讯云代金券