我目前有一个常规的SpringBoot应用程序,我可以分成2个应用程序,以便从Spring Cloud Dataflow和Spring Batch中获得一些好处:
我已经让两个应用程序正常运行,而且我已经开始动起来了。现在我担心的是,这个批处理应用程序有一个application.yml
文件,其中包含数据源和其他重要属性,这些属性可以(不应该,但可以)经常更新。
在我目前的方法中,我的应用程序打包在Docker容器中,我启动我的应用程序说明权威application.yml
文件的位置。这允许我在每个环境中有一个特定的.yml
文件,因为我不允许在这里使用Spring Profiles来组织每个env的变量。开发者不应该知道Prod vars。
这是我的Dockerfile的入口点:
ENTRYPOINT ["java","-Dspring.profiles.active=docker","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar", "--spring.config.location=classpath:/application.yml,file:/tmp/config/application.yml"]
使用这种新的SCDF任务方法保持我的属性文件外部化的最佳方法是什么?我应该选择Spring Cloud Config吗?将--spring.config.location
作为工作参数传递实际上是否有效?
请记住上面提到的限制,Spring Cloud仍然可以作为一种可能的解决方案来解决吗?
提前感谢您的帮助!
致以最诚挚的问候,
恩里科
答案 0 :(得分:0)
Spring Cloud Config Server绝对是一个不错的选择,特别考虑到您提到的数据源包含密码以及您应该保护的其他密钥/秘密。 使用配置服务器,您不仅可以外部化配置,还可以安全地存储它们,因为它允许您使用对称和非对称算法加密属性,请参见此处:
spring cloud config encryption and decryption
另一方面,拥有这些属性application.yml
意味着这些密码/密钥/秘密将最终出现在您的控制版本系统中(希望无法从您组织的网络外部访问)。
另一个选择是将配置保留在配置文件中,并仅将敏感信息外部化。在我的组织中,我们使用HashiCorp Vault与Spring Cloud Config结合使用。
如果您的组织中没有部署现有的Vault,并且您发现为您或您的团队维护额外服务的工作量太高,那么Spring Cloud Config服务器应该足够好。
关于:I'm not allowed here to use Spring Profiles to organize variables per env. Devs shouldn't be able to know Prod vars
。
我认为这是在代码中包含属性的直接后果,通常有一些(如果不是大多数)配置在不同的应用程序之间共享,最终导致配置地狱,如果你必须旋转密码或密钥。
外部化将允许Devs访问非prod环境配置,Ops处理prod环境配置,所以每个人都很高兴。即使使用Vault Devs也可以知道" prod env Vault路径,但无法访问它。
答案 1 :(得分:0)
您可以将 kubernetes configmap 用于您的 Spring Cloud 任务和 Spring Batch。如果您在 Kubernetes 上部署 Spring Cloud 数据流。您可以将以下依赖项添加到您的云任务和春季批次中。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-config</artifactId>
</dependency>
现在您需要将以下引导 yaml 属性添加到您的应用程序中。
spring:
cloud:
kubernetes:
enabled: true
config:
enabled: true
namespace: <namespace>
name: <config map 1>
namespace: <kubernetes namespace>
sources:
- name: <config map 1>
- name: <config map 2>
reload:
enabled: true
strategy: refresh
您需要提及命名空间值。如果您要根据环境隔离属性,请提及您正在使用的命名空间。您还可以指定配置映射名称。