欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot2.x+Redis+nginx实现session共享和负载均衡

程序员文章站 2023-11-23 10:09:40
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>

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连接信息是否配置准确

SpringBoot2.x+Redis+nginx实现session共享和负载均衡

本地访问: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;
    }

SpringBoot2.x+Redis+nginx实现session共享和负载均衡

  • 在server节点下的location配置访问地址
 proxy_pass http://session-redis;

注意:session-redis必须要与上一步upstream后面的名称保持一致,这个名称无要求自己随意指定

 SpringBoot2.x+Redis+nginx实现session共享和负载均衡

  • 校验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次),说明我们配置的权重也生效

页面访问展示

SpringBoot2.x+Redis+nginx实现session共享和负载均衡

日志文件截图展示

SpringBoot2.x+Redis+nginx实现session共享和负载均衡

SpringBoot2.x+Redis+nginx实现session共享和负载均衡

SpringBoot2.x+Redis+nginx实现session共享和负载均衡

 10.查看redis缓存session信息

 SpringBoot2.x+Redis+nginx实现session共享和负载均衡