`

springcloud项目配置拓展从本地config目录加载

阅读更多
本文受阿里开源的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服务加载
分享到:
评论

相关推荐

    SpringCloud——分布式配置中心(Spring Cloud Config)

    在微服务架构中,Spring Cloud Config 是一个强大的分布式配置中心,它允许开发人员将应用程序的配置存储在远程仓库中,并且可以在运行时动态地管理和更新这些配置,无需重启应用。这个特性对于大型分布式系统来说...

    Spring Cloud Config(本地配置中心或git配置中心)

    - 如果选择本地配置中心,可以将配置文件放在项目资源目录下的`config`文件夹,例如`src/main/resources/config`。 - 如果选择Git配置中心,需要配置Git仓库URL、分支等信息,Config Server会从中拉取配置。 2. *...

    SpringCloud项目实战各组件源代码案例

    Spring Cloud Config + Spring Cloud Bus + kafka实现配置中心 SpringCloud微服务远程调用组件Feign的使用 springcloud-circuitbreaker.zip springcloud-config.zipspringcloud-config-oracle.zip springcloud-...

    Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程

    在本教程中,我们将深入探讨如何将Spring Boot应用程序与Spring Cloud Kubernetes相结合,以实现从Kubernetes的ConfigMap中动态读取并自动刷新配置。Spring Cloud Kubernetes是一个强大的工具,它允许我们在...

    spring-cloud项目_springcloud_springcloud项目_springcloud_spring-clou

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    spring cloud config

    Spring Cloud Config 是一个用于微服务架构中的外部配置中心,它允许开发者在运行时管理应用程序的配置。这个框架基于Git或Subversion等版本控制系统,提供了一种集中化、动态化的配置方式,使得微服务可以从中央...

    Spring Cloud配置中心获取不到最新配置信息的问题

    Spring Cloud Config 使用基于VCS的backend来存储配置信息,在默认情况下,配置信息会被checkout或clone到本地文件系统的临时目录中,例如在Linux系统中,可能是 `/tmp/config-repo-&lt;randomid&gt;`。但是,这些临时...

    SpringCloud项目源码下载.docx

    尽管文档标题和描述较为简单,但可以从这些信息中提炼出关于Spring Cloud项目的源码下载、Spring Cloud的基本概念、用途及其核心组件等方面的内容。 ### Spring Cloud 概念 Spring Cloud 是一个基于Spring Boot...

    基于spring cloud项目源码源码.rar

    《Spring Cloud项目源码深度解析》 在当前的微服务架构领域,Spring Cloud以其强大的功能和易用性,成为开发者构建分布式系统的重要选择。本文将深入探讨基于Spring Cloud的项目源码,帮助读者理解其核心原理,提升...

    spring-cloud项目

    通常,一个新的Spring Cloud项目会在Eclipse中初始化,包含基本的目录结构和必要的配置文件,但具体内容如服务、配置中心、API等需要开发者根据实际需求进行编写和实现。 【标签】"spring" Spring是Java领域最流行...

    springcloud config配置中心

    Spring Cloud Config 是一个用于微服务架构中的外部化配置服务器,它允许我们将应用程序的配置存储在远程仓库中,然后在运行时动态地为服务提供配置。这样可以方便地管理和更新多个环境(如开发、测试、生产)下的...

    Spring Cloud实战 _springcloud实战_springcloud_

    Spring Cloud Config是配置管理工具,它支持配置服务的集中化管理和动态刷新,使得开发者可以在不重启应用的情况下更新配置。另外,Spring Cloud Bus可以将配置变更实时推送到所有关联的服务,进一步提高了配置管理...

    SpringCloud之七 分布式配置中心SpringCloudConfig.pdf

    3. 配置文件中设置Git仓库,Spring Cloud Config将从指定的Git仓库中读取配置信息。 4. 启动ConfigServer,微服务实例可通过ConfigServer访问配置信息。 通过上述步骤,Spring Cloud Config就可以作为一个独立的...

    spring cloud config、bus源码

    Spring Cloud Config/Bus 源码解读 本文将对 Spring Cloud Config/Bus 的源码进行解读,涵盖 Server ...通过对源码的分析,可以更好地理解 Spring Cloud Config/Bus 的工作机制,并更好地使用这个框架来管理配置文件。

    SpringCloud Config Demo编写

    1.Spring Cloud Config 用于为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为服务端和客户端。 2.服务端为分布式配置中心,是一个独立的微服务应用;客户端为分布式系统中的基础设置或微服务...

    Spring cloud示例源码,注册中心Config示例代码

    Spring Cloud Config 是一个分布式配置中心,它允许开发者在微服务架构中集中管理和版本化应用配置。这个工具在Spring Cloud生态中扮演着重要角色,帮助开发者从应用内部解脱出配置信息,使得配置可以在运行时动态...

    基于Java的SpringCloud项目模板

    这个项目模板基于Java语言,集成了Spring Cloud的核心组件,包括Eureka(服务注册与发现)、Zuul(边缘服务/API网关)、Hystrix(容错管理工具)、Config(配置中心)和Spring Cloud Bus(事件、消息总线)。...

    Spring Cloud Config Demo

    - 配置服务器是Spring Cloud Config的核心,它作为一个中央存储库,可以是Git仓库、本地文件系统或Subversion。在本Demo中,你可能需要配置Config Server的启动类,例如启用`@EnableConfigServer`注解,并配置仓库...

    Springcloud Config支持本地配置文件的方法示例

    然而,在使用 Spring Cloud Config 时,开发者常常会遇到一个问题,即如何将本地配置文件加载到应用程序中。在这篇文章中,我们将详细介绍 Spring Cloud Config 支持本地配置文件的方法示例。 背景 在分布式系统中...

    《深入理解Spring Cloud与微服务构建》学习笔记(二十)~配置中心Spring Cloud Config

    在本篇学习笔记中,我们将深入探讨Spring Cloud Config——一个强大的配置管理工具,它使得在分布式系统中管理和分发配置变得简单。Spring Cloud Config支持服务器端和客户端两种组件,允许我们在开发过程中动态地...

Global site tag (gtag.js) - Google Analytics