SpringCloud实现Redis在各个微服务的Session共享问题

在微服务中,需要我们在各个微服务中共享Session,使用Redis来共享Session是一个很好的解决方法,Redis是运行在内存中,查取速度很快。

1.pom文件中添加依赖

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

2.使用Redis的session替换Spring的session

package com.xueqing.demo.sleuthserverhi;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
/**
 * 添加redis配置类启用redis代码spring默认session
 */
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
}

3.application.properties配置文件中添加redis配置

spring.redis.port= 6379
spring.redis.host=localhost

4.启动两个端口以一样的tomcat测试

package com.xueqing.demo.sleuthserverhi;

import java.util.logging.Level;
import java.util.logging.Logger;
import brave.sampler.Sampler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
@SpringBootApplication
@RestController
public class SleuthServerHiApplication {
  public static void main(String[] args) {
    SpringApplication.run(SleuthServerHiApplication.class, args);
  }
  private static final Logger LOG = Logger.getLogger(SleuthServerHiApplication.class.getName());
  @Autowired
  private RestTemplate restTemplate;
  @Bean
  @LoadBalanced
  public RestTemplate getRestTemplate(){
    return new RestTemplate();
  }
  @RequestMapping("/hi")
  public String callHome(HttpServletRequest request){
    LOG.log(Level.INFO, "calling trace service-hi ");
    request.getSession().setAttribute("hi","111");
    LOG.log(Level.WARNING, "加入成功");
    return restTemplate.getForObject("http://localhost:8989/miya", String.class);
  }
  @RequestMapping("/info")
  public String info(HttpServletRequest request){
    LOG.log(Level.INFO, request.getSession().getAttribute("miya")+"");
    LOG.log(Level.WARNING, "获取成功");
    return "i'm service-hi";
  }
  @Bean
  public Sampler defaultSampler() {
    return Sampler.ALWAYS_SAMPLE;
  }
}
package com.xueqing.demo.sleuthservermiya;
import brave.sampler.Sampler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
import java.util.logging.Level;
import java.util.logging.Logger;
@SpringBootApplication
@RestController
public class SleuthServerMiyaApplication {
  public static void main(String[] args) {
    SpringApplication.run(SleuthServerMiyaApplication.class, args);
  }
  private static final Logger LOG = Logger.getLogger(SleuthServerMiyaApplication.class.getName());
  @RequestMapping("/hi")
  public String home(HttpServletRequest request){
    LOG.log(Level.INFO, "hi is being called");
    request.getSession().setAttribute("miya","111");
    LOG.log(Level.WARNING, "加入成功");
    return "hi i'm miya!";
  }
  @RequestMapping("/miya")
  public String info(HttpServletRequest request){
    LOG.log(Level.INFO, "info is being called");
    LOG.log(Level.INFO, request.getSession().getAttribute("hi")+"");
    LOG.log(Level.WARNING, "获取成功");
    return restTemplate.getForObject("http://localhost:8988/info",String.class);
  }
  @Autowired
  private RestTemplate restTemplate;
  @Bean
  @LoadBalanced
  public RestTemplate getRestTemplate(){
    return new RestTemplate();
  }
  @Bean
  public Sampler defaultSampler() {
    return Sampler.ALWAYS_SAMPLE;
  }
}

5.注意事项:我用的springCloud版本为F版本需要Redis版本为2.8以上 如果不是2.8以上请升级,地址如下

https://github.com/MicrosoftArchive/redis/releases

总结

以上所述是小编给大家介绍的SpringCloud实现Redis在各个微服务的Session共享,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Spring Boot获取微信用户信息的超简单方法

    前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要声明一点的是获取微信公众号下的用户信息的权限是服务号才有,个人订阅号是没有该权限的. 获取公众号用户信息实战 第一步需要先申请接口测试号并进行网页授权设置 访问如下链接进行接口测试号申请. https://developers.weixin.qq.com/doc/offiaccount/Basic_

  • springcloud微服务基于redis集群的单点登录实现解析

    简介 本文介绍微服务架构中如何实现单点登录功能 创建三个服务: 操作redis集群的服务,用于多个服务之间共享数据 统一认证中心服务,用于整个系统的统一登录认证 服务消费者,用于测试单点登录 大体思路:每个服务都设置一个拦截器检查cookie中是否有token,若有token,则放行,若没有token,重定向到统一认证中心服务进行登录,登录成功后返回到被拦截的服务. 搭建redis集群服务 搭建redis集群参考文档 搭建统一认证中心 主函数添加注解 /** * 单点登录既要注册到服务注册中心,

  • SpringBoot中获取微信用户信息的方法

    前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要声明一点的是获取微信公众号下的用户信息的权限是服务号才有,个人订阅号是没有该权限的. 获取公众号用户信息实战 第一步需要先申请接口测试号并进行网页授权设置 访问如下链接进行接口测试号申请. https://developers.weixin.qq.com/doc/offiaccount/Basic_

  • SpringBoot+SpringCloud用户信息微服务传递实现解析

    这篇文章主要介绍了SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 实现思路: 1:准备一个ThreadLocal变量,供线程之间共享. 2:每个微服务对所有过来的Feign调用进行过滤,然后从请求头中获取User用户信息,并存在ThreadLocal变量中. 3:每个微服务在使用FeignClient调用别的微服务时,先从ThreadLocal里面取出user信息,并

  • SpringCloud微服务之Hystrix组件实现服务熔断的方法

    一.熔断器简介 微服务架构特点就是多服务,多数据源,支撑系统应用.这样导致微服务之间存在依赖关系.如果其中一个服务故障,可能导致系统宕机,这就是所谓的雪崩效应. 1.服务熔断 微服务架构中某个微服务发生故障时,要快速切断服务,提示用户,后续请求,不调用该服务,直接返回,释放资源,这就是服务熔断. 熔断生效后,会在指定的时间后调用请求来测试依赖是否恢复,依赖的应用恢复后关闭熔断. 2.服务降级 服务器高并发下,压力剧增的时候,根据当业务情况以及流量,对一些服务和页面有策略的降级(可以理解为关闭不必

  • Spring Boot中使用LDAP来统一管理用户信息的示例

    很多时候,我们在构建系统的时候都会自己创建用户管理体系,这对于开发人员来说并不是什么难事,但是当我们需要维护多个不同系统并且相同用户跨系统使用的情况下,如果每个系统维护自己的用户信息,那么此时用户信息的同步就会变的比较麻烦,对于用户自身来说也会非常困扰,很容易出现不同系统密码不一致啊等情况出现.如果此时我们引入LDAP来集中存储用户的基本信息并提供统一的读写接口和校验机制,那么这样的问题就比较容易解决了.下面就来说说当我们使用Spring Boot开发的时候,如何来访问LDAP服务端. LDAP

  • 微信小程序 springboot后台如何获取用户的openid

    openid可以标识一个用户,session_key会变,所以来获取一下openid. openid不能在微信小程序中直接获取,需要后台发送请求到微信的接口,然后微信返回一个json格式的字符串到后台,后台处理之后,再返回到微信小程序. 发布的小程序需要https的域名,而测试的时候可以使用http. 小程序在app.js中,修改login()中的内容: // 登录 wx.login({ success: res => { // 发送 res.code 到后台换取 openId, session

  • 详解Spring Boot微服务如何集成fescar解决分布式事务问题

    什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最后释放全局锁.锁持有的时间较长,会对并发造成较大的影响,死锁的风险也较高. fescar的创新之处在于,每个局部事务执行完立即提交,释放本地锁:它会去解析你代码中的sql,从数据库中获得事务提交前的事务资源即数据,存放到undo_log中,全局事务协调器在回滚的时候直接使用undo_log中的数据覆

  • SpringCloud实现Redis在各个微服务的Session共享问题

    在微服务中,需要我们在各个微服务中共享Session,使用Redis来共享Session是一个很好的解决方法,Redis是运行在内存中,查取速度很快. 1.pom文件中添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> <depe

  • SpringCloud网关(Zuul)如何给多个微服务之间传递共享参数

    目录 1.使用场景 解决方案1 解决方案2 2.代码实现 3.成果展现 4.总结 1.使用场景 因为最近项目需要国际化,但是以前国际化的语言切换是放置在未进行微服务化之前的一个独立的SpringBoot服务之中. 目前由于业务的需要和不同模块能够复用的要求目前已经拆分为如下服务:zuul网关服务.**dx服务(包含主要服务).**ai(一些推荐的AI服务).message(消息咨询服务).forum(论坛版块服务)等等. 如果还是按照以前的的方式只切换 **dx服务 之中的语言:其他微服务是不知

  • 解析SpringCloud简介与微服务架构

    1. 微服务架构 1.1 微服务架构理解 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则.微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持. 概念:把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等

  • SpringCloud微服务基础简介

    一.什么是Spring Cloud? SpringCloud 对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性.可靠.协调的应用程序. SpringCloud 是在SpringBoot的基础上构建的,使开发者可以轻松入门并快速提高工作效率. SpringCloud 提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件. SpringCloud 为开发人

  • 详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

    分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多:还有一种是利用一些tomcat上的插件,修改tomcat配置文件,让tomcat自己去把Session放到Redis/Memcached/DB中去.这两种各有优缺,也都能解决问题. 但是现在项目全线Spring Boot,并不自己维护Tomcat,而是由Spring去启动Tomcat.这样就会有一

  • 浅谈Redis在微服务架构中的几种应用场景

    本文介绍在SpringCloud中使用Redis作为Pub/Sub异步通信.缓存或主数据库和配置服务器的三种场景应用. Redis可以广泛用于微服务架构.它可能是您应用程序以多种不同方式利用的少数流行软件解决方案之一.根据要求,它可以充当主数据库,缓存或消息代理.虽然它也是一个键/值存储,但我们可以将它用作微服务体系结构中的配置服务器或发现服务器.虽然它通常被定义为内存中的数据结构,但我们也可以在持久模式下运行它. 这里我将向您展示一些使用Redis与Spring Boot和Spring Clo

  • 新手学习微服务SpringCloud项目架构搭建方法

    这篇文章主要介绍了新手学习微服务SpringCloud项目架构搭建方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring的微服务框架SpringCloud受到众多公司欢迎,给大家带来一篇框架搭建入门.本次采用的版本是Spring Cloud版本为Finchley.RELEASE. 一.SpringCloud项目简介 spring cloud: 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.

  • SpringCloud 微服务数据权限控制的实现

    目录 一. 整体架构 二. 实现流程 三. 实现步骤 1. 注解实现 2. 注解使用 3. 实现AuthStoreSupplier 4. 实现AuthQuerySupplier 5. 开启数据权限 四. 综述 五.源代码 举个例子: 有一批业务员跟进全国的销售订单.他们被按城市进行划分,一个业务员跟进3个城市的订单,为了保护公司的业务数据不能被所有人都掌握,故每个业务员只能看到自己负责城市的订单数据.所以从系统来讲每个业务员都有访问销售订单的功能,然后再需要配置每个业务员负责的城市,以此对订单数

  • 浅谈SpringCloud实现简单的微服务架构

    Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署.Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. 接下

随机推荐