Spring Cloud——基于Dubbo的分布式Session解决方案

2023-05-16

环境配置

spring boot 2.6.3
spring cloud 2021.0.1
spring cloud alibaba 2021.0.1.0
nacos server 2.0.4
dubbo 2.7.15

解决方案

源代码:https://gitee.com/myzstu/auth

在这里插入图片描述

package club.zstuca.myzstu.auth.service.impl;

import club.zstuca.myzstu.session.service.ISessionService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.session.FindByIndexNameSessionRepository;
import org.springframework.session.Session;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author shentuzhigang
 * @date 2022/3/17 22:59
 */
@Service
@DubboService(application = "auth", version = "1.0.0", protocol = "jackson")
public class SessionServiceImpl implements ISessionService {

    private final FindByIndexNameSessionRepository<? extends Session> sessionRepository;

    public SessionServiceImpl(FindByIndexNameSessionRepository<? extends Session> sessionRepository) {
        this.sessionRepository = sessionRepository;
    }

    @Override
    public String createSession() {
        Session session = sessionRepository.createSession();
        return session.getId();
    }

    @Override
    public void save(String session) {

    }

    @Override
    public String findById(String id) {
        Session session = sessionRepository.findById(id);
        if(session == null){
            return null;
        }
        return session.getId();
    }

    @Override
    public void deleteById(String id) {
        sessionRepository.deleteById(id);
    }

    @Override
    public Map<String, String> findByIndexNameAndIndexValue(String indexName, String indexValue) {
        Map<String, ? extends Session> sessionMap = sessionRepository.findByIndexNameAndIndexValue(indexName, indexValue);
        Map<String, String> map = new HashMap<>();
        sessionMap.forEach((key, value) -> {
            map.put(key, value.getId());
        });
        return map;
    }

    @Override
    public String changeSessionId(String id) {
        Session session = sessionRepository.findById(id);
        return session.changeSessionId();
    }

    @Override
    public <T> T getAttribute(String id, String attributeName) {
        Session session = sessionRepository.findById(id);
        return session.getAttribute(attributeName);
    }

    @Override
    public Set<String> getAttributeNames(String id) {
        Session session = sessionRepository.findById(id);
        return session.getAttributeNames();
    }

    @Override
    public void setAttribute(String id, String attributeName, Object attributeValue) {
        Session session = sessionRepository.findById(id);
        session.setAttribute(attributeName, attributeValue);
    }

    @Override
    public void removeAttribute(String id, String attributeName) {
        Session session = sessionRepository.findById(id);
        session.removeAttribute(attributeName);
    }

    @Override
    public Instant getCreationTime(String id) {
        Session session = sessionRepository.findById(id);
        return session.getCreationTime();
    }

    @Override
    public void setLastAccessedTime(String id, Instant lastAccessedTime) {
        Session session = sessionRepository.findById(id);
        session.setLastAccessedTime(lastAccessedTime);
    }

    @Override
    public Instant getLastAccessedTime(String id) {
        Session session = sessionRepository.findById(id);
        return session.getLastAccessedTime();
    }

    @Override
    public void setMaxInactiveInterval(String id, Duration interval) {
        Session session = sessionRepository.findById(id);
        session.setMaxInactiveInterval(interval);
    }

    @Override
    public Duration getMaxInactiveInterval(String id) {
        Session session = sessionRepository.findById(id);
        return session.getMaxInactiveInterval();
    }

    @Override
    public boolean isExpired(String id) {
        Session session = sessionRepository.findById(id);
        return session.isExpired();
    }
}

package club.zstuca.myzstu.session;

import club.zstuca.myzstu.session.service.ISessionService;
import org.springframework.session.FindByIndexNameSessionRepository;
import org.springframework.session.Session;
import org.springframework.session.SessionRepository;

import java.io.Serializable;
import java.time.Duration;
import java.time.Instant;
import java.util.Map;
import java.util.Set;

/**
 * @author shentuzhigang
 * @date 2022/3/19 13:00
 */
public class RpcIndexedSessionRepository implements FindByIndexNameSessionRepository<RpcIndexedSessionRepository.RpcSession> {

    private final ISessionService iSessionService;

    public RpcIndexedSessionRepository(ISessionService iSessionService) {
        this.iSessionService = iSessionService;
    }

    @Override
    public Map<String, RpcSession> findByIndexNameAndIndexValue(String indexName, String indexValue) {
        return findByIndexNameAndIndexValue(indexName, indexValue);
    }

    @Override
    public RpcSession createSession() {
        return new RpcSession(iSessionService.createSession());
    }

    @Override
    public void save(RpcSession session) {
        iSessionService.save(session.getId());
    }

    @Override
    public RpcSession findById(String id) {
        String sessionId = iSessionService.findById(id);
        if (sessionId == null) {
            return null;
        }
        return new RpcSession(sessionId);
    }

    @Override
    public void deleteById(String id) {
        iSessionService.deleteById(id);
    }

    /**
     * An internal {@link Session} implementation used by this {@link SessionRepository}.
     */
    public final class RpcSession implements Session, Serializable {

        private static final long serialVersionUID = 1L;

        private String id;

        public RpcSession(String id) {
            this.id = id;
        }

        @Override
        public String getId() {
            return this.id;
        }

        @Override
        public String changeSessionId() {
            return RpcIndexedSessionRepository.this.iSessionService.changeSessionId(this.id);
        }

        @Override
        public <T> T getAttribute(String attributeName) {
            return RpcIndexedSessionRepository.this.iSessionService.getAttribute(this.id, attributeName);
        }

        @Override
        public Set<String> getAttributeNames() {
            return RpcIndexedSessionRepository.this.iSessionService.getAttributeNames(this.id);
        }

        @Override
        public void setAttribute(String attributeName, Object attributeValue) {
            RpcIndexedSessionRepository.this.iSessionService.setAttribute(this.id, attributeName, attributeValue);
        }

        @Override
        public void removeAttribute(String attributeName) {
            RpcIndexedSessionRepository.this.iSessionService.removeAttribute(this.id, attributeName);
        }

        @Override
        public Instant getCreationTime() {
            return RpcIndexedSessionRepository.this.iSessionService.getCreationTime(this.id);
        }

        @Override
        public void setLastAccessedTime(Instant lastAccessedTime) {
            RpcIndexedSessionRepository.this.iSessionService.setLastAccessedTime(this.id, lastAccessedTime);
        }

        @Override
        public Instant getLastAccessedTime() {
            return RpcIndexedSessionRepository.this.iSessionService.getLastAccessedTime(this.id);
        }

        @Override
        public void setMaxInactiveInterval(Duration interval) {
            RpcIndexedSessionRepository.this.iSessionService.setMaxInactiveInterval(this.id, interval);
        }

        @Override
        public Duration getMaxInactiveInterval() {
            return RpcIndexedSessionRepository.this.iSessionService.getMaxInactiveInterval(this.id);
        }

        @Override
        public boolean isExpired() {
            return RpcIndexedSessionRepository.this.iSessionService.isExpired(this.id);
        }
    }
}

参考文章

  • Dubbo——Dubbo协议整合Jackson序列化解决方案
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Cloud——基于Dubbo的分布式Session解决方案 的相关文章

  • Windows Server 2016修改Administrator的密码

    1 xff09 在仪表盘上 xff0c 点击 工具 菜单 xff0c 选择 计算机管理 子菜单 2 xff09 本地用户和组 gt 用户 选中Administrator xff0c 点击右键 xff0c 弹出的菜单中选择 设置密码 的子菜单
  • Ubuntu安装Tomcat 执行[./startup.sh]命令显示“ Permission denied “问题解决

    报错贴图 xff1a 根据错误提示 xff0c 为权限问题 然后我们检查权限情况 xff1a 方框中为管理员权限 xff0c 显示为rw r代表read xff08 读 xff09 xff0c w代表write xff08 写 xff09
  • 2021年7月1日:AndroidStudio集成opencv指南。

    版本声明 xff1a 1 AndroidStudio 4 2 1 2 opencv版本4 5 2 3 androidStudio创建项目选择项目类型Native C 43 43 4 下载opencv android版本解压后 xff0c 找
  • Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器 xff1f 1 为了省内存 xff0c 提高速率 2 因为1所以布隆过滤器不需要百分百正确 3 说存在不一定存在 xff0c 说不存在一定不存在 4 在解决缓存穿透的问题时 xff0c 拦截了大部分的请求 xff
  • Docker学习笔记(九)---DockerFile

    DockerFile 文章目录 DockerFileDockerFile介绍DockerFile构建过程基础知识 DockerFile的指令实战测试CMD 和 ENTRYPOINT 区别 Docker其他学习笔记 DockerFile介绍
  • 【使用multipart/form-data方式传递MultipartFile参数,实现服务间文件的传递】

    目录 一 代码实现二 MultipartFile工具类三 HttpClient使用四 参考链接 一 代码实现 1 A服务接收前端上传文件并发送至B服务 引入依赖 lt dependency gt lt groupId gt org apac
  • JSP中JavaBean的应用:计算三角形或者梯形的面积

    计算三角形或者梯形的面积 1 jsp页面的编写 页面部分包含一个表单 xff0c 这个表单有一个提供选择的图形的下拉列表 xff0c 三个输入框分别输入三角形的三条边或者是梯形的上底 下底和高 xff0c 一个计算的提交按钮 在页面中还应该
  • ubuntu22虚拟机设置中文(亲测有效)

    1进入 虚拟机 找到设置 2 进入设置找到区域和语言并切换为Chinese xff0c 再点击select 3 再点击管理已安装语言 xff0c 弹框再点击添加或删除语言 xff08 记得点击应用到整个系统 xff09 4 在里面找到中文语
  • JDK环境配置

    JDK环境配置 xff08 注 xff1a 安装jdk和jre的时候把两个文件夹都放在同一目录下 xff0c 如 xff1a 放在 D Program Files Java xff09 1 右键点击此电脑 xff0c 选择属性 xff0c
  • 复合语句和流程控制

    复合语句 在MariaDB 10 1 1 43 版本中 xff0c 我们可以在存储过程以外来使用复合语句了 xff0c 顾名思义 xff0c 复合语句就是将多条语句作为一个整体来执行 xff0c 可以在其中使用一些逻辑判断 xff0c 循环
  • C++函数篇之求某个范围中素数的和

    1 案例 输入两个正整数m和n xff0c 求m到n之间 xff08 包括m和n xff09 所有素数的和 要求定义并调用 函数isprime xff08 x xff09 来判断x是否为素数 2 思路 主函数编写 函数的编写 xff1a 素
  • mybatis报错Error attempting to get column ‘id‘ from result set. Cause: org.postgresql.util.PSQLExcept

    mybatis报错Error attempting to get column id from result set Cause org postgresql util PSQLException Bad value for type in
  • Caused by: java.sql.SQLException: Expression #1 of ORDER BY clause is not in SELECT list, reference

    在公司出现以下Bug问题 所以开始研究为什么会出这个问题 找到网上说先执行这个命令 打开mysql客户端 输入 select 64 64 global sql mode 查询出来的信息长这个样子 ONLY FULL GROUP BY STR
  • unbutu 18.04 循环登录报错

    1 报错 dev sda2 clean 问题描述 先同时按下 Ctrl 43 Alt 43 F1 xff08 F1 F6其中一个就可以 xff09 进入命令行模式 然后输入用户名 xff0c 回车 xff0c 输入密码 xff0c 回车 x
  • Rockchip Android13平台提取kernel环境编译KO

    Rockchip Android13平台提取kernel环境编译KO 当需要给第三方提供kernel的ko编译环境时 xff0c 又不想提供完整的kernel源码 xff0c 则可以对kernel进行裁剪提取出最小的编译环境和编译器提供给第
  • Ubuntu20.4系统隐藏顶栏

    注 xff1a Ubuntu20 4以上版本安装gnome tweak tool可以实现隐藏顶栏了 xff0c 但20 4还需要安装一下扩展模块 xff0c 教程如下 xff1a 在Ubuntu中有两个扩展工具都支持隐藏顶栏 1 安装aut
  • 生产者详解-启动流程

    文章目录 生产者详解生产者概述生产者高可用客户端保证Broker端保证 生产者源码解析生产者类生产者启动流程 生产者详解 生产者概述 发送消息的一方被称作生产者 RocketMQ客户端中的生产者有两个独立的实现类 xff1a org apa
  • Mybatis Plus的理解与应用

    前言 mybatis plus是一个mybatis的增强工具 xff0c 在其基础上只做增强不做改变 作为开发中常见的第三方组件 xff0c 学习并应用在项目中可以节省开发时间 xff0c 提高开发效率 官方文档地址 xff1a MyBat
  • V1-01-02 FusionComputer简介

    文章目录 一 FusionComputeFusionComputer组件的作用 虚拟化是云计算重要的组成部分 云计算接管虚拟化 xff0c 做成资源池给用户使用 FusionSphere是华为自主知识产权的云操作系统 xff0c 集虚拟化平
  • Docker 镜像概念及操作

    Docker 专栏文章索引 x1f449 Docker 简介 x1f449 Docker 安装图文教程 x1f449 Docker 镜像概念及操作 x1f449 Dockerfile 深入理解 Docker 镜像及操作 x1f7e7 1 镜

随机推荐