十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
前言
创新互联建站作为成都网站建设公司,专注成都网站建设、网站设计,有关成都定制网站方案、改版、费用等问题,行业涉及成都效果图设计等多个领域,已为上千家企业服务,得到了客户的尊重与认可。我们在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。
session的处理有很多种方法,详情见转载的上篇博客:集群/分布式环境下5种session处理策略
在这里我们讨论其中的第三种方法:session共享。
redis集群做主从复制,利用redis数据库的最终一致性,将session信息存入redis中。当应用服务器发现session不在本机内存的时候,就去redis数据库中查找,因为redis数据库是独立于应用服务器的数据库,所以可以做到session的共享和高可用。
不足:
1.redis需要内存较大,否则会出现用户session从Cache中被清除。
2.需要定期的刷新缓存
初步结构如下:
但是这个结构仍然存在问题,redis master是一个重要瓶颈,如果master崩溃的时候,但是redis不会主动的进行master切换,这时session服务中断。
但是我们先做到这个结构,后面再进行优化修改。
Spring Boot提供了Spring Session来完成session共享。
官方文档:http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html#boot-sample
首先创建简单的Controller:
@Controller public class UserController { @RequestMapping(value="/main", method=RequestMethod.GET) public String main(HttpServletRequest request) { HttpSession session = request.getSession(); String sessionId = (String) session.getAttribute("sessionId"); if (null != sessionId) { // sessionId不为空 System.out.println("main sessionId:" + sessionId); return "main"; } else { // sessionId为空 return "redirect:/login"; } } @RequestMapping(value="/login", method=RequestMethod.GET) public String login() { return "login"; } @RequestMapping(value="/doLogin", method=RequestMethod.POST) public String doLogin(HttpServletRequest request) { System.out.println("I do real login here"); HttpSession session = request.getSession(); String sessionId = UUID.randomUUID().toString(); session.setAttribute("sessionId", sessionId); System.out.println("login sessionId:" + sessionId); return "redirect:/main"; } }