SpringBoot开发案例之分布式集群共享Session

前言

在分布式系统中,为了提高系统性能,一般会对单体项目进行拆分,分解成多个基于功能的微服务,若是有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。nginx

那么问题来了,若是使用传统管理 Session 的方式,咱们会遇到什么样的问题?redis

案例

这里拿下单举例,用户小明在天猫上相中了一个的娃娃,以为不错,果断购买,选尺寸,挑身高,而后确认选择,赶忙提交订单,而后就跳转到了登陆页面!小明表示很郁闷,大写的问号???spring

  • 小明进入娃娃页面,此时请求经过代理服务发送到业务系统一。后端

  • 小明选尺寸,挑身高,此操做并无对后端服务发送请求。session

  • 小明提交订单,此时请求经过代理服务发送到业务系统二,然鹅,二系统此时并无查询到小明的登陆信息,就被无情的跳转到登陆页了。app

方案

HttpSession 默认使用内存来管理 Session,一般服务端把用户信息存储到各自的 Jvm 内存中。因此小明下单的时候找不到登陆信息,那么我么何不把用户信息集中存储!?分布式

为了测试效果,这里咱们搭建一个演示案例,项目涉及 SpringBoot、spring-session、redis、nginx 等相关组件。ide

pom.xml引入依赖:spring-boot

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

配置 redis 参数,软件自行安装:微服务

## redis#session存储类型spring.session.store-type=redisspring.redis.database=0spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=123456spring.redis.pool.max-active=8spring.redis.pool.max-wait=-1spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.timeout=3000

简单的用户登陆实现,省略部分代码:

@RequestMapping(value="login",method=RequestMethod.POST)public Result login(String username,String password,HttpServletRequest request,HttpServletResponse response) throws Exception {
		SysUser user = userService.getUser(username);		if(user==null) {			return Result.error("用户不存在");
		}else {			if(user.getPassword().equals(password)) {
				request.getSession().setAttribute("user", user);				return Result.ok();
			}else {				return Result.error("密码错误");
			}
		}
}

配置代理实现,基于 Nginx:

server {        listen       80;        server_name  blog.52itstyle.vip;        location / {            proxy_pass http://192.168.1.2:8080; 
        }        location /cart {             proxy_pass http://192.168.1.3:8080$request_uri;
        }       location /order {             proxy_pass http://192.168.1.4:8080$request_uri;
        }
  }

配置成功后登陆系统,在 redis 中查询用户信息:

127.0.0.1:6379> keys *
1) "spring:session:expirations:1562577660000"2) "spring:session:sessions:1076c2bd-95b1-4f23-abd4-ab3780e32f6f"3) "spring:session:sessions:expires:1076c2bd-95b1-4f23-abd4-ab3780e32f6f"

小结

这样,小明就能够开心的买娃娃了!

相关文章
相关标签/搜索