目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?
实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat、Jetty等服务器提供的Session共享功能,将Session的内容统一存储在一个数据库(如MySQL)或缓存(如Redis)中。
下面我们将在springcloud微服务项目中,使用redis实现简单高效的session共享。
项目对应的实例代码可以通过右侧【下载实例】按钮获取
开发工具: IntelliJ IDEA2017 JDK1.8 Redis3.2 Maven3.0.2
【项目包含内容】(见下图):
eureka:注册中心
api-gateway:路由网关
sessionshare:业务session所在项目
1. 首先启动eureka, 启动成功后, 访问链接: http://localhost:8761/, 见下图
2. 启动网关服务api-gateway, 将网关服务注册到注册中心上, 刷新 http://localhost:8761/, 可以看到 api-gateway已经注册到
eureka上了
3. 最后启动sessionshare, 注意,这个项目分别以 8080, 8090两个端口启动, 启动成功后见下图:
在启动sessionshare前,还需要安装redis,并且启动redis, 因为共享的session数据存放在redis中
4. 在地址栏输入: http://localhost:9000/service-session-redis/getUser 通过网关访问 项目sessionshare中的getUser接口
不断刷新这个地址, 通过后台日志可以看到, sessionshare在8080,8090两个端口监听的服务会被轮循调用, 而且它们的session已经实现了共享