在以往通過(guò)nginx+tomcat實(shí)現(xiàn)負(fù)載均衡時(shí)俱济,利用redis來(lái)實(shí)現(xiàn)session共享冒签,原理是利用tomcat的session中間件tomcat-redis-session-manager
,利用這個(gè)來(lái)替代servlet管理tomcat的session钟病。這樣非常好萧恕,而且是應(yīng)用無(wú)侵入的形式。
現(xiàn)在有好事者肠阱,開發(fā)了spring集成redis的組件來(lái)管理session票唆,原理其實(shí)和上面講的一樣,就是利用spring-session-data-redis
這個(gè)插件來(lái)管理session屹徘。這個(gè)有個(gè)好處就是如果不用tomcat走趋,用jetty或weblogic一樣都可以實(shí)現(xiàn)session的共享。
下面來(lái)說(shuō)明一下具體實(shí)現(xiàn)方法噪伊,這里只講共享session的設(shè)置簿煌,其余都是springmvc的設(shè)置氮唯,具體配置參見 9.SpringMVC
添加依賴
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
這里需要添加兩個(gè)核心依賴,一個(gè)是spring集成redis和session的姨伟,另一個(gè)是redis.client惩琉,其余的都是springmvc的依賴。
在
web.xml
里面添加session過(guò)濾器
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
session設(shè)值與取值
@Controller
@RequestMapping("/")
public class IndexController {
/**
* 模擬進(jìn)度登錄界面
*
* @param request
* @return
*/
@RequestMapping(value = "login")
public String login(HttpServletRequest request) {
return "login";
}
/**
* 模擬登錄
* @param request
* @return
*/
@RequestMapping(value = "checkLogin")
public String checkLogin(HttpServletRequest request) {
request.getSession().setAttribute("user", "admin");
return "redirect:/index.htm";
}
/**
* 模擬進(jìn)入首頁(yè)
* @param request
* @return
*/
@RequestMapping(value = "index")
public String index(HttpServletRequest request) {
System.out.println(request.getSession().getAttribute("user"));
return "index";
}
}
這里模擬了三個(gè)請(qǐng)求授滓,第一個(gè)是進(jìn)入登錄界面琳水,第二個(gè)是模擬登錄,給session賦值般堆,第三個(gè)是進(jìn)入首頁(yè)在孝,通過(guò)session取值,都比較簡(jiǎn)單淮摔。
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="checkLogin.htm">登錄</a>
</body>
</html>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
當(dāng)前用戶:<%=session.getAttribute("user")%>
</body>
</html>
配置nginx負(fù)載均衡
這里采用nginx1.10版本私沮,配置兩個(gè)tomcat,端口分別是8080和8090和橙,對(duì)外是80
#服務(wù)器的集群
upstream critc.com { #服務(wù)器集群名字
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8090 weight=1;
}
location / {
root html;
index index.html index.htm;
proxy_pass http://critc.com;
}
nginx集群比較容易配置仔燕,共需要修改兩個(gè)地方,第一是新建一個(gè)upstream
魔招,配置兩個(gè)server的ip和端口晰搀,第二是在location
節(jié)里新增proxy_pass
都配置完后,啟動(dòng)nginx
配置同時(shí)啟動(dòng)兩個(gè)tomcat
同時(shí)配置兩個(gè)tomcat办斑,一個(gè)是tomcat1外恕,一個(gè)是tomcat2,都部署chapter3_3_redis_spring_session
這個(gè)應(yīng)用乡翅,一個(gè)端口是8080另一個(gè)是8090鳞疲,同時(shí)啟動(dòng)。
啟動(dòng)后通過(guò)http://localhost/login.htm
訪問(wèn):
點(diǎn)擊登錄按鈕蠕蚜,生成session尚洽,分別用兩個(gè)端口分別查看如下:
到這里,看到8080和8090兩個(gè)tomcat的session實(shí)現(xiàn)共享靶累。
可以看一下redis里面是怎么存儲(chǔ)這個(gè)session的:
這里強(qiáng)調(diào)一點(diǎn)腺毫,只要使用標(biāo)準(zhǔn)的servlet api調(diào)用session,在底層就會(huì)通過(guò)Spring Session得到的挣柬,并且會(huì)存儲(chǔ)到Redis或其他你所選擇的數(shù)據(jù)源中拴曲。
可以手工操作一下具體實(shí)現(xiàn)方式。
源碼下載
[本工程詳細(xì)源碼]
(https://github.com/chykong/java_component/tree/master/chapter3_3_redis_spring_session)