Spring 使用 RewritePath 刷新云网关失败

Spring cloud gateway refresh with RewritePath fails

我是 运行 一个依赖 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/refreshreturns下面的错误。

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 正在尝试解析我的 RewritePath 替换并将其替换为环境变量。我有哪些选择?

您 运行 正在 spring 尝试替换配置中的变量。

有两种解法

转义替换语法(首选)

改变replacement: "/${remaining}"

replacement: "/$\{remaining}"

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



启用 ignoreUnresolvableNestedPlaceholders

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

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

理论上,您应该能够使用 PropertySourcesPlaceholderConfigurer 完成相同的功能,我很难让它配合。