资讯专栏INFORMATION COLUMN

springCloud Finchley 微服务架构从入门到精通【十二】整合Redis实现Sessi

UCloud / 1511人阅读

摘要:架构师群社区群需加微信拉您进入微信公众号架构师修行本公众号将要使用一年的时间,按照高级软件架构师实战培训的路线发布一期完整的架构文章,难度由浅入深,适合有一定开发基础想转架构和正在做初级架构开发的人员学习,欢迎关注

在springcloud微服务项目中,使用redis实现session共享是比较主流的,简单高效,直接代码实践:

1、在pom.xml中添加相关依赖
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
          
            org.springframework.session  
            spring-session-data-redis  
         
2、添加redis配置

service-user-session-redis-dev.yml

server:
  port: 8831
management: 
  endpoints:
    web:
      exposure: 
        include: "*"
      cors:
        allowed-origins: "*"
        allowed-methods: "*" 
spring: 
  redis:
    database: 0
    host: 192.168.248.131
    port: 6379
    password: 
    timeout: 20000
    #cluster:
      #nodes: 192.168.211.134:7000,192.168.211.134:7001
      #- 
      #max-redirects: 
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
3、添加redis配置类启用redis代码spring默认session

RedisSessionConfig

package com.mayi.springcloud.config;

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

@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {

}
4、UserManagementController中添加测试方法
package com.mayi.springcloud.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class UserManagementController {
    
    
    /**
     * redis sesion共享
     * @param request
     * @return
     */
    @GetMapping("/getUser")
    public String getUser(HttpServletRequest request){
        HttpSession session = request.getSession();
        String username = (String)session.getAttribute("username");
        if(StringUtils.isEmpty(username)){
            session.setAttribute("username", "testSessionRedis|" + System.currentTimeMillis());
        }
        return username;
    }
}
5、修改网关配置

springcloud项目中经过网关zuul转发请求后发生session失效问题,这是由于zuul默认会丢弃原来的session并生成新的session,解决方法网关配置文件

service-zuul-dev.yml 中添加 sensitiveHeaders: "*"

server:
  port: 1100
zuul: 
  ignoredServices: "*" #忽略所有未配置的service
  host:
    connect-timeout-millis: 20000
    socket-timeout-millis: 20000
  routes:
    user-service: #自定义名称
      path: /user/**
      serviceId: service-user #/user/开头的路径转发至service-user微服务
      sensitiveHeaders: "*"
    user-redis-session-service: 
      path: /user-session/**
      serviceId: service-user-session-redis
      sensitiveHeaders: "*" 
hystrix: #hystrix配置
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2500 
ribbon: #ribbon负载均衡参数配置
  ReadTimeout: 5000
  ConnectTimeout: 5000
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
6、测试

依次启动EUREKA、SERVICE-CONFIG、SERVICE-USER-SESSION-REDIS、SERVICE-ZUUL

多次访问网关地址http://localhost:1100/user-session/getUser

1、发现redis中已经有了session的信息

2、session中的信息为redis中获取的,并且是同一个session

总结:springcloud整合redis实现session共享容易发生错误的地方就是经过网关转发会使原session失效,多数人会认为是整合没有成功,仔细看zuul的源码或者直接访问微服务去尝试,不难发现问题的所在。

架构师Q群:618578034

spring cloud社区群(需加微信拉您进入)

微信公众号:java架构师修行

本公众号将要使用一年的时间,按照JAVA高级软件架构师实战培训的路线发布一期完整的架构文章,难度由浅入深,适合有一定开发基础想转架构和正在做初级架构开发的人员学习,欢迎关注

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/36669.html

相关文章

  • springCloud Finchley 服务架构入门精通【十一】Tomcat 部署项目

    摘要:在基于老版本的中使用部署项目是比较麻烦的,你可能需要在中手动排除来部署到线上环境而排除后中又无法使用类启动工程。在新版本的中,开发者们解决了这个问题,现在使用部署项目是非常简单的,只需要简单两步就可以保证本地和线上同时可用。   在基于老版本的springcloud中使用tomcat部署项目是比较麻烦的,你可能需要在pom.xml中手动排除tomcat来部署到线上环境,而排除tomca...

    Rocture 评论0 收藏0
  • springCloud Finchley 服务架构入门精通【十】Docker Maven插件部

    摘要:一上安装服务器的安装部署要求系统的内核版本高于,验证版本是否支持。 一、Centos7 上安装docker docker服务器的安装部署 1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,验证CentOS 版本是否支持 Docker 。 root@bogon ~]# uname -r 2、更新yum包到最新 root@bogon ~]# sudo yum updat...

    Soarkey 评论0 收藏0
  • Java入门基础知识点总结(详细篇)

    摘要:深入理解数据库管理系统通用知识及数据库的使用与管理。为后台开发打下坚实基础。项目文档,项目规范,需求分析,数据库设计,工程构建,需求评审,配置管理,修复,项目管理等。 很多新手在学习java的时候都比较迷茫,不知道从哪里开始学起,这里就给大家整理了一份java开发学习路线,比较系统全面,可参...

    shinezejian 评论0 收藏0
  • 小白程序员一路晋升为大厂高级技术专家我看过哪些书籍?(建议收藏)

    摘要:大家好,我是冰河有句话叫做投资啥都不如投资自己的回报率高。马上就十一国庆假期了,给小伙伴们分享下,从小白程序员到大厂高级技术专家我看过哪些技术类书籍。 大家好,我是...

    sf_wangchong 评论0 收藏0
  • Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不

    摘要:下表整理了目前的版本与版本的兼容关系还未所以,不论您是在读我的基础教程基础教程还是正在连载的系列教程。 这篇博文是临时增加出来的内容,主要是由于最近连载《Spring Cloud Alibaba基础教程》系列的时候,碰到读者咨询的大量问题中存在一个比较普遍的问题:版本的选择。其实这类问题,在之前写Spring Cloud基础教程的时候,就已经发过一篇《聊聊Spring Cloud版本的...

    feng409 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<