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: [email protected]

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

原文地址:https://www.cnblogs.com/sunny1009/p/11413329.html

时间: 2024-10-09 20:51:40

SpringBoot2.x+Redis+nginx实现session共享和负载均衡的相关文章

springboot+spring session+redis+nginx实现session共享和负载均衡

环境 centos7. jdk1.8.nginx.redis.springboot 1.5.8.RELEASE session共享 添加spring session和redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> &

Nginx + Memcached 实现Session共享的负载均衡

session共享 我们在做站点的试试,通常需要保存用户的一些基本信息,比如登录就会用到Session:当使用Nginx做负载均衡的时候,用户浏览站点的时候会被分配到不同的服务器上,此时如果登录后Session就在不同发服务器上,A记住了用户的登录状态,可是下一次用户请求被分配到B去了怎么办?不可能让用户再登陆一次.所以要实现session共享. 方法 1.ip_hash,这是Nginx的轮询方法,用户登录站点时,就会一直在这台服务器上就不存在Session的问题 优点:不需要采用任何处理: 缺

tomcat redis nginx 实现session共享

Redis tomcat nginx 实现session共享 redis3.1   tomcat7    nginx 1.8.1 jar包  jedis-2.7.2.jar   tomcat-redis-session-manage-tomcat7.jar  commons-pool2-2.4.2.jar Redis安装在fedora中 一.将redis设置主从服务器http://blog.csdn.net/qq_27966627/article/details/51249774 端口分别为63

Tomcat+Redis+Nginx实现session共享(Windows版)

redis安装:xx nginx安装:xx 步骤: 1.下载tomcat-redis-session-manager相应的jar包,主要有三个: wget https://github.com/downloads/jcoleman/tomcat-redis-session-manager/tomcat-redis-session-manager-1.2-tomcat-7-Java-7.jarwget http://central.maven.org/maven2/redis/clients/je

【电商】nginx+redis+tomcat实现session共享集群

本文记录nginx+redis+tomcat实现session共享的过程 tomcat-redis-session-manager组件:https://github.com/jcoleman/tomcat-redis-session-manager tomcat-redis-sessoin-manager对tomcat的支持: (1) tomcat6:支持,要求jdk为1.6, 需要引入tomcat-redis-session-manager-1.2-tomcat-6.jar,不过现在已经处理不

.Net Core Web Api实践(二).net core+Redis+IIS+nginx实现Session共享

前言:虽说公司app后端使用的是.net core+Redis+docker+k8s部署的,但是微信公众号后端使用的是IIS部署的,虽说公众号并发量不大,但领导还是使用了负载均衡,所以在介绍docker+k8s实现分布式Session共享之前,就先介绍一下IIS+nginx实现Session共享的方案,两者其实区别不大,所以这篇着重介绍方案,下篇介绍测试的区别以及填坑的方式. 1.环境准备 操作系统:Windows10 IIS:需要安装模块 VS2019.本地Redis数据库.ngnix(win

.Net Core Web Api实践(三).net core+Redis+docker实现Session共享

前言:上篇文章介绍了.net core+Redis+IIS+nginx实现Session共享,本来打算直接说明后续填坑过程,但毕竟好多坑是用docker部署后出现的,原计划简单提一下.net core+Redis+docker实现Session共享,但是发现篇幅也不小,所以还是单独起草一篇,除了k8s部署docker,其它部分都有基本介绍. 1.环境准备 操作系统:Windows10 VS2019.本地Redis数据库.Windows docker 2.背景介绍 由于项目从asp.net MVC

Nginx的反相代理, 负载均衡

转自 http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几

nginx如何做到TCP的负载均衡

TCP 的 负载均衡 这个片段描述了如何通过nginx plus进行负载均衡 在版本5中,nginx plus 能够代理和负载均衡通过TCP路径,TCP对于一些流行应用和服务是一个协议:LDAP.MYSQL.RTMP stream 模块 TCP 负载均衡被nginx的三个模块所实现,而且这些模块被嵌入在nginx plus中. 它们定义的命令是在stream配置块中: ngx_stream_core_module :定义基本的命令来激活这个TCP通信过程 ngx_stream_proxy_mod