--- typora-copy-images-to: img typora-root-url: img

1. 聊聊集群中会出现的问题

一个项目最开始可能都是通过一个war包开始萌芽,把这个war包放到tomcat里面运行起来,整个项目就ok了;

But,随着并发量,用户量达到一定数目,一个tomcat就搞不定了,这个时候会用到Nginx,使用Nginx来做分流;

如果是一些查询页面没什么问题,可一旦项目要用到登陆,这就捅娄子了,用户登陆的Session是存放在服务器上,而当用户访问另外一个服务器就会出现没有登陆的情况;

不过在解决这问题之前,先讲下Nginx的基本使用

1.1. Nginx****多tomcat负载配置

Nginx可以提供当有多个服务器的时候可以提供负载均衡的功能,如果有某个服务器宕机可以提供故障转移,当出现网络波动的时候可以提供失败重试机制,不管是什么样的机制,首先需要配置多个服务,这里的服务使用Upstream进行配置

1.1.1. Upstream Server配置

upstream 主要配置如下:

IP地址和端口号:配置上游服务器的IP地址和端口

1.1.2. 负载均衡算法

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

2、weight(轮询权值)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

3、ip_hash

​ 每个请求按客户端P的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。

1.2. Session一致性解决方案

可以看到前面讲负载均衡算法的时候可以使用ip_hash来实现session一致性的问题,因为当有多个tomcat的时候,对于某个客户端的登陆请求,由于其ip是固定的,所以最终一

还是会路由的固定的tomcat上;

实际除开上面的这种解决方案以外,还有另外一种SESSION一致性的解决方案,使用Redis来存放SESSION的内容,使用Spring Session框架,其底层其实就是重写了HttpSession的获取方式

1.2.1. pom文件修改

<dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-redis</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.session</groupId>

            <artifactId>spring-session-data-redis</artifactId>

        </dependency>

1.2.2. 新增properties文件

application.properties文件内容如下,增加redis相关配置

# Redis服务器地址

spring.redis.host=127.0.0.1

spring.redis.port=6379

1.2.3. 新增启动类

package cn.enjoy.mt;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

 

@SpringBootApplication

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)

public class App {

    public static void main(String[] args) {

        SpringApplication.run(App.class, args);

    }

}

 

1.2.4. 启动Redis

启动 /redis-serve redis.conf

1.2.5. 测试

用户登陆后

img

这样相应的登陆的session信息就存放到了Redis中