1. 程式人生 > >實戰——session共享(Spring Boot + Spring Session + Redis)

實戰——session共享(Spring Boot + Spring Session + Redis)

目的:實現伺服器間session共享

環境:一臺CentOS7的虛擬機器,虛擬機器安裝了Redis資料庫和Docker容器,Docker運行了1臺Nginx容器和2臺Tomcat容器

結構圖

本地建立一個域名www.example.com指向ip地址192.168.40.128,通過www.example.com訪問虛擬機器,虛擬機器對映Nginx伺服器,Nginx伺服器對映到兩臺tomcat伺服器

實戰準備:1.安裝docker

  2.下載兩個docker映象(Nginx映象,Tomcat映象) 【注:由於spring boot專案自帶tomcat,所以也可下載基礎映象如Ubuntu、CentOS來進行部署】

  3.安裝Redis快取資料庫

步驟

1.執行容器,使用 docker  run-it  命令執行3各容器,1個Nginx容器,2個Tomcat容器

【注】

1.Nginx需要繫結埠號,本文將宿主機的8080埠綁定了Nginx的80埠;

2.Tomcat可不繫結埠;3.docker命令參見附錄地址

2.進入Nginx容器,配置需代理的目標伺服器。本文中,nginx指向172.17.0.3:8080、172.17.0.4:8080,權重都為1


反向代理測試:

1.分別開啟兩臺Tomcat容器(以p地址為172.17.0.3為例),在webapps路徑下建立目錄 mkdir nginxTest

 2.在新建路徑下建立檔案 touch index.html

 檔案內容:

<head>
 <title>nginxTest</title>
</head>
<body>
hello 172.17.0.3
</body>
【注:ip地址為172.17.0.4的index.html 修改為 hello 172.17.0.4以示區分】

3.在宿主機進行反向代理測試(可以看出會訪問nginx反向代理的兩臺tomcat)


【注】

1.使用 ifconfig -a  查詢本機ip地址

2.tomcat/conf/server.xml中可配置所開啟的埠

3.使用 tomcat/bin/startup.sh開啟tomcat服務,並在tomcat本地先進行curl 測試,確保tomcat執行成功後再進行nginx反向代理測試

3.建立spring boot專案

(1)pom.xml檔案

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.session</groupId>
			<artifactId>spring-session-data-redis</artifactId>
		</dependency>
(2)application.yml
server:
  port: 8080
  session-timeout: 60
spring:
    redis:  
       database: 0  
       host: 192.168.40.128
       port: 6379  
       password:  
       timeout: 0  
       pool:  
           max-active: 8  
           max-wait: -1  
           max-idle: 8  
           min-idle: 0  
    session:  
      store-type: redis
【注】

1.server的port指定tomcat的埠號

2.sping.redis.host 是redis資料庫的IP地址,埠號預設6379

3.spring.session.store-type需要指定redis進行session資料儲存

4.確保spring boot專案所在的伺服器能使用telnet命令 redis的ip和port,如果不通,請確保ip、port正確性,redis所在伺服器的防火牆是否關閉或開啟該埠

5.Redis的配置檔案redis.conf需要更改兩個地方(釋出環境請自行增加password)

1)bind 127.0.0.1 改為 bind 0.0.0.0   //將redis暴露在公網

2)protected-mode yes   改為  protected-mode no  //取消保護模式

(3)spring.xml(主域名與子域名可進行跨域session共享的配置)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
        <property name="domainName" value="example.com"/>
        <property name="cookieName" value="JSESSIONID"/>
        <property name="cookiePath" value="/" />
        <!-- <property name="domainNamePattern" value="^.+?\.(\w+\.[a-z]+)$"></property>-->
    </bean>

    <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="1800" />
        <property name="cookieSerializer" ref="defaultCookieSerializer"/>
    </bean>
</beans>

(4)建立SpringConfig類(讀取spring.xml配置檔案)

package com.cssweb.redis.config;

@Configuration
@ImportResource(locations={"spring.xml"})
public class SpringConfig {
}
(5)建立RedisConfig類(通過EnableRedisHttpSession註解進行自動配置)
package com.cssweb.redis.config

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=60)//session 1分鐘後過期
public class RedisConfig {
}

(6)建立QuickRunController類

package com.cssweb.login.controller;

@RestController
@RequestMapping(value = "/admin/")
public class QuickRunController {
    @RequestMapping(value = "/sessions", method = RequestMethod.GET)
    public Object sessions (HttpServletRequest request){
        Map<String, Object> map = new HashMap<>();
        map.put("sessionId", request.getSession().getId());
        return map;
    }
}

(7)SpringBoot啟動類(應用入口)
package com.cssweb;

@SpringBootApplication
@EnableAutoConfiguration
public class ShareSession1Application extends SpringBootServletInitializer{

	public static void main(String[] args) {
		SpringApplication.run(ShareSession1Application.class, args);
	}
}

【注】

1.SpringConfig + spring.xml 是子域名間共享session

2.QuickRunController 提供/admin/sessions介面

3.將專案通過mvn package進行打包,放入宿主機中(jar包名為sharesession)

4.宿主機使用 docker cp 命令 ,將專案拷貝到172.17.0.3和172.17.0.4伺服器上

5.使用 java -jar sharesession --server.port=8080進行啟動服務(這裡tomcat開啟埠為8080)

4.在本機設定虛假域名

編輯C:\Windows\System32\drivers\etc\HOSTS檔案,增加兩個程式碼

192.168.40.128 www.example.com
192.168.40.128 passport.example.com
5.測試

使用瀏覽器訪問 www.example.com:8080/admin/sessions 以及 passport.example.com/admin/sessions


【注】

1.千萬別使用curl 命令 在linux系統中進行測試,因為不管怎麼測,你的Session ID都會一直變。

2.由於已經測試過反向代理模組,所以在spring boot專案中不再進行測試

【附錄】