我正在尝试使用 Spring 配置文件在 Spring Cloud Gateway 中定义不同的路由。我读过的所有关于 Spring 如何使用 yaml sems 管理配置文件以指示它应该工作的所有内容,但对于我的生活来说,它只是......似乎没有。 (我的其他 Spring 应用程序使用属性,所以我不习惯 yaml 配置——我可能遗漏了一些东西。)
实际上,我正在尝试做的是拥有一个包含我的生产服务器 URI 的“prod”配置文件,以及一个包含本地主机等效项的“dev”配置文件。
我有两个配置文件,dev 和 prod。我的 application.yml
文件如下所示
spring:
profiles:
default: prod
management:
endpoint:
health:
enabled: true
endpoints:
web:
exposure:
include: hystrix.stream, gateway
---
spring
profiles: prod
cloud:
gateway:
routes:
- id: test_route
uri: http://foo.mycompany.com
predicates:
- Path=/status
- Method=GET
---
spring
profiles: dev
cloud:
gateway:
routes:
- id: test_route
uri: http://localhost:8080
predicates:
- Path=/status
- Method=GET
我的理解是这样的:
spring.profiles.default
属性告诉 Spring,如果没有指定配置文件,则使用 prod 配置文件- Spring 会将
---
视为“文件分隔符”,如果spring.profiles
参数评估为真,则重新评估每组属性并覆盖以前的值
鉴于这种理解,我希望 Spring 首先解析“默认”属性,了解默认激活的配置文件应该是 prod。然后它将解析产品属性。由于“prod”是一个事件的配置文件(唯一的事件配置文件,是默认的),它应该解析并应用 prod 路由。然后它会解析 dev 路由,但会识别出 dev 不是事件配置文件,并且不会覆盖这些值。这是我阅读 documentation on how to change config based on the environment 的理解.
但是,当我加载它时,我点击了执行器端点 -- /actuator/gateway/routes
-- 我回到了我期望的位置 []
查看产品路线。我确实在我的日志中看到产品配置文件已激活,但似乎没有顶部“默认”部分中的属性导致当解析器从配置文件部分读取它们时它们不会被应用。
我尝试的另一件事是将“dev”属性设置为默认值,然后尝试使用“prod”配置文件属性覆盖 URI。那里发生了一个类似的问题——我点击了执行器端点并返回了路由,但它们只是默认的开发路由。
我如何利用 Spring 配置文件在我的 application.yml 中配置不同的 Spring Cloud Config 路由?
版本:
- spring-cloud-gateway 2.0.1.BUILD-SNAPSHOT(获得 this bug 的解决方法,可能不相关)
- spring-cloud-starter-gateway
- spring-boot 2.0.3.RELEASE
- spring-boot-starter-webflux
- spring-boot-starter-actuator
(出于政治原因,我无法使用 Spring Cloud Config。我公司的首席架构师患有严重的非发明人综合症。)
最佳答案
您不能在属性文件中使用 spring.profiles.default
。设置这样的值为时已晚。
所以你可以使用程序参数(或系统属性)来设置它。例如。
java -jar --spring.profiles.default=dev your-app.jar
或者您可以通过硬编码默认配置文件在代码中完成此操作:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(DemoApplication.class);
ConfigurableEnvironment environment = new StandardEnvironment();
environment.setDefaultProfiles("dev");
application.setEnvironment(environment);
application.run(args);
}
}
阅读所有评论可以在这里找到一些相关信息: https://github.com/spring-projects/spring-boot/issues/1219
关于spring-boot - 无法根据事件的 Spring 配置文件生成不同的 spring-cloud-gateway 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51370363/