美文网首页微服务
微服务实践-配置

微服务实践-配置

作者: 朱万宇 | 来源:发表于2018-04-04 21:15 被阅读0次

    前言

    今天, 讲述以下在微服务实践中遇到的一个问题 ---- 配置
    来看一下下面的结构:


    结构图

    一个项目被分为n个服务, 这些服务可能独立, 也可能需要调用项目中的其他服务, 在实践中, 大部分情况是这些被拆分的服务还是访问同一个数据库。
    既然访问数据库, java中必然要建立与数据库的连接, 也就需要url、用户名、密码等配置。

    问题

    起初, 服务只有2、3个, 所以连接池信息在每一个应用的resources下的application-{env}.application中配置。 随着服务越来越多, 每个服务都需要配置数据库信息, 而且一个服务都有生产、开发、测试环境, 使得配置对于同一个数据源的配置相当难以管理。

    思路及尝试

    针对以上问题, 自然需要去想一些办法来解决上述问题

    思路:能否将这些服务的配置放在同一个地方, 其他服务会从这个地方取。
    失败:创建一个模块, 将配置文件放在该模块下的claspath下, 其他所有服务依赖于这个模块。 发现服务启动报错, 找不到

    分析:
    在应用打包后, 在其他模块的配置文件并不会在classpath下, 我们可以解压缩jar包看到并没有其他模块的配置文件


    classpath下的结构

    而springboot应用启动后, 在bean生成的过程中自然就报错了。

    那么如何能在启动的时候使得环境中(Environment)中有对应的资源?

    我的解决办法

    利用resources/META-INF/spring.factories

    
    public class  LoadPropertiesConfig implements EnvironmentPostProcessor, Ordered {
          
        protected static Logger logger = org.slf4j.LoggerFactory.getLogger("DruidLoadPropertiesConfig") ;
        @Override  
        public int getOrder() {  
            return ConfigFileApplicationListener.DEFAULT_ORDER + 1 ;
        }  
      
        @Override  
        public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
            try {
                YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
                PropertySource<?> load = loader.load("main",new ClassPathResource("datasource.yml") , null);
                environment.getPropertySources().addLast( load );
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    

    以上为处理environment的类. 加载该模块classpath下的datasource.yml,将资源加载到environment中的propertySources中。

    在该模块的resources/META-INF/spring.factories下添加

    org.springframework.boot.env.EnvironmentPostProcessor=com.xx.LoadPropertiesConfig
    

    最终基础模块的结构如下

      ┗ main 
        ┗ base package
           ┗ LoadPropertiesConfig
      ┗ resources
         ┗ META-INF
            ┗ spring.factories
         ┗ datasource.yml
    

    然后其他模块在pom文件中依赖于此模块。这样服务启动的时候, 顺利的将配置文件读取到environment中。

    参考资料:

    1. Spring Boot干货系列:(三)启动原理解析
    2. spring boot实战(第九篇)Application创建源码分析

    相关文章

      网友评论

        本文标题:微服务实践-配置

        本文链接:https://www.haomeiwen.com/subject/bhslhftx.html