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

使用RewritePath刷新Spring云网关失败

蓟安歌
2023-03-14

我正在运行一个依赖于spring云配置服务器的spring云网关实例。我的应用程序以给定的以下配置启动。

  cloud:
    gateway:
      routes:
        - id: route-foo
          uri: lb://foo
          predicates:
            - Path=/api/foo/**
          filters:
            - name: RewritePath
              args:
                regexp: "/api/foo/(?<remaining>.*)"
                replacement: "/${remaining}"  

假设我对配置进行了修改,并在下面添加了一条额外的路由

        - id: route-bar
          uri: lb://bar
          predicates:
            - Path=/api/bar/**
          filters:
            - name: RewritePath
              args:
                regexp: "/api/bar/(?<remaining>.*)"
                replacement: "/${remaining}"  

执行POST到http://localhost:8080/actuator/refresh会返回以下错误。

500 Server Error for HTTP POST &#34;/actuator/refresh&#34; (Encoded)
java.lang.IllegalArgumentException: Could not resolve placeholder 'remaining' in value "/${remaining}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178)

似乎Spring正在尝试解析我的重写路径替换并将其替换为环境变量。我的选择是什么?

共有1个答案

百里海超
2023-03-14

您正在运行spring,试图替换配置中的变量

有两种解决方案

更改替换:“/${remaining}”

替换:“/$\{剩余}”

RewriteGatewayFilterFactory在运行过滤器之前对配置进行替换。

@Bean
@Primary
public StandardReactiveWebEnvironment standardReactiveWebEnvironmentCustomizer(StandardReactiveWebEnvironment environment) {
    environment.setIgnoreUnresolvableNestedPlaceholders(true);
    return environment;
}

这将使所有无法解析的占位符单独存在于您的配置中,并且在刷新期间不会失败。我建议不要采用这种方法,因为如果您依赖要正确填充的字段,它可能最终会将一些问题延迟到运行时。

从理论上讲,你应该能够完成这个相同的功能与属性源Placeholder配置,我有一个困难的时间让它合作。

 类似资料:
  • 使用spring-Cloud网关2.0.0. M5,我在配置文件(application.yml)中定义路由。我试图通过调用POST来更新这些路由 /application/gateway/refresh. 修改后的路由或新路由不会被刷新,即使我看到(带有断点)实际上执行了刷新例程。 当在配置文件中定义路由时,刷新应该工作吗?我错过了什么? 用例是在spring配置服务器中定义的路由。

  • 当我使用spring cloud gateway集成spring cloud sleuth时,我发现性能比单独使用spring cloud gateway慢得多。是否有优化方案? 机器配置:6芯,16g Spring云网关:5331.9 tps Spring云网关Spring云侦探:4119.47 tps “Spring云网关”比“Spring云网关Spring云侦探”慢约1000-2000tps

  • 我有一个带有一些endpoint的anexo API,比如: 如何将Spring Cloud Gateway与这些endpoint一起使用?

  • 我正在研究一个示例poc,我正在尝试集成Spring云api网关 在我的pom.xml中,我有 在我的应用程序中。yml我有 在我的主课上 我能够直接从它们各自的端口访问服务,但是当我试图从端口网关端口ie 9191访问api时,我得到 ***2022-09-08 16:23:34.644错误4128-[ctor-http-nio-3]a . w . r . e . abstracterrorwe

  • 我为所有传入请求创建了全局路由,并使用AbstracTerrorWebExceptionHandler。 我的application.yml 运行应用程序时的日志: 谢谢你的帮助。

  • 我使用的是堆栈下 SpringCloudGatewayHoxton发行版,Java1.8,Linux操作系统 我看到下面的异常在重启后消失,但在一段时间后再次出现。我没有为直接内存做任何显式设置。下面是使用的JVM参数- 有人能告诉我错误的原因吗?