--- 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. 测试
用户登陆后
这样相应的登陆的session信息就存放到了Redis中