zoukankan      html  css  js  c++  java
  • 微服务session数据共享

    微服务之间的数据共享之session

    session域是存储在服务器端的内存中,但是现在使用微服务,各个功能模块之间拆分成不同的服务,每个服务负责某种功能,每个服务都是一个进程,所有每个服务中的内存数据是不共享的,故存储在每个服务中的session对象不可以被所有的微服务共享。

    Session对象,就是客户端浏览器与服务器之间建立的互动信息状态。每一个不同的用户连接将得到不同的Session,也就是说Session与用户之间是一种一对一的关系。Session在用户进入网站时由服务器自动产生,并在用户正常离开站点时释放.,现在项目是微服务项目,有多个服务,每个服务之间的内存是不共享的,所有session存储在某个服务的内存中其他服务是获取不到的。

    session对象:用户访问某个微服务的时候,创建了session对象,为这个对象生成一个唯一的jessionid,这个jessionid是存储在cookie对象中,返回给浏览器端,以后客户端每次给服务器发送请求的时候都会带这个存储jessionid的cookie。服务器端如果使用这个jessionid找到了对应的session,那么就可以直接获取session域中存储的数据,如果服务器端没有找到这个jessionid对应的session,那么服务器端会新创建一个session对象,给这个对象在行创建一个sessionid去存储到cookie中返回给浏览器,这样也就修改了jessionid导致即使他访问原来的服务,由于jessionid修改了也会找不到原来的session数据

    .

    示意图:

                 所以把session存储到内存中这样的方法不适应于微服务,解决方法:把session对象存储到redis中,只要所以的服务绑定同一个redis就可以获取到redis中的存储的session数据。

    实现:导入依赖           

     <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
            </dependency>
    

    配置redis

     redis:
        host: 192.168.127.128
        port: 6379
        lettuce:
         pool:
          max-active: 20  #最大连接数,负值表示没有限制,默认8
          max-wait: -1    #最大阻塞等待时间,负值表示没限制,默认-1
          max-idle: 8     #最大空闲连接,默认8
          min-idle: 0     #最小空闲连接,默认0

     配置session域:

    session:
        store-type: redis

    配置好上面后,项目中创建的session都存储到redis中 

      demo:使用dateway网关配置了路由转发,使得访问微服务的请求均衡的发到各个服务上,查看各个微服务是不是都可以获取到session中的存储数据。 

    github地址:git@github.com:zhangyang-yu/SessionProject.git                    

  • 相关阅读:
    模拟赛总结
    2018.04.06学习总结
    2018.04.06学习总结
    Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
  • 原文地址:https://www.cnblogs.com/zhangyang4674/p/14249622.html
Copyright © 2011-2022 走看看