【Java项目】SpringBoot项目如何从自研配置中心拉取配置

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【Java项目】SpringBoot项目如何从自研配置中心拉取配置

前言

先简单说一下这个题目的意思是什么。

我们知道,如果我们的项目是SpringCloud的项目,我们是可以把我们的本地配置写到云端的的配置中心的,比如集成SpringCloud Alibaba,你就可以使用Nacos,然后把配置写到Nacos中,从而保证配置的安全。

那么如果是SpringBoot项目,大部分我们的配置都是直接写在本地的,那么就会出现代码如果泄露,配置文件内的内容就会被发现从而造成危险,所以如果可以把SpringBoot项目的配置文件也从云端或者远程处拉取的话,那么项目的安全度就会高很多。

所以可以考虑使用一种类似于配置中心的方式,我们自己建设一个简易的配置中心,然后我们发送HTTP请求去配置中心拉取代码,也可以做到配置不存在本地的形式。

我的思路是,写一个小网页,然后把配置存储在网页对应的数据库中,也就是我们写一个内部人员使用的管理系统,我们可以把配置输入到这个管理系统中,和Nacos差不多。

然后我们只需要向管理系统发送请求,并且携带上一些参数,配置系统就会把其中的配置返回给我们,从而做到SpringBoot项目也可以从远程拉取配置的方式。

思路

我们公司的实现方式是,封装好一个jar包,打包到maven仓库,之后只要项目需要使用,就拉取这个项目即可。

之后就是,我们得配置我们需要加载的一些配置信息,以及提供一些项目参数来确定能从配置中心拉取到唯一的配置。比如提供项目的id,项目的开发环境env,需要加载的一些其他需要从配置中心拉取的配置。

配置有了,我们需要在我们的jar包中,封装好一些读取用户本地配置的一些信息,也就是我们需要读取用户本地的配置文件,我们先开发一个类用于存储最终得到的信息:

public class AppProperties {
    //默认开发组
    private static final String DEFAULT_GROUP = "Default";
    private static String projectName;//项目名称
    private static String environment;//开发环境
    private static String group;//开发组
    public AppProperties() {
    }
    public static String getGroup() {
        return group;
    }
    public static String getAppName() {
        return projectName;
    }
    public static String getEnvironment() {
        return environment;
    }
}

之后,我们就得编写一个类,这个类需要用于获取用户可能的存放配置文件的所有地方,可以分为如下几种:ClassPath、System、UserDir、Environment。

public class ConfigCenterClientEnvironment {
    private List<Property> propertySourcesList = new CopyOnWriteArrayList();
    public ConfigCenterClientEnvironment() {
        this.propertySourcesList.add(new EnvironmentProperty());
        this.propertySourcesList.add(new SystemProperty());
        this.propertySourcesList.add(new UserDirProperty());
        this.propertySourcesList.add(new ClassPathProperty());
    }
    private String getByOrder(String name) {
        Iterator i$ = this.propertySourcesList.iterator();
        String value;
        do {
            if (!i$.hasNext()) {
                return null;
            }
            Property propertySources = (Property)i$.next();
            value = (String)propertySources.get(name);
        } while(!StringUtils.isNotBlank(value));
        return value;
    }
    public String getEnvironment() {
        return this.getByOrder("environment");
    }
    public String getProjectName() {
        return this.getByOrder("projectName");
    }
    public String getGroup() {
        return this.getByOrder("group");
    }
}

下面简单的贴出一个获取System配置的类

public class SystemProperty extends Properties {
    public SystemProperty() {
        String projectName = System.getProperty("projectName");
        String environment = System.getProperty("environment");
        String group = System.getProperty("group");
        if (StringUtils.isNotBlank(projectName)) {
            this.put("projectName", projectName);
        }
        if (StringUtils.isNotBlank(environment)) {
            this.put("environment", environment);
        }
        if (StringUtils.isNotBlank(group)) {
            this.put("group", group);
        }
    }
}

类似于从ClassPath获取配置的方式也一样,只不过获取配置文件的方式变为了先使用InputStream流去读取配置文件,读取到配置文件非空之后在读取配置文件中对应的配置。

ok,到目前位置我们已经把本地的配置文件全都读取完毕并且保存好了,只好我们要做的就是基于这些配置文件的信息,向我们的注册中心发送请求,并且从注册中心得到数据。

大概的代码编写方式如下,我们传入对应的projectName,env,group等参数,然后我们使用这些参数配合上我们注册中心的地址,比如http://xxx/xxx/然后加上我们的这些参数拼接在后面,就可以得到一个完整的url串。这里你也可以按照上面一样的方式,让配置中心的地址也选择从我们本地读,但是这样子不太好了,就失去了我们一开始配置这个东西的理由。

得到url之后,我们发送这个url向注册中心,并且得到一个json串。

private List<ProjectConfig> getProjectConfigListFromRemote(String projectName, String env, String group) {
        try {
            String url = UrlBuilder.getConfigListByEnv(projectName, env, group);
            String json = this.httpHelper.get(url);
            this.currentStatus = "ready"; //当前是否被好发送
            return JsonHelper.convertToProjectConfig(json);
        } catch (Exception var6) {
            this.currentStatus = "offline"; //配置中心离线 报错
            logger.error(var6.getMessage(), var6);
            throw new RuntimeException(var6.getMessage(), var6);
        }
    }

当然,为了确保当前用户拥有获取配置的权限,我们还可以加上一个用户校验。

class HttpHelper {
    private String user;
    private String password;
    public HttpHelper(String user, String password) {
        this.user = user;
        this.password = password;
    }
    public String get(String url) throws Exception {
        return this.HttpInvoker(url, "GET", this.user, this.password, (String)null);
    }
    public String post(String url, String body) throws Exception {
        return this.HttpInvoker(url, "POST", this.user, this.password, body);
    }
    }

然后,我们通过Json解析的方式,将从配置中心得到的配置,进行Json的解析,得到最后的类,我们可以使用gson进行解析

gson解析后如下

至此,我们已经把配置从配置中心获取到了,至于获取到的配置的格式,是你自己定义的,只要方便你之后进行解析即可,我们使用的是xml的配置。

在得到了配置之后,如果我们需要使用这些配置对本地的一些类进行配置,那么我们直接根据配置的key获取到配置对应的value即可,然后解析value这个字符串,然后对属性与类进行赋值即可。


相关文章
|
10天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
70 26
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
6天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
52 13
|
22天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
36 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
21天前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
1月前
|
Java Android开发
Eclipse 创建 Java 项目
Eclipse 创建 Java 项目
39 4
|
1月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
42 2
|
1月前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
44 3
|
29天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
37 0

热门文章

最新文章