SpringBoot2.x+Redis+nginx實現session共享和負載均衡


 1.創建SpringBoot項目添加依賴

<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>

2.完整pomxml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sunny.spring.boot</groupId>
    <artifactId>springboot-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--session相關-->
        <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>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
View Code

3.application.yml配置

redis連接信息需要修改為自己的

spring:
  session:
    store-type: redis #session的存儲方式
  redis:
    host: 192.168.31.170
    port: 6379
    password: admin@1009

4.創建Controller獲取session信息

package com.sunny.spring.boot.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * @ClassName: SessionController
 * @Description: session操作
 * @Author: sunt
 * @Date: 2019/8/26 14:53
 * @Version 1.0
 **/
@RequestMapping("/session")
@RestController
public class SessionController {

    /**
     * 獲取session信息
     * @param request
     * @return
     */
    @RequestMapping("/getSeesion")
    public String getSeesion(HttpServletRequest request) {
        String sessionId = request.getSession().getId();
        int serverPort = request.getServerPort();
        System.out.println("當前請求session:" + sessionId);
        return "請求服務器端口號:" + serverPort + ",當前服務器的seionId:" + sessionId;
    }

}

5.啟動redis服務

6.啟動項目並訪問

啟動如果報如下錯誤信息,需要檢查redis連接信息是否配置准確

本地訪問:http://127.0.0.1:8080/session/getSeesion 可以獲取到sessionid說明項目可以正常啟動和訪問,接下來需要配置nginx部署多個應用程序實現負載均衡

7.nginx負載均衡配置

編輯nginx.conf配置文件,需要做如下配置即可

  • 在http節點配置所需負載的應用地址
#配置負載地址
  upstream session-redis {
        server 127.0.0.1:18081 weight=1;  #weight是權重的意思,值越大分配訪問的概率越大
        server 127.0.0.1:18082 weight=3;
        server 127.0.0.1:18083 weight=2;
    }

  • 在server節點下的location配置訪問地址
 proxy_pass http://session-redis;

注意:session-redis必須要與上一步upstream后面的名稱保持一致,這個名稱無要求自己隨意指定

 

  • 校驗nginx配置文件是否准確並重新加載nginx配置信息
./sbin/nginx -t
 ./sbin/nginx -s reload

8.部署多個應用程序

按照nginx負載均衡配置,同一個應用程序以18081,18082,18083端口部署三份,並為各自端口分別指定輸出日志到server1.log、server2.log、server3.log

nohup java -jar springboot-demo-0.0.1-SNAPSHOT.jar --server.port=18081 > server1.log &  
nohup java -jar springboot-demo-0.0.1-SNAPSHOT.jar --server.port=18082 > server2.log & 
nohup java -jar springboot-demo-0.0.1-SNAPSHOT.jar --server.port=18083 > server3.log &  

9.測試

瀏覽器訪問默認nginx的80端口,如果可以正常轉發到各個應用程序並且訪問到每個應用程序的session會話一致說明配置負載和session共享搭建成功

這里本來打算錄制個gif操作圖,但是錄制了好幾次都太大只能保存一部分,有好的gif錄制麻煩評論區推薦一波,這里就截圖展示

通過瀏覽器訪問獲取session請求:http://192.168.31.170/session/getSeesion不斷刷新,可以看到sever*.log隨機輸出日志,但是訪問到serve1的頻率最低(1次),說明我們配置的權重也生效

頁面訪問展示

日志文件截圖展示

 10.查看redis緩存session信息

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM