spring-boot - 无法根据活动的 Spring 配置文件生成不同的 spring-cloud-gateway 路由
问题描述
我正在尝试使用 Spring 配置文件在 Spring Cloud Gateway 中定义不同的路由。我读过的所有关于 Spring 如何使用 yaml sems 管理配置文件以表明它应该工作的内容,但对于我的生活来说,它只是......似乎没有。(我的其他 Spring 应用程序使用属性,所以我不习惯 yaml 配置——我可能遗漏了一些东西。)
实际上,我要做的是拥有一个“prod”配置文件,其中包含我的生产服务器的 URI,以及一个包含 localhost 等效项的“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
参数评估为 true时覆盖以前的值
鉴于这种理解,我希望 Spring 首先解析“默认”属性,了解默认激活的配置文件应该是 prod。然后它将解析产品属性。由于“prod”是一个活动配置文件(唯一的活动配置文件,是默认配置),它应该解析和应用 prod 路由。然后它会解析 dev 路由,但会识别 dev 不是活动配置文件,并且不会覆盖这些值。这是我阅读有关如何根据环境更改配置的文档的理解。
然而,当我加载它时,我点击了执行器端点——/actuator/gateway/routes
我回到[]
了我希望看到 prod 路线的地方。我确实在我的日志中看到 prod 配置文件已激活,但似乎顶部的“默认”部分中没有属性会导致当解析器从配置文件部分读取它们时不会应用它们。
我尝试的另一件事是将“dev”属性作为默认值,然后尝试使用“prod”配置文件属性覆盖 URI。那里发生了类似的问题——我点击了执行器端点并返回了路由,但它们只是默认的开发者。
如何利用 Spring 配置文件在 application.yml 中配置不同的 Spring Cloud Config 路由?
版本:
- spring-cloud-gateway 2.0.1.BUILD-SNAPSHOT (获得此错误的解决方法,可能不相关)
- spring-cloud-starter-gateway
- spring-boot 2.0.3.RELEASE
- spring-boot-starter-webflux
- 弹簧引导启动器执行器
(由于政治原因,我不能使用 Spring Cloud Config。我公司的首席架构师患有严重的 Not Invented Here Syndrome。)
解决方案
您不能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
推荐阅读
- pandas - 更改 seaborn 直方图(或 plt)中数据选择的条形颜色
- angular - 如何在常规 Angular 组件和 Angular Element 之间共享代码?
- php - 在 laravel 上上传多个文件
- python - 堆时间复杂度python
- c# - 如何在对象列表(C#)中获取函数的最大值?-初学者-
- python - Matplotlib:如何在不改变线条长度的情况下改变线条的宽度
- linux - Cpanel 没有让我选择更改我的一个域的根目录
- tomcat - HttpMediaTypeNotSupportedException:不支持内容类型“video/mp4”。通过 Postman 上传视频时 Spring webflux
- vue.js - 为什么我的表单没有发送到后端图片
- perl - 三元产生与 If 不同的结果