【问题标题】:How to load spring application.yml from S3如何从 S3 加载 spring application.yml
【发布时间】:2020-10-17 11:39:58
【问题描述】:

我在 S3 存储桶中有一堆 spring application.yml 属性文件,用于不同的环境。我想从 S3 存储桶加载属性文件以保证无状态配置。

// Config Object
@Configuration
@ConfigurationProperties(prefix = "yaml")
public class YamlFooProperties {
    private String name;
    private List<String> aliases;
    // standard getter and setters
}

// foo.yml file located in S3 bucket
yaml:
  name: foo
  aliases:
    - abc
    - xyz

如何让我的 spring-boot 应用程序加载这些属性并在应用程序启动时使其可用?

我正在使用 spring-boot 版本 2.2.6.RELEASE 和 Java 11。

【问题讨论】:

标签: java spring-boot amazon-s3 spring-boot-test


【解决方案1】:

方法一:编写一些非常简单的启动脚本,先从S3获取(比如curl)到本地文件(比如s3-config.yaml),然后正常启动你的应用。

方法2:如果你使用Kubernetes(这是部署系统的好主意),你可以使用ConfigMapHelm等其他方式来部署你的应用程序,以满足你“保证无状态配置”的需求”。

方法3:如果你只想要Java(没有脚本,没有k8s等),那么你可以写一些从S3获取文件的简单Java代码,然后用这些数据调用你的SpringBootApplication的start。

【讨论】:

  • 我们需要一个在 java 中的解决方案,应用程序执行此操作,即加载属性文件
  • 第 3 步将是方式,但我不知道如何去做。必须是从 s3 加载外部资源并在启动时填充配置对象的简单方法
  • @breaktop S3 应该为您提供 Java API(例如 maven 包)。然后在该 API 中应该有一种方法,例如S3.downloadFile("my_url"),它将您的 s3 数据加载到内存或本地文件中。因此,您只需编写几行代码即可获取该 yaml 文件。
  • 下载文件后,你将如何设置配置对象。我的意思是如何将 yml 文件中的对象值连接在一起。我用谷歌搜索但无法做到这一点
  • @breaktop 你可以把它放在本地磁盘上,比如my-downloaded-file.yaml,然后把它传给Spring。关于如何传递,最天真的方式(可能存在更好的方式)就是设置环境变量。
【解决方案2】:

您不必将配置存储在 s3 中。 Spring Cloud 提供的默认选项是 git 支持的存储,这对我来说似乎更有利。但是,也有 S3 支持。

https://cloud.spring.io/spring-cloud-config/reference/html/#_aws_s3_backend

这样,您的配置服务器就有一个 EnvironmentRepository 配置为使用 S3 存储桶作为底层存储。

【讨论】:

  • 我可以看看使用这种方法的工作示例
  • 为此需要一个 Spring Cloud Config 服务器实例是否正确?
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 2019-11-23
  • 2020-07-20
  • 2022-01-13
  • 2019-07-17
  • 2018-12-21
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多