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

简介: 要把配置中心整合进现有的项目,要做的事情还不少 接管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配置,如果每个应用都配置一遍感觉重复太多了。所以增加了公共配置信息,并有一个约定,缺省的情况下应用启动是时候先加载公共配置信息,然后再是应用本身的配置,应用本身的配置可以覆盖公共配置同名的配置项。

目录
相关文章
|
4月前
|
人工智能 运维 安全
配置驱动的动态 Agent 架构网络:实现高效编排、动态更新与智能治理
本文所阐述的配置驱动智能 Agent 架构,其核心价值在于为 Agent 开发领域提供了一套通用的、可落地的标准化范式。
824 65
|
5月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
926 3
|
6月前
|
消息中间件 监控 前端开发
如何开发项目管理系统中的项目结项板块?(附架构图+流程图+代码参考)
在企业项目管理中,“项目结项”是关键环节,常因流程不清、文档不全、审批滞后等问题导致交付困难。本文介绍如何通过“项目结项”模块实现线上化管理,涵盖结项申请、审批流程、成果上传、权限控制等功能,帮助团队高效完成项目收尾,避免成果丢失与流程混乱。内容包括功能设计、业务流程、系统架构、数据库设计、核心代码实现、前端交互及优化建议,助力项目管理系统快速落地并稳定运行。
|
4月前
|
人工智能 安全 数据可视化
配置驱动的动态Agent架构网络:实现高效编排、动态更新与智能治理
本文系统性地提出并阐述了一种配置驱动的独立运行时Agent架构,旨在解决当前低代码/平台化Agent方案在企业级落地时面临困难,为Agent开发领域提供了一套通用的、可落地的标准化范式。
427 18
配置驱动的动态Agent架构网络:实现高效编排、动态更新与智能治理
|
3月前
|
人工智能 JavaScript 前端开发
GenSX (不一样的AI应用框架)架构学习指南
GenSX 是一个基于 TypeScript 的函数式 AI 工作流框架,以“函数组合替代图编排”为核心理念。它通过纯函数组件、自动追踪与断点恢复等特性,让开发者用自然代码构建可追溯、易测试的 LLM 应用。支持多模型集成与插件化扩展,兼具灵活性与工程化优势。
302 6
|
4月前
|
人工智能 Cloud Native 中间件
划重点|云栖大会「AI 原生应用架构论坛」看点梳理
本场论坛将系统性阐述 AI 原生应用架构的新范式、演进趋势与技术突破,并分享来自真实生产环境下的一线实践经验与思考。
|
4月前
|
机器学习/深度学习 人工智能 vr&ar
H4H:面向AR/VR应用的NPU-CIM异构系统混合卷积-Transformer架构搜索——论文阅读
H4H是一种面向AR/VR应用的混合卷积-Transformer架构,基于NPU-CIM异构系统,通过神经架构搜索实现高效模型设计。该架构结合卷积神经网络(CNN)的局部特征提取与视觉Transformer(ViT)的全局信息处理能力,提升模型性能与效率。通过两阶段增量训练策略,缓解混合模型训练中的梯度冲突问题,并利用异构计算资源优化推理延迟与能耗。实验表明,H4H在相同准确率下显著降低延迟和功耗,为AR/VR设备上的边缘AI推理提供了高效解决方案。
537 0
|
3月前
|
机器学习/深度学习 自然语言处理 算法
48_动态架构模型:NAS在LLM中的应用
大型语言模型(LLM)在自然语言处理领域的突破性进展,很大程度上归功于其庞大的参数量和复杂的网络架构。然而,随着模型规模的不断增长,计算资源消耗、推理延迟和部署成本等问题日益凸显。如何在保持模型性能的同时,优化模型架构以提高效率,成为2025年大模型研究的核心方向之一。神经架构搜索(Neural Architecture Search, NAS)作为一种自动化的网络设计方法,正在为这一挑战提供创新性解决方案。本文将深入探讨NAS技术如何应用于LLM的架构优化,特别是在层数与维度调整方面的最新进展,并通过代码实现展示简单的NAS实验。
|
5月前
|
Web App开发 Linux 虚拟化
Omnissa Horizon 8 2506 (8.16) - 虚拟桌面基础架构 (VDI) 和应用软件
Omnissa Horizon 8 2506 (8.16) - 虚拟桌面基础架构 (VDI) 和应用软件
309 0
Omnissa Horizon 8 2506 (8.16) - 虚拟桌面基础架构 (VDI) 和应用软件
|
5月前
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
479 0