En los proyectos de microservicios de SpringCloud, usar Redis para compartir sesiones es una práctica de código relativamente común, simple y eficiente, y directa:
### 1. Agregue dependencias relevantes en pom.xml###
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
###2, ubicación de Redis agregada###
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. Agregue la clase de configuración de Redis para habilitar la sesión predeterminada de Spring del código Redis ###
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. Agregar método de prueba a 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. Modificar la configuración de la puerta de enlace ###
En el proyecto Springcloud, el problema de falla de sesión ocurre después de que la puerta de enlace zuul reenvía la solicitud. Esto se debe a que zuul descartará la sesión original y generará una nueva sesión de forma predeterminada. La solución es el archivo de configuración de la puerta de enlace.
Agregue encabezados sensibles: "*" a service-zuul-dev.yml
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. Prueba###
Inicie EUREKA, SERVICE-CONFIG, SERVICE-USER-SESSION-REDIS, SERVICE-ZUUL en secuencia
Acceda a la dirección de la puerta de enlace http://localhost:1100/user-session/getUser varias veces
1. Descubrí que ya existe información de sesión en redis.
2. La información de la sesión se obtiene de redis y es la misma sesión.
Resumen: La parte propensa a errores cuando Spring Cloud integra Redis para realizar el intercambio de sesiones es que el reenvío a través de la puerta de enlace invalidará la sesión original. La mayoría de la gente pensará que la integración no fue exitosa. No es difícil encontrar el problema mirando detenidamente el código fuente de Zuul o accediendo directamente al microservicio para probar la ubicación.
Arquitecto grupo Q: 618578034
grupo comunitario de Spring Cloud (debe agregar WeChat para participar)
Cuenta pública de WeChat: formación de arquitectos Java
Esta cuenta pública se utilizará durante un año. Publicará un artículo de arquitectura completo de acuerdo con la ruta de capacitación práctica de arquitecto de software senior de JAVA. El nivel de dificultad es de fácil a profundo. Es adecuado para aquellos que tienen una determinada base de desarrollo y desean para cambiar a arquitectura y aquellos que están haciendo desarrollo de arquitectura junior, bienvenidos a seguir