Spring 云网关 - 过滤器参数未通过刷新或网关刷新端点更新

问题描述 投票:0回答:1

我们为 Spring Cloud Gateway 使用自定义网关过滤器。配置如下所示: 过滤等级:

@Component
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {

    public static class Config {
        private String type;
        private LinkedMultiValueMap<String, String> values;
        //Getters & Setters
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            //some filter function
        };
    }
}
spring:
  cloud:
    gateway:
      routes:
        - id: my-service
          uri: https://myservice.host.com
          predicates:
            - Path=/api/{version}/api-name
          filters:
            - name: CustomFilter
              args:
                type: type1
                values:
                  key1: value1

我们想在值下添加额外的键值对,例如:

                values:
                  key1: value1
                  key2: value2

我想添加额外的键值对并动态更新配置。我尝试了

/actuator/refresh
/actuator/gateway/refresh
来更新配置,但都不起作用。有人可以帮助如何动态更新这些值吗?

spring spring-boot spring-cloud spring-boot-actuator spring-cloud-gateway
1个回答
0
投票

选项 1:以编程方式更改属性

您可以在运行时访问属性,更改它们并发布

RefreshRoutesEvent
以使网关重新加载
CachingRouteLocator

中设置的属性
@Autowired GatewayProperties gatewayProperties;
@Autowired ApplicationEventPublisher eventPublisher;

public void someMethod() {
    List<FilterDefinition> filters = this.gatewayProperties.getRoutes().get(0).getFilters();
    // update filters however
    
    // this will make RouteLocator reload properties
    this.eventPublisher.publishEvent(new RefreshRoutesEvent(this));
}

选项 2:重新加载属性文件并重新创建 beans

如果您确实想在

yaml
中执行此操作,则会更困难,因为属性/yaml 文件的读取在启动时完成一次。您可以创建一个调度程序来重新加载属性,如here所示,但您仍然需要找出使
GatewayProperties
重新读取/重新绑定值的方法,并且最终仍然必须触发
RefreshRoutesEvent


选项 3:实施您自己的
RouteLocator

另一种解决方案可能是提供您自己的解决方案

RouteLocator
并使其每次都重新读取属性

© www.soinside.com 2019 - 2024. All rights reserved.