嵌入式Spring Cloud Config:如何获取纯文本文件?
问题描述
我配置了一个简单的Spring Boot应用,引入如下Gradle依赖:
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
目的是将Spring Cloud Config Server嵌入到该应用中。
bootstrap.yml文件内容如下:
spring: cloud: config: server: bootstrap: true git: username: git password: <personal-access-token> uri: <github-uri>
远程GitHub仓库中包含如下application.yml文件:
server: port: 8280
启动Spring Boot应用后,日志显示已正确拉取远程配置:
Tomcat initialized with port(s): 8280 (http) ... Tomcat started on port(s): 8280 (http) with context path ''
我的问题是:若在远程GitHub仓库中与application.yml同级目录下放置一个dummy.txt文件,如何通过代码从应用本身获取该文件的内容?
我知道在Config Client与Config Server分离的架构下,可通过官方文档中的方法从Config Server获取纯文本文件,但在Config Server嵌入应用的场景下该如何实现?
解决方案
方法1:直接调用Config Server内部的Git仓库操作API
因为你用的是Git作为配置后端,嵌入的Config Server已经实例化了GitEnvironmentRepository来处理仓库交互,直接注入这个类就能读取指定文件:
import org.springframework.cloud.config.server.environment.GitEnvironmentRepository; import org.springframework.core.io.Resource; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.stream.Collectors; @Component public class ConfigFileReader { private final GitEnvironmentRepository gitEnvRepo; public ConfigFileReader(GitEnvironmentRepository gitEnvRepo) { this.gitEnvRepo = gitEnvRepo; } public String getDummyTxtContent() throws IOException { // 参数依次为:文件路径、profile、分支label、状态标识,不需要的传null即可 Resource fileResource = gitEnvRepo.findOne("dummy.txt", null, null, null).getResource(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(fileResource.getInputStream()))) { return reader.lines().collect(Collectors.joining("\n")); } } }
方法2:通过自身的Config Server HTTP端点获取
嵌入模式下应用同时具备Config Server的服务能力,你可以用RestTemplate发起本地请求到自身的配置端点:
import org.springframework.core.env.Environment; import org.springframework.web.client.RestTemplate; import org.springframework.stereotype.Component; @Component public class ConfigFileRestReader { private final RestTemplate restTemplate; private final Environment environment; public ConfigFileRestReader(RestTemplate restTemplate, Environment environment) { this.restTemplate = restTemplate; this.environment = environment; } public String getDummyTxtContent() { // 动态获取当前应用端口,避免硬编码 int port = environment.getProperty("server.port", Integer.class, 8080); // 端点格式:http://localhost:{port}/{分支名}/{文件名} String url = String.format("http://localhost:%d/main/dummy.txt", port); return restTemplate.getForObject(url, String.class); } }
注意:如果你的Git仓库默认分支不是main,需要替换成实际分支名。
方法3:读取本地克隆的仓库文件
Config Server启动时会把Git仓库克隆到本地临时目录,你可以直接读取这个本地文件:
import org.springframework.cloud.config.server.environment.GitEnvironmentRepository; import org.springframework.stereotype.Component; import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; @Component public class LocalConfigFileReader { private final GitEnvironmentRepository gitEnvRepo; public LocalConfigFileReader(GitEnvironmentRepository gitEnvRepo) { this.gitEnvRepo = gitEnvRepo; } public String getDummyTxtContent() throws IOException { // 获取本地克隆仓库的根路径 String localRepoPath = gitEnvRepo.getBasedir().getAbsolutePath(); String filePath = Paths.get(localRepoPath, "dummy.txt").toString(); return Files.readString(Paths.get(filePath)); } }
内容的提问来源于stack exchange,提问作者Aldo
相关产品推荐
相关产品推荐

