Springcloud 使用redis实现session共享

之前用nginx做负载均衡,要实现session共享,用的是iphash,在nginx加一句配置就可以了。框架改为Springcloud之后,使用zuul做为负载和反向代理工具,实现session共享用到了redis,感觉很不错。

前提要实现负载均衡,用的是zuul和服务注册,在这基础上继续实现session共享( https://blog.csdn.net/weixin_43442246/article/details/84315195 )。

如图:项目结构,demo是注册中心,demo2,3是两个客户端,zuuls是网关层。
Springcloud 使用redis实现session共享_第1张图片
session共享步骤
1,在demo2,3中引入session共享的相关jar,包括redis和session

    
        org.springframework.boot
        spring-boot-starter-data-redis
    
    
        org.springframework.session
        spring-session-data-redis
    

2,在demo2,3的配置文件中添加redis配置

spring.redis.database=0
spring.redis.host=127.0.0.1
#redis默认端口
spring.redis.port=6379
spring.redis.password=
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000ms
spring.session.store-type=redis

需要在本机(我的)安装redis,redis安装要求2.8还是3.0以上(小于会报错)来着,越大越好,我用的是3.2,如图所示:
Springcloud 使用redis实现session共享_第2张图片
3,在demo2,demo3中添加redis启动类,如图所示:
Springcloud 使用redis实现session共享_第3张图片
@EnableRedisHttpSession是关键,开启session写入redis

4,写session测试的Controller
demo2中,

 @RequestMapping("/hello")
    public String hello(HttpServletRequest request) {
        HttpSession session = request.getSession();
                String mysession = (String) session.getAttribute("mysession");
                if (mysession==null||"".equals(mysession)) {
                    mysession = "02|" + System.currentTimeMillis();
                         session.setAttribute("mysession", mysession);
                    }
                return mysession;

    }

demo3中,

@RequestMapping("/hello")
    public String hello(HttpServletRequest request) {
        HttpSession session = request.getSession();
        String mysession = (String) session.getAttribute("mysession");
        if (mysession==null||"".equals(mysession)) {
            mysession = "03|" + System.currentTimeMillis();
            session.setAttribute("mysession", mysession);
        }
        return mysession;

}

区别是mysession的值 为 02 和 03.
5,zuul设置sensitiveHeaders为*,会过滤客户端附带的headers

#设置服务名
spring.application.name=zuul
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=client-A
zuul.routes.api-a.sensitiveHeaders="*"  

6,测试, 启动demo1-3和zuuls,

Springcloud 使用redis实现session共享_第4张图片
可以看到,注册中心的三个客户端,其中demo2,3的server-name都是CLIENT-A,这样访问zuul会轮询查询demo2,3的接口,可以参考上一篇。

访问地址 http://localhost:7070/api-a/hello
Springcloud 使用redis实现session共享_第5张图片
不管怎么刷新都是03|1544432026486,说明在访问demo3第一次(不知道为什么第一次不是demo2)生成了session,之后再次访问2或3都用的这个session,表示已经成功。

你可能感兴趣的:(spring,boot,java)