一、在分布式开发时Nginx负载均衡时传统做法是 把session手动存到redis中
1.常用做法redis
客户端发起一个请求,这个请求到达nginx上之后被,nginx转发给tomcatA上,然后再tomcatA上往session保存一份数据(redis),下次又来一个请求 被分到tomcatB上,从redis读取session 此方式可以实现session共享。
2.spring session
使用springsession,springsession是spring中代理过滤器,将所有的session拦截下来自动将数据同步到session中,或者自动的从redis中读取session,不用再手动存取。
二、用法
1.在pom.xml添加依赖
注意:
这里我使用的 Spring Boot 版本是 2.1.4 ,如果使用当前最新版 Spring Boot2.1.5 的话,除了上面这些依赖之外,需要额外添加 Spring Security 依赖(其他操作不受影响,仅仅只是多了一个依赖,当然也多了 Spring Security 的一些默认认证流程)
2.配置redis
spring.redis.host=192.168.66.128 spring.redis.port=6379 spring.redis.password=123 spring.redis.database=0
3.使用
@RestController public class HelloController { @Value("${server.port}") Integer port; @GetMapping("/set") public String set(HttpSession session) { session.setAttribute("user", "javaboy"); return String.valueOf(port); } @GetMapping("/get") public String get(HttpSession session) { return session.getAttribute("user") + ":" + port; } }
考虑到一会 Spring Boot 将以集群的方式启动 ,为了获取每一个请求到底是哪一个 Spring Boot 提供的服务,需要在每次请求时返回当前服务的端口号,因此这里我注入了 server.port 。
4.引入Nginx
进入 Nginx 的安装目录的 conf 目录下(默认是在 /usr/local/nginx/conf ),编辑nginx.conf 文件:
1. upstream 表示配置上游服务器
2. javaboy.org 表示服务器集群的名字,这个可以随意取名字
3. upstream 里边配置的是一个个的单独服务
4. weight 表示服务的权重,意味者将有多少比例的请求从 Nginx 上转发到该服务上
5. location 中的 proxy_pass 表示请求转发的地址, / 表示拦截到所有的请求,转发转发到刚刚配置好的服务集群中
6. proxy_redirect 表示设置当发生重定向请求时,nginx 自动修正响应头数据(默认是 Tomcat 返回重定向,此时重定向的地址是 Tomcat 的地址,我们需要将之修改使之成为 Nginx 的地址)。



