Spring Boot一个依赖搞定session共享,没有比这更简单的方案了

国内新闻 浏览(1941)

在传统的单一服务架构中,通常只有一台服务器,因此没有会话共享问题,但在分布式/集群项目中,会话共享是必须面对的问题。我们来看一个简单的架构图。

f561e35653624e888d80972ad4b419e6

在这种体系结构中,存在一些在单个服务中不存在的问题。例如,客户端发起请求。请求到达Nginx后,由Nginx转发给Tomcat A,然后保存到Tomcat A上的会话。数据,下次发出请求时,请求转发到Tomcat B,然后转到Session获取数据,发现之前没有数据。对于此类问题的解决方案,这个想法很简单:将需要在服务之间共享的数据保存到一个公共位置(主流解决方案是Redis):

02b10fa6b01642fe973aaa5dfae2f553

当所有Tomcat都需要向Session写入数据时,它会写入Redis,当所有Tomcat需要读取数据时,它会从Redis读取。这样,不同的服务可以使用相同的Session数据。

这样的解决方案可以由开发人员手动实现,即手动将数据存储到Redis中并手动从Redis读取数据,这相当于使用一些Redis客户端工具来实现这样的功能,毫无疑问,手动实现工作负载还是很大。

A simplified solution is to use Spring Session to implement this function. Spring Session uses the proxy filter in Spring to intercept all Session operations, automatically synchronize data to Redis, or automatically read from Redis. data.

For developers, all operations on Session synchronization are transparent. Developers use Spring Session. Once configured, the specific usage is like using a normal Session.

First, actual combat

1.1 Creating a Project

First create a Spring Boot project, introducing Web, Spring Session, and Redis:

93b0bc33c7c444ada98daaa31205b09b

After the creation is successful, the pom.xml file is as follows:

Org.springframework.boot

Spring-boot-starter-data-redis

Org.springframework.boot

Spring-boot-starter-web

Org.springframework.session

Spring-session-data-redis

Note:

xx我在这里使用的Spring Boot版本是2.1.4。如果使用最新版本的Spring Boot 2.1.5,除了上面的依赖项之外,还需要添加额外的Spring Security依赖项(其他操作不受影响,只需要一个依赖项,当然,还有一些默认的身份验证过程春季安全)。

1.2配置Redis

Spring.redis.host=192.168.66.128

Spring.redis.port=6379

Spring.redis.password=123

Spring.redis.database=0

这里是Redis,虽然我配置了四行,但考虑到端口默认为6379,数据库默认为0,所以实际配置实际上是两行。

1.3使用

配置完成后,您可以使用Spring会话。实际上,您使用正常的HttpSession,其他Sessions与Redis和其他操作同步,并且框架已自动为您完成: