本文受阿里开源的Nacos启发,应用启动后从Nacos服务加载配置到应用中,想着本地开发的时候加载配置能否从本地存储中加载,这样也能加快开发效率
首先
我们来看下SpringCloud项目应用Nacos服务的bootstrap.yaml配置如下
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
discovery:
server-addr: 127.0.0.1:8848
application:
name: demo
profiles:
active: db,redis,rabbit,es,zk
然后在Nacos控制台加配置
经过如上之后,这样应用就能从Nacos取配置。
问题点
笔者认为这里开发的时候如果能从文件系统中加载配置替代Nacos,能加快开发效率,也能心情舒畅的Coding业务代码了。
解决思路
分析
经过分析启动配置spring.factories和配置类NacosConfigProperties
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.alibaba.nacos.NacosConfigBootstrapConfiguration
找到NacosConfigBootstrapConfiguration 代码如下
@Configuration
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
public class NacosConfigBootstrapConfiguration {
@Bean
@ConditionalOnMissingBean
public NacosConfigProperties nacosConfigProperties() {
return new NacosConfigProperties();
}
@Bean
public NacosPropertySourceLocator nacosPropertySourceLocator(
NacosConfigProperties nacosConfigProperties) {
return new NacosPropertySourceLocator(nacosConfigProperties);
}
}
里面关键是NacosPropertySourceLocator实现的接口PropertySourceLocator
/**
* Strategy for locating (possibly remote) property sources for the Environment.
* Implementations should not fail unless they intend to prevent the application from
* starting.
*
* @author Dave Syer
*
*/
public interface PropertySourceLocator {
/**
* @param environment The current Environment.
* @return A PropertySource, or null if there is none.
* @throws IllegalStateException if there is a fail-fast condition.
*/
PropertySource<?> locate(Environment environment);
}
到了这里就明白怎么做了。
实现
定义自己的应用启动配置类MyLocalConfigBootstrapConfiguration
@Configuration
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", havingValue = "false")
public class MyLocalConfigBootstrapConfiguration {
@Bean
public MyLocalPropertySourceLocator fyLocalPropertySourceLocator() {
return new MyLocalPropertySourceLocator();
}
}
定义META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.liyghting.core.MyLocalConfigBootstrapConfiguration
定义自己的配置加载器MyLocalPropertySourceLocator
@Order(0)
public class MyLocalPropertySourceLocator implements PropertySourceLocator {
private static final Logger LOGGER = LoggerFactory
.getLogger(MyLocalPropertySourceLocator.class);
private static final String MYLOCAL_PROPERTY_SOURCE_NAME = "MYLOCAL";
@Override
public PropertySource<?> locate(Environment environment) {
CompositePropertySource composite = new CompositePropertySource(
MYLOCAL_PROPERTY_SOURCE_NAME);
String dataIdPrefix = environment.getProperty("spring.application.name");
String fileExtension = ".yaml";
PropertySourceLoader propertySourceLoader = new YamlPropertySourceLoader();
URL baseClassesUrl = this.getClass().getClassLoader().getResource("");
File baseClassesFile = new File(baseClassesUrl.getFile());
String basePath = baseClassesFile.getParentFile().getParentFile().getAbsolutePath();
Resource resource = new FileSystemResource(basePath + "/config/" + dataIdPrefix + fileExtension);
try {
composite.addFirstPropertySource(propertySourceLoader.load(dataIdPrefix + fileExtension, resource).get(0));
} catch (IOException e) {
LOGGER.warn("can not load property source {}, exception: {}", dataIdPrefix + fileExtension, e);
}
for (String activeProfile : environment.getActiveProfiles()) {
try {
resource = resource.createRelative(dataIdPrefix + "-" + activeProfile + fileExtension);
composite.addFirstPropertySource(propertySourceLoader.load(dataIdPrefix + "-" + activeProfile + fileExtension, resource).get(0));
} catch (IOException e) {
LOGGER.warn("can not load property source {}, exception: {}", dataIdPrefix + "-" + activeProfile + fileExtension, e);
}
}
return composite;
}
}
版本信息spring-boot 2.1.6.RELEASE
spring-cloud Greenwich.SR2
spring-cloud-alibaba 0.9.0.RELEASE
具体请看我分享的git库
https://gitee.com/liyghting/SpringCloudLocalCofigDemo
新的bootstarp.yaml配置如下
spring:
cloud:
nacos:
config:
enabled: false
server-addr: 127.0.0.1:8848
file-extension: yaml
discovery:
server-addr: 127.0.0.1:8848
application:
name: demo
profiles:
active: db,redis,rabbit,es,zk
这样应用启动配置能从本地文件系统加载或Nacos服务加载
分享到:
相关推荐
在微服务架构中,Spring Cloud Config 是一个强大的分布式配置中心,它允许开发人员将应用程序的配置存储在远程仓库中,并且可以在运行时动态地管理和更新这些配置,无需重启应用。这个特性对于大型分布式系统来说...
- 如果选择本地配置中心,可以将配置文件放在项目资源目录下的`config`文件夹,例如`src/main/resources/config`。 - 如果选择Git配置中心,需要配置Git仓库URL、分支等信息,Config Server会从中拉取配置。 2. *...
Spring Cloud Config + Spring Cloud Bus + kafka实现配置中心 SpringCloud微服务远程调用组件Feign的使用 springcloud-circuitbreaker.zip springcloud-config.zipspringcloud-config-oracle.zip springcloud-...
在本教程中,我们将深入探讨如何将Spring Boot应用程序与Spring Cloud Kubernetes相结合,以实现从Kubernetes的ConfigMap中动态读取并自动刷新配置。Spring Cloud Kubernetes是一个强大的工具,它允许我们在...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
Spring Cloud Config 是一个用于微服务架构中的外部配置中心,它允许开发者在运行时管理应用程序的配置。这个框架基于Git或Subversion等版本控制系统,提供了一种集中化、动态化的配置方式,使得微服务可以从中央...
Spring Cloud Config 使用基于VCS的backend来存储配置信息,在默认情况下,配置信息会被checkout或clone到本地文件系统的临时目录中,例如在Linux系统中,可能是 `/tmp/config-repo-<randomid>`。但是,这些临时...
尽管文档标题和描述较为简单,但可以从这些信息中提炼出关于Spring Cloud项目的源码下载、Spring Cloud的基本概念、用途及其核心组件等方面的内容。 ### Spring Cloud 概念 Spring Cloud 是一个基于Spring Boot...
《Spring Cloud项目源码深度解析》 在当前的微服务架构领域,Spring Cloud以其强大的功能和易用性,成为开发者构建分布式系统的重要选择。本文将深入探讨基于Spring Cloud的项目源码,帮助读者理解其核心原理,提升...
通常,一个新的Spring Cloud项目会在Eclipse中初始化,包含基本的目录结构和必要的配置文件,但具体内容如服务、配置中心、API等需要开发者根据实际需求进行编写和实现。 【标签】"spring" Spring是Java领域最流行...
Spring Cloud Config 是一个用于微服务架构中的外部化配置服务器,它允许我们将应用程序的配置存储在远程仓库中,然后在运行时动态地为服务提供配置。这样可以方便地管理和更新多个环境(如开发、测试、生产)下的...
Spring Cloud Config是配置管理工具,它支持配置服务的集中化管理和动态刷新,使得开发者可以在不重启应用的情况下更新配置。另外,Spring Cloud Bus可以将配置变更实时推送到所有关联的服务,进一步提高了配置管理...
3. 配置文件中设置Git仓库,Spring Cloud Config将从指定的Git仓库中读取配置信息。 4. 启动ConfigServer,微服务实例可通过ConfigServer访问配置信息。 通过上述步骤,Spring Cloud Config就可以作为一个独立的...
Spring Cloud Config/Bus 源码解读 本文将对 Spring Cloud Config/Bus 的源码进行解读,涵盖 Server ...通过对源码的分析,可以更好地理解 Spring Cloud Config/Bus 的工作机制,并更好地使用这个框架来管理配置文件。
1.Spring Cloud Config 用于为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为服务端和客户端。 2.服务端为分布式配置中心,是一个独立的微服务应用;客户端为分布式系统中的基础设置或微服务...
Spring Cloud Config 是一个分布式配置中心,它允许开发者在微服务架构中集中管理和版本化应用配置。这个工具在Spring Cloud生态中扮演着重要角色,帮助开发者从应用内部解脱出配置信息,使得配置可以在运行时动态...
这个项目模板基于Java语言,集成了Spring Cloud的核心组件,包括Eureka(服务注册与发现)、Zuul(边缘服务/API网关)、Hystrix(容错管理工具)、Config(配置中心)和Spring Cloud Bus(事件、消息总线)。...
- 配置服务器是Spring Cloud Config的核心,它作为一个中央存储库,可以是Git仓库、本地文件系统或Subversion。在本Demo中,你可能需要配置Config Server的启动类,例如启用`@EnableConfigServer`注解,并配置仓库...
然而,在使用 Spring Cloud Config 时,开发者常常会遇到一个问题,即如何将本地配置文件加载到应用程序中。在这篇文章中,我们将详细介绍 Spring Cloud Config 支持本地配置文件的方法示例。 背景 在分布式系统中...
在本篇学习笔记中,我们将深入探讨Spring Cloud Config——一个强大的配置管理工具,它使得在分布式系统中管理和分发配置变得简单。Spring Cloud Config支持服务器端和客户端两种组件,允许我们在开发过程中动态地...