微服务之间的数据共享之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                    

posted on 2021-01-14 22:13  慕容锤  阅读(1515)  评论(0编辑  收藏  举报