使用Spring Boot 2.x版本,在Docker上使用Redis进行会话管理
使用Spring Boot 2和Spring Session Redis尝试实现会话管理,但根据我查到的资料,它并没有正常工作(或者更准确地说,由于Redis库的版本更新,一些方法已经被标记为过时,需要改变实现方式)。因此,我将它作为备忘录留下来。
环境、版本之类的
-
- windows 8.1
-
- Docker Toolbox for win
- Spring Boot 2.0.4.RELEASE
实施
应用程序配置文件
spring.session.store-type=redis
spring.session.redis.flush-mode=on-save # Sessions flush mode.
spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.
应用程序配置文件如下所示。这里没有特别的事情。
pom.xml -> 项目对象模型文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
翻译:要用这个样子。虽然只需要声明前两个但我建议还是定义jedis和commons-pool2,否则可能会出现NoClassDefError错误,请注意。
配置类
package com.example.ek.session;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession
public class SpringSessionConfig {
@Bean
public JedisConnectionFactory connectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName("192.168.99.100");
redisStandaloneConfiguration.setPort(6379);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
}
重点是这个类,在进行了各种调查后,原本在JedisConnectionFactory类中已有setHostName、setPort等方法,只需要在那里添加设置并返回即可。但是2.0以上版本已经被标记为过时,在Eclipse中会出现错误提示。因此,在查阅了javadoc后,它提到了”使用RedisStandaloneConfiguration”,所以将其作为参数传递给JedisConnectionFactory的构造函数并返回。
package com.example.ek.session;
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
public class HttpSessionApplicationInitializer extends AbstractHttpSessionApplicationInitializer {
public HttpSessionApplicationInitializer() {
super(SpringSessionConfig.class);
}
}
这里没有什么特别罕见的事情。在构造函数中调用父类,并将config类作为参数设置。
Docker – 道格服务器
我也在Docker中做了一些事情,姑且也记下来吧。
$ docker-machine env --shell default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH=**
export DOCKER_MACHINE_NAME="default"
export DOCKER_COVERT_WINDOWS_PATHS="true"
使用export命令一个一个地设置出现的项目方式如下。
$ export DOCKER_TLS_VERIFY="1"
只需运行docker。
$ docker container run --name sample-redis -d -p 6379:6379 redis
// omitted
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce9e74e42aa9 redis "docker-entrypoint.s" 8 seconds ago Up 7 seconds 0.0.0.0:6379->6379/tcp sample-redis
现在准备已经完成了,可以通过控制台进入到redis,并输入redis-cli命令。
$ docker exec -it redis bash
root@ce9e74e42aa9:/data# redis-cli
127.0.0.0:6379>
当键入`keys`命令时,Redis会显示记录的会话信息。首次时,当然会是空的,但是当启动应用程序并登录后,就可以确认会话已经成功地记录在Redis中了。
127.0.0.0:6379> keys *
1) "spring:session:sessions:expires:**********"
2) "spring:session:sessions:********"
3) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:********"
的实际代码已经放在下方了。