SpringBoot提高(一)集成Spring-Session构建分布式Session(上)——教程

385 阅读2分钟

一、本地环境

  • 操作系统:Mac OS X 10.13.2

  • 编辑器:IntelliJ IDEA 2017

  • JDK版本:jdk 1.8

  • Maven版本:apache-maven-3.5.0

  • SpringBoot版本:SpringBoot 1.5.17

二、pom依赖文件

<!-- 集成redis -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 集成spring-session -->
<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
</dependency>

三、本地安装redis

1、下载redis

进入redis官网,下载需要的版本(我现在的是redis 4.0)。

2、安装redis(Mac)

  • 使用root权限:sudo -i

  • 解压:tar zxvf redis-4.0.11.tar.gz

  • 移动到:mv redis-4.0.11 /usr/local/

  • 切换到:cd /usr/local/redis-4.0.11/

  • 编译测试 sudo make test

  • 编译安装 sudo make install

3、设置后台运行并启动redis

  • 编辑redis配置文件:vim redis.conf

  • 修改daemonize nodaemonize yes

  • 进入src目录:cd src

  • 启动服务:redis-server ../redis.conf

  • 启动客户端:redis-cli

4、错误排除

我以前在mac上装过别的版本的redis,导致版本冲突:

make[1]: *** [test] Error 1

make: *** [test] Error 2

解决这个错误,执行下面的语句即可:

make distclean

make

make test

四、配置文件以及工程结构

1、配置文件

application.yml

server:
  port: 10008
spring:
  redis:
    host: localhost
    port: 6379
    password:

2、目录结构

五、编写代码

1、开启redis存储session功能

@EnableRedisHttpSession
@SpringBootApplication
public class ServiceSessionApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceSessionApplication.class, args);
    }
}

增加注解@EnableRedisHttpSession来开启功能

2、增加session操作

@RestController
public class SessionController {
    @Autowired
    private HttpServletRequest request;
    @Value("${server.port}")
    private String port;

    @GetMapping("/session/post")
    public Map<String, Object> getSession() {
        HttpSession session = request.getSession();
        session.setAttribute("username", "zhuqiwei");

        Map<String, Object> result = Maps.newHashMap();
        result.put("sessionId", session.getId());
        result.put("port", port);
        return result;
    }

    @GetMapping("/session/get")
    public String get() {
        HttpSession session = request.getSession();
        return (String) session.getAttribute("username") + "----" + port;
    }
}

因为要验证集群环境下session是否同步,所以增加port字段用来识别当前服务器。
getSession()方法用来生成session并且增加参数username
get()方法用来再另一台服务器上通过session获取增加的参数username的数值。

六、运行环境测试

1、运行集群环境

  • 先启动端口号10007的服务

  • 编辑Edit Configurations...,勾掉Single instance only选项

  • 修改端口号10008,再次启动服务

2、测试

浏览器上访问http://localhost:10007/session/post,返回以下结果

{
    "port": "10007",
    "sessionId": "bce6d8c4-0e18-4de7-98f7-6f1948b8e204"
}

继续浏览器上访问http://localhost:10008/session/get,返回以下结果:zhuqiwei----10008
说明集群服务器之间Session确实进行了同步