Arquitectura de microservicio springCloud Finchley desde el nivel básico hasta el dominio [Doce] Integre Redis para lograr el intercambio de sesiones y los problemas de falla de sesión causados por el reenvío de zuul

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

Escribe aquí la descripción de la imagen.

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.

Escribe aquí la descripción de la imagen.
2. La información de la sesión se obtiene de redis y es la misma sesión.
Escribe aquí la descripción de la imagen.

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)

Escribe aquí la descripción de la imagen.

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

Escribe aquí la descripción de la imagen.

Supongo que te gusta

Origin blog.csdn.net/wcblog/article/details/80737966
Recomendado
Clasificación