ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sa-Token 微服务分布式 Session 四种方案怎么选?

Sa-Token 微服务分布式 Session 四种方案怎么选? Sa-Token 微服务分布式 Session 四种方案怎么选【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token把使用 Sa-Token 的服务从单机扩成多节点后会遇到一个典型问题用户在节点一登录成功下一次请求落在节点二上时节点二判断该用户仍未登录。原因是 Sa-Token 默认将会话数据保存在内存中位于 core 核心包这种模式读写最快、避免了序列化开销但有两个硬伤重启后数据丢失、无法在分布式环境中共享数据。官方文档 微服务 - 分布式Session会话 归纳了四种主流方案本文给出每种方案的取舍依据以及其中两条可落地路径Redis 会话中心、jwt 无状态令牌的完整集成步骤与验证方式。四种方案各自适合什么情况方案做法文档给出的取舍方案一Session 同步一个节点的数据改变时强制同步到其它所有节点性能消耗太大不太考虑方案二Session 粘滞通过算法保证一个用户的所有请求稳定落在同一节点需要从网关处动手与框架无关方案三建立会话中心Session 存储在专业缓存中间件上如 Redis每个节点变成无状态服务Sa-Token 整合 Redis 非常简单官方更推荐方案四颁发无状态 token放弃 Session把用户数据写入令牌本身jwt服务端不存储数据对比较复杂的业务可能会功能受限也就是说方案一基本排除方案二要改网关而不是改框架真正在 Sa-Token 侧做决策的是方案三和方案四——默认走方案三Redis只有接受 jwt 的功能限制时才走方案四。主路径用 Redis 作为会话中心方案三准备条件项目已引入 Sa-Token如sa-token-spring-boot-starter并准备一个可用的 Redis 服务。Redis 版本要求 6.0自 v1.46.0 起sa-token-redis-template/sa-token-redisson使用了 Redis 的SET KEEPTTL特性低于 6.0 会报ERR syntax error。版本对齐Sa-Token-Redis 集成包的版本尽量与 Sa-Token-Starter 集成包的版本一致否则可能出现兼容性问题当前仓库根 pom.xml 的revision为 1.46.0可参照对齐。引入依赖Maven 方式!-- Sa-Token 整合 RedisTemplate -- dependency groupIdcn.dev33/groupId artifactIdsa-token-redis-template/artifactId version1.46.0/version /dependency !-- 提供 Redis 连接池 -- dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependency文档原始片段中的版本写作${sa.top.version}替换为你项目实际使用的 Sa-Token 版本号即可。Gradle 对应写法// Sa-Token 整合 RedisTemplate implementation cn.dev33:sa-token-redis-template:1.46.0 implementation org.apache.commons:commons-pool2引入的是 SpringBoot 官方推荐的 RedisTemplate 客户端这是文档推荐给省心省事用户的默认方案。配置 Redis 连接信息只引依赖还不够只有项目初始化了正确的 Redis 实例Sa-Token 才能用 Redis 做数据持久化。在application.yml配置文档示例值host/port/password按你的实际环境替换spring: # redis配置 redis: # Redis数据库索引默认为0 database: 1 # Redis服务器地址 host: 127.0.0.1 # Redis服务器连接端口 port: 6379 # Redis服务器连接密码默认为空 # password: # 连接超时时间 timeout: 10s lettuce: pool: # 连接池最大连接数 max-active: 200 # 连接池最大阻塞等待时间使用负值表示没有限制 max-wait: -1ms # 连接池中的最大空闲连接 max-idle: 10 # 连接池中的最小空闲连接 min-idle: 0注意一点如果你使用的是SpringBoot 3.x前缀spring.redis要改为spring.data.redis。使用与验证集成 Redis 不需要改任何上层代码框架自动保存数据所有上层 API 保持不变登录、会话读写照旧调用即可。验证方式登录一次后到 Redis 中查看能看到带satoken:前缀的键前缀来自配置项sa-token.token-name默认值satoken默认以 json 格式存储。然后在多节点环境下重复文档描述的场景——在节点 A 登录后让请求落到节点 B若节点 B 也能识别登录态即达到分布式环境下多节点的会话一致性这一集成目标。完整示例可参考仓库中的 sa-token-demo-springboot-redis。可选分支一项目已在用 Redisson如果项目里用的是 Redisson 而不是 RedisTemplate可以改用 集成 Redis 文档第 5 节 的方案。这是与 RedisTemplate并列的可选项不要两套 Dao 同时引入。两种集成方式二选一方式一通用插件sa-token-redissonSpring Boot、Solon、JFinal 等均可用要求项目里已有RedissonClient!-- Sa-Token 整合 Redisson -- dependency groupIdcn.dev33/groupId artifactIdsa-token-redisson/artifactId version1.46.0/version /dependency然后自己注册 DaoRedissonClient由你现有的 Redisson 配置提供Configuration public class SaTokenDaoConfig { Bean public SaTokenDao saTokenDao(RedissonClient redissonClient) { return new SaTokenDaoForRedisson(redissonClient); } }方式二sa-token-redisson-spring-boot-starterSpring Boot 专用自动配置包内部已含sa-token-redisson和官方redisson-spring-boot-starter引入后自动注册SaTokenDao不用手写 Java。Redis 连接配置与官方 Redisson starter 相同Spring Boot 3.x 同样要把spring.redis前缀改为spring.data.redis。示例见 sa-token-demo-springboot-redisson。升级注意从旧版本升级时必须看SaTokenDaoForRedisson按 String 读写新版默认StringCodec而 v1.45.0 及更早版本下getBucket(key)跟随RedissonClient全局 codec一般默认Kryo5Codec。升级后旧缓存将无法反序列化、登录态失效处理方式二选一清空 Redis 中 Sa-Token 相关的旧 key默认前缀satoken:让用户重新登录文档推荐构造时显式传入升级前的 codec 保持兼容例如未自定义过 Redisson codec 时传入new Kryo5Codec()Configuration public class SaTokenDaoConfig { Bean Primary public SaTokenDao saTokenDao(RedissonClient redissonClient) { return new SaTokenDaoForRedisson(redissonClient, new Kryo5Codec()); } }若你曾在 Redisson 配置里指定过其它 codec如JsonJacksonCodec应传入当时使用的那个而不是Kryo5Codec。若需要权限缓存与业务缓存分离改用 Alone 独立 Redisson 插件。可选分支二颁发无状态 jwt 令牌方案四如果业务允许完全不做服务端存储可以走 jwt 路径。步骤见 和 jwt 集成在已引入 Sa-Token 的基础上添加依赖${sa.top.version}替换为实际版本!-- Sa-Token 整合 jwt -- dependency groupIdcn.dev33/groupId artifactIdsa-token-jwt/artifactId version1.46.0/version /dependency版本兼容性注意sa-token-jwt显式依赖 hutool-jwt 5.7.14项目中要么不引入 hutool要么引入 5.7.14 的版本hutool 5.8.13 / 5.8.14 会出现类型转换问题。在application.yml配置生成秘钥文档示例的字符串仅演示格式请按文档提示自行随机生成sa-token: # jwt秘钥 jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk三种模式选择其中一种注入Configuration public class SaTokenConfigure { // Sa-Token 整合 jwt (Simple 简单模式 / Mixin 混入模式 / Stateless 无状态模式) Bean public StpLogic getStpLogicJwt() { return new StpLogicJwtForSimple(); } }之后照常使用 Sa-Token访问登录接口即可观察生成的 Token 是否变成 jwt 风格。三种模式的差异文档以同时引入 jwt 与 Redis 为前提比较功能点Simple 简单模式Mixin 混入模式Stateless 无状态模式Token 风格jwt 风格jwt 风格jwt 风格登录数据存储Redis 中存储Token 中存储Token 中存储Session 存储Redis 中存储Redis 中存储无 Session踢人下线 / 顶人下线 API支持不支持不支持active-timeout 有效期支持支持不支持id 反查 Token / 账号封禁支持支持不支持会话管理支持部分支持不支持模式总结Token 风格替换jwt 与 Redis 逻辑混合完全舍弃 Redis只用 jwt使用 jwt 还有三个配置层注意点来自 jwt 集成文档注意点一节Simple 模式下is-share恒等于falseMixin 模式下is-concurrent必须为true、max-try-times恒等于-1。集成 Redis 后容易踩的坑Redis 低于 6.0 报ERR syntax error这是SET KEEPTTL特性不被旧版 Redis 支持。文档给出的解决方式是升级到 Redis 6.0推荐或按 常见问题文档 中对应条目重写SaTokenDao的update方法恢复旧写法。自定义实体类反序列化报错往 Session 存自定义实体类后从 Redis 读回若报无法反序列化的类型xxx请先将其注册到 JSON 全局类型白名单参考 JSON 序列化扩展 中的全局类型白名单机制。多个项目共用同一个 Redis 的键冲突如无特殊需求建议不要共用确实要共用时可用不同database索引、配置不同的sa-token.token-name注意它同时是前端提交 Token 的参数名/Header 名、使用 Alone 独立 Redis 插件见 Alone 独立 Redis 插件或重写wrapKey给所有键加项目前缀作为保底方案详见 集成 Redis 文档第 4 节。序列化格式想改默认序列化层是String 序列化-JSON 序列化引入 spring-boot-starter 时自动用 Jackson可换成 Fastjson/Fastjson2/Snack3或改用 jdk 序列化base64/16 进制/ISO-8859-1扩展入口汇总在 缓存层扩展。选型结论默认需求下走方案三引入sa-token-redis-template Redis 连接配置上层 API 零改动这是文档明确推荐的路线项目已有 Redisson 则走sa-token-redisson系列注意旧缓存 codec 不兼容问题业务确实简单、可接受 Stateless 模式下列出的功能限制无 Session、无踢人/顶人下线等时才选 jwt 方案官方文档也指出 jwt 模式因不在服务端存储数据对较复杂业务可能功能受限因此更推荐方案三。jwt 与更多集成点的完整示例可参考 集成示例大全下载说明。【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表