spring - 基于属性(来自配置服务器)是否覆盖/替换了基于 java 的路由配置?
问题描述
我使用服务器在 yml 配置中定义了一些路由,这些路由存储在 Consul Key/Value 中。当我尝试使用 Fluent API(基于 Java 的配置)定义路由时,网关无法正常工作并且不会处理此路由。
基于服务器的配置示例:
cloud:
gateway:
discovery:
locator:
enabled: false
routes:
- id: foo
predicates:
- Path=/foo/**
uri: lb:https://bar
并以 Fluent 风格定义路线:
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/testing_route")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri("http://httpbin.org:80"))
.build();
}
结果网关对 /testing_route 路径的所有请求返回 404 状态代码,这意味着该路由不起作用。
如果遇到问题,我想使用基于 DSL 配置的ModifyRequestBodyFilter修改请求正文,这意味着 - 我需要使用两种方式来配置上下文。实际上,这段代码什么都不做。
我们可以将 RouteLocatorBuilder 与 yml 中基于属性的配置结合起来吗?
Spring Boot 2.2.5 发布 Spring Cloud Hoxton.SR3
解决方案
在问题线程中回答 https://github.com/spring-cloud/spring-cloud-gateway/issues/1953#issuecomment-705081934
TL;DR 需要启用 CachingRouteLocator
@Bean
@Primary
@ConditionalOnMissingBean(name = "cachedCompositeRouteLocator")
// TODO: property to disable composite?
public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) {
return new CachingRouteLocator(new CompositeRouteLocator(Flux.fromIterable(routeLocators)));
}
推荐阅读
- node.js - Phaser3 helloworld 的打字稿编译耗时太长
- javascript - 如何在函数的 if 条件中使用样式可见性?
- c# - 通过 Microsoft Graph 从 Azure AD 获取安全组的成员
- java - 如何在 IntelliJ 2021.2.2 中使用 Lombok 插件?
- mysql - 将带有 SUM 和许多 WHERE 的子查询转换为 Join 结构以提高性能
- javascript - 在嵌套状态数组上设置状态 - > 未捕获的错误(承诺中) TypeError:无法读取未定义的属性
- python - 如何将 KerasTensor 转换为张量(Tensorflow)?
- python - 循环函数的输出不正确(For 和 While)
- homebrew - 如何自动将密码添加到“brew bundle install”?
- git - git config core.filemode false 的后果是什么?