当前位置: 首页 > 知识库问答 >
问题:

具有 Redis 会话管理的Spring云网关的工作示例?

朱自明
2023-03-14

您能指出任何关于spring cloud starter网关工作示例的书面或视频教程吗?使用spring会话数据redis、spring Boot 2和可能相关的库,例如Spring Security?

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

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

共有1个答案

赵智
2023-03-14

Spring Gateway的关键是你提到的反应能力。因此,根据建议,交叉关注(过滤器)应该被动地实现。这里有一个我见过的人们通常实现的其他东西的例子(安全性、弹性和路由器)。这个例子利用了自动配置的优势,这意味着在过滤器需要redis的情况下,它将搜索是否已经有一个Bean来管理redis连接,例如reactivedisconnectionfactory(LettuceConnectionFactory-non blocking,meets with reactivity)。

在会话管理的情况下,只需要:

@Configuration
@EnableRedisWebSession

在安全方面,只需要(其中ServerHttpSecurity是webflux的构建器,可以根据您的要求进行构建:oauth2.0等):

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {...}

对于限速器,只需:

@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
}

最后,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"
 类似资料:
  • 我不能玩春云之门的限速器。我在这里配置网关: 我使用JMeter调用API循环1000次,但网关没有响应429响应中的请求太多。我哪里错了?

  • 成功登录后,我想用新的url继续进行进一步的请求处理。但url正在调用springmvc中的公开服务,其中的安全配置不会检查会话身份验证以获取传入url。请看下面的代码。 当jsp页面提交登录验证时,J_security_check调用目标url,该URL随后调用拦截器模式/home*并验证登录凭证。 如果我在登录之前调用公开的服务“/address/userid/”,它将直接调用服务方法,使其成

  • 我是Spring保安的新手。我有一个要求做一个基于URL的身份验证,其中用户需要被认证基于唯一的引用,将发送每次作为一个参数在URL。我将把这个引用传递给webservice,获取所需的数据,然后对用户进行身份验证(并设置角色)。身份验证和授权部分工作正常。 但是,当我再次尝试访问应用程序时(现在在URL中使用了不同的引用),它表示“SecurityContextholder没有用匿名令牌填充,因

  • 我正在开发一个使用Spring框架和Hibernate作为ORM的Web应用程序。我想创建一个注册和登录页面。登录时,应为特定用户创建会话(例如发送cookie等)。由于我是Spring的新手,我不知道如何完成这项工作。有人可以给我一个很好的教程吗?谢谢!