如何在Spring Cloud Data Flow中外部化应用程序属性

时间:2018-03-30 03:29:54

标签: java spring-batch spring-cloud spring-cloud-config spring-cloud-dataflow

我目前有一个常规的SpringBoot应用程序,我可以分成2个应用程序,以便从Spring Cloud Dataflow和Spring Batch中获得一些好处:

  1. 一个SpringBoot应用程序,负责检测特定事件并通过Spring Cloud Dataflow启动新的Batch任务REST API
  2. SpringBoot + Spring Batch任务将在我们的Nexus上从它的jar中注册到SCDF并调用新事件。
  3. 我已经让两个应用程序正常运行,而且我已经开始动起来了。现在我担心的是,这个批处理应用程序有一个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仍然可以作为一种可能的解决方案来解决吗?

    提前感谢您的帮助!

    致以最诚挚的问候,

    恩里科

2 个答案:

答案 0 :(得分:0)

Spring Cloud Config Server绝对是一个不错的选择,特别考虑到您提到的数据源包含密码以及您应该保护的其他密钥/秘密。 使用配置服务器,您不仅可以外部化配置,还可以安全地存储它们,因为它允许您使用对称和非对称算法加密属性,请参见此处:

spring cloud config encryption and decryption

另一方面,拥有这些属性application.yml意味着这些密码/密钥/秘密将最终出现在您的控制版本系统中(希望无法从您组织的网络外部访问)。

另一个选择是将配置保留在配置文件中,并仅将敏感信息外部化。在我的组织中,我们使用HashiCorp Vault与Spring Cloud Config结合使用。

Vault

如果您的组织中没有部署现有的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

您需要提及命名空间值。如果您要根据环境隔离属性,请提及您正在使用的命名空间。您还可以指定配置映射名称。

在此处阅读更多相关信息。 https://docs.spring.io/spring-cloud-kubernetes/docs/current/reference/html/index.html#kubernetes-propertysource-implementations