Spring Cloud Gateway 与 Redis 会话管理的工作示例?

bkk*_*bkk 8 redis spring-boot spring-cloud-gateway

您能否指出spring-cloud-starter-gateway工作示例的任何书面或视频教程?使用spring-session-data-redisSpring Boot 2和可能相关的库,例如 spring security?

基本上,我想在微服务环境中使用 Spring Clouting Gateway 服务器。我也想使用 Spring Boot 2.X。整个系统基于反应式原理。

我找到了很多如何使用 Redis 速率限制器设置spring-cloud-starter-gateway服务器的示例。我有一个网关服务器的工作版本,但它没有使用基于 Redis 的会话管理。当我将 Redis for session 放入图片中时,我会遇到各种异常。因此,非常感谢任何工作示例。

小智 0

正如您提到的,Spring Gateway 的关键是反应性。因此,根据建议,应该被动地实施交叉关注(过滤器)。这是一个我见过的人们通常实现的其他示例(安全性、弹性和路由器)这个例子利用了自动配置的优势,意味着如果过滤器需要redis,它会搜索是否已经有一个Bean来管理redis连接,例如ReactiveRedisConnectionFactory(LettuceConnectionFactory - 非阻塞,满足反应性)。

如果是会话管理的话,只需要:

@Configuration
@EnableRedisWebSession
Run Code Online (Sandbox Code Playgroud)

在安全性的情况下,只需要(其中ServerHttpSecurity是webflux的构建器,可以根据您的要求构建:oauth2.0等):

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {...}
Run Code Online (Sandbox Code Playgroud)

对于速率限制器,只需要:

@Bean
public RedisRateLimiter redisRateLimiter() {
    return new RedisRateLimiter(5, 7); // replenishRate, burstCapacity
}

@Bean
public RouteLocator appRouteLocator(RouteLocatorBuilder builder, RedisRateLimiter redisRateLimiter) {
  ... .requestRateLimiter(rl -> rl.setRateLimiter(redisRateLimiter)) // see example
}
Run Code Online (Sandbox Code Playgroud)

最后,Spring security和gateway都处理过滤器(责任链),也可以通过配置文件(properties/yaml)进行配置。下面是过滤器及其与 Redis 关系的非常抽象的图表。

在此输入图像描述

对于这个例子,我在 docker 中使用了 redis。这是对网关路由的调用的跟踪。

1653227794.371458 [0 lua] "TIME"
1653227794.371488 [0 lua] "get" "request_rate_limiter.{user}.tokens"
1653227794.371550 [0 lua] "get" "request_rate_limiter.{user}.timestamp"
1653227794.371610 [0 lua] "setex" "request_rate_limiter.{user}.tokens" "2" "6"
1653227794.371653 [0 lua] "setex" "request_rate_limiter.{user}.timestamp" "2" "1653227794"
1653227802.789329 [0 172.17.0.1:37156] "EXISTS" "spring:session:sessions:64050a1e-eaf5-4b4f-9a82-12a008389dd9"
1653227802.792697 [0 172.17.0.1:37156] "HSET" "spring:session:sessions:64050a1e-eaf5-4b4f-9a82-12a008389dd9" "lastAccessedTime" "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01\x80\xec\x0e/\xbc"
1653227802.794683 [0 172.17.0.1:37156] "EXPIRE" "spring:session:sessions:64050a1e-eaf5-4b4f-9a82-12a008389dd9" "1800"
Run Code Online (Sandbox Code Playgroud)