我们为 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
来更新配置,但都不起作用。有人可以帮助如何动态更新这些值吗?
您可以在运行时访问属性,更改它们并发布
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));
}
如果您确实想在
yaml
中执行此操作,则会更困难,因为属性/yaml 文件的读取在启动时完成一次。您可以创建一个调度程序来重新加载属性,如here所示,但您仍然需要找出使GatewayProperties
重新读取/重新绑定值的方法,并且最终仍然必须触发RefreshRoutesEvent
。
RouteLocator
另一种解决方案可能是提供您自己的解决方案
RouteLocator
并使其每次都重新读取属性