我的架构之路 — 配置中心(二)— 在已有项目中实际应用

简介: 要把配置中心整合进现有的项目,要做的事情还不少 接管spring mvc属性文件 现在的java应用一般都是spring框架的,spring属性文件配置占了绝大多数比例,所以配置中心的,首要任务就是把spring配置文件集中到配置中心来管理。

要把配置中心整合进现有的项目,要做的事情还不少

接管spring mvc属性文件

现在的java应用一般都是spring框架的,spring属性文件配置占了绝大多数比例,所以配置中心的,首要任务就是把spring配置文件集中到配置中心来管理(其实spring cloud本身也有一套配置中心,它是通过git或svn进行配置的,在版本控制上比较方便,但在界面使用上就不太方便了)。

spring mvc属性文件是通过PropertyPlaceholderConfigurer来管理的,所以要接管spring mvc属性文件,就可以实现自定义的PropertyPlaceholderConfigurer,并实现从配置中心的读取配置。


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created by coolma on 2017/6/8.
 */
public class PropertyPlaceholderConfigurer extends
        org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
         
{
    private Map<String,List<BeanField>> configMap= new ConcurrentHashMap<String,List<BeanField>>();
    private Properties mergedProperties =null;
    private volatile boolean inited=false;
    public PropertyPlaceholderConfigurer(){
        # order越小,级别越高,用于有多个PropertyPlaceholderConfigurer的场景
        setOrder(-10000);
    }



    @Override
    protected Properties mergeProperties() throws IOException {
        this.setLocalOverride(true);
             #从配置中心读取配置
        this.setProperties(DefaultConfigClient.getProperties());
         
        mergedProperties = super.mergeProperties();
        return mergedProperties;
    }

 



}

接管spring boot的application.properties 属性文件

Spring Boot 所提供的配置优先级顺序比较复杂。按照优先级从高到低的顺序,具体的列表如下所示。

  1. 命令行参数。
  2. 通过 System.getProperties() 获取的 Java 系统参数。
  3. 操作系统环境变量。
  4. 从 java:comp/env 得到的 JNDI 属性。
  5. 通过 RandomValuePropertySource 生成的“random.*”属性。
  6. 应用 Jar 文件之外的属性文件。(通过spring.config.location参数)
  7. 应用 Jar 文件内部的属性文件。
  8. 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中 通过“@PropertySource”注解声明的属性文件。
  9. 通过“SpringApplication.setDefaultProperties”声明的默认属性。

所以要方便把配置中心的配置注入,比较好的是2和9,但2会设置太多的System属性感觉不太好,所以最终使用SpringApplication.setDefaultProperties方法把配置塞进去。但这种方式也有个弊端,它优先级是最低的,application.properties的配置如果不去掉的话,会把配置中心的配置覆盖的。

接管其他工具类配置信息的读取

有些配置信息是通过自定义的工具类从自定义的配置文件中读取的,这些工具类都需要进行改造,改为从配置中心读取。

Freemarker 模板直接引用了maven profile(mvn)的属性

maven profile的属性都是编译时打进去的,跟上面提到的动态加载的不一样,不幸的是,现有的项目代码中有些 Freemarker 模板图方便,用到了maven的profile属性,这种情况怎么办?其实还是借助spring来进行动态配置。

1)先保证在spring mvc 配置中引用我配置中心自定义的propertyConfigurer 属性获取类

<bean id="propertyConfigurer" class="com.cehome.utils.config.PropertyPlaceholderConfigurer">

</bean>

2)然后在freemarkerConfig 中增加freemarkerVariables属性,在里面配置多个变量,通过这种方式,把原来模版中静态编译的变量(如${baseUrl})换成由spring属性读取。

<bean id="freemarkerConfig" 
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
          <property name="freemarkerVariables">
        <map>
            <entry key="baseUrl" value="${baseUrl}"></entry>
        </map>
    </property>
</bean>

Js文件中包含了mvn配置项

Js 比较麻烦,原则上也是要去掉mvn属性项。一种方法是把js中的mvn的变量移出到模板页面中,在模板页面中加入变量定义,如:
原来util.js中包含mvn项:

var baseUrl ="${baseUrl}";

改为:

<script> var baseUrl=”${baseUrl}” </script>
<script src="util.js?"></script>

Logback 日志环境变量修改(如日志级别)

通过在logback.xml我们会定义一些占位符参数,如${logback.root.level},也是通过mvn编译时候打进去的,这种也需要人为做些处理,取到配置中心的属性后,通过调用System.setProperty("logback.root.level","INFO") 进行动态注入,logback它是能够识别系统属性的。

配置合并

在实际改造当中发现,不同应用其实是由一些公共配置的,例如数据库配置、redis配置,如果每个应用都配置一遍感觉重复太多了。所以增加了公共配置信息,并有一个约定,缺省的情况下应用启动是时候先加载公共配置信息,然后再是应用本身的配置,应用本身的配置可以覆盖公共配置同名的配置项。

目录
相关文章
|
3月前
|
监控 Java 持续交付
深入理解微服务架构及其在现代应用开发中的应用
深入理解微服务架构及其在现代应用开发中的应用
79 1
|
2月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
3月前
|
机器学习/深度学习 自然语言处理 分布式计算
大规模语言模型与生成模型:技术原理、架构与应用
本文深入探讨了大规模语言模型(LLMs)和生成模型的技术原理、经典架构及应用。介绍了LLMs的关键特点,如海量数据训练、深层架构和自监督学习,以及常见模型如GPT、BERT和T5。同时,文章详细解析了生成模型的工作原理,包括自回归模型、自编码器和GANs,并讨论了这些模型在自然语言生成、机器翻译、对话系统和数据增强等领域的应用。最后,文章展望了未来的发展趋势,如模型压缩、跨模态生成和多语言多任务学习。
434 3
|
3月前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
55 3
|
12天前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
55 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
5天前
|
存储 人工智能 并行计算
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
|
1月前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
57 26
|
1月前
|
容灾 网络协议 数据库
云卓越架构:云上网络稳定性建设和应用稳定性治理最佳实践
本文介绍了云上网络稳定性体系建设的关键内容,包括面向失败的架构设计、可观测性与应急恢复、客户案例及阿里巴巴的核心电商架构演进。首先强调了网络稳定性的挑战及其应对策略,如责任共担模型和冗余设计。接着详细探讨了多可用区部署、弹性架构规划及跨地域容灾设计的最佳实践,特别是阿里云的产品和技术如何助力实现高可用性和快速故障恢复。最后通过具体案例展示了秒级故障转移的效果,以及同城多活架构下的实际应用。这些措施共同确保了业务在面对网络故障时的持续稳定运行。
|
3月前
|
Cloud Native 安全 持续交付
深入理解微服务架构及其在现代软件开发中的应用
深入理解微服务架构及其在现代软件开发中的应用
112 32
|
3月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
275 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生