单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,企业间需互相授信。
-->微服务
客户端-->-------------<--sso服务
-->微服务
在分布式项目中,HttpSession 状况?
用户如果访问的是 Tomcat-A 产生自己的 Session 时,如果再次访问 Tomcat-B,默认情
况下在 TomcatB 中重新创建 Session 对象,而不会把 TomcatA 中的 Session 共享过来。
实际场景:用户访问 TomcatA 实现了登录,在 Session 作用域中存储当前用户信息,后
面通过 nginx 代理或一些负载均衡工具有可能在访问过程中访问 TomcatB,TomcatB 中没有用户 Session 对象也没有用户登录信息,对于之前登录状态就失效。
而分布式项目中每个模块是一个独立项目,每个项目一个独立 tomcat
2.1Session 广播
通过配置 Tomcat 的配置文件,实现多个 Tomcat 之间可以相互共享 Session 状态。在以
前的时候使用这种方案。
优点:
配置完成后,使用起来比较简单。和平时使用方式相同的。
缺点:
广播的过程性能消耗较大。每个 Tomcat 中存储大量 Session 对象。
2.2使用 Nginx 代理实现
通过对 NGINX 进行配置,按照算法对存储在 Session 中 key 进行计算,得出固定值,把
这个 key 及 value 存储到某个 Tomcat 中,以后获取 key 的内容时再次对 key 进行计算,还是
从对应 Tomcat 中取出 Value。
优点:
多个 Tomcat 分摊整个项目的 Session。
缺点:
如果某个 Tomcat 出现宕机等问题会丢失数据。
2.3自定义 Session 实现(aof--rdb)
程序员通过模拟 Session 实现过程,结合 Cookie + Redis 技术进行实现。把存储在服务
器端 Session 对象中全局 Map 对象的内容变成存储到 Redis 中。整个存储 Session 的全局 Map 换成了 Redis 工具。(第一次读取数据库,第二次读取redis)
2.3.2 向 Session 作用域中存储值
当向 Session 作用域存储值时执行上面 Session 原理,把 Session 对象取出后,Session 作用域的值就存储在全局 Map 属性(此 Map 属性是 Session 对象的全局属性)
优点:
性能较高,不存在某个 Tomcat 宕机丢失数据等问题。整体效果比较稳定。
缺点:
需要程序员自己手动完成一些列效果,实现过程相对较复杂。
2.4使用 Spring Session 实现
把上面自定义 Session 实现的整个过程进行封装成了 Spring Session 对象,程序员直接像
单体项目中操作 HttpSession 一样进行操作,剩下的所有事情都交给 Spring Session 进行处理,
最终效果依然可以实现分布式 Session 共享。
redis的module中
org.springframework.boot
spring-boot-starter-data-redis
web中加入springsession的支持
org.springframework.session
spring-session-core
org.springframework.session
spring-session-data-redis
配置文件:
spring:
redis:
host: 192.168.160.134
port: 6379 #redis的默认端口
注解:
启动类开启对redis的支持
@EnableCaching
方法上使用注解
@Cacheable(cacheNames = "com.mymaven",key = "'user'+#id")
1.@Cacheable这个注解是表示当前类--方法可以使用
2.支持缓存
3.spring调用当前方法或者类时缓存在redis中
cacheNames = "com.mymaven"区分名字通常以公司域名填写
key:双引号里面加单引号
+ #id:用于区别服务与服务间的区别,防止被覆盖。
在redis中会显示为:com。mymaven::user id
1 @EnableRedisHttpSession注解
此注解写在启动类上的。所有属性都有默认值,可以省略不配置。
a) maxInactiveIntervalInSeconds:单位秒,默认 1800 秒。表示 Session 存活时间。
a) redisNamespace:存储在 redis 中 key 的前缀。默认 spring:session
a) flushMode:刷新 redis 数据的模式。默认 ON_SAVE。在保存时才刷新。另一个取值
FlushMode.IMMEDIATE,不刷新。
d) cleanupCron:清理过期session的频率,保持默认无需配置。默认 ”0 * * * * *”
d) saveMode:保存模式。默认值 SaveMode.ON_SET_ATTRIBUTE SaveMode.ALWAYS:实时保存。
SaveMode.ON_GET_ATTRIBUTE:获取值时才进行保存到 redis