java通用配置jvm和环境变量实现(代码片段)

isea533 isea533     2022-10-21     134

关键词:

Java 通用配置
(一)设计
(二)JVM和环境变量实现

本系列参考实现:

https://gitee.com/mybatis-mapper/config
https://github.com/mybatis-mapper/config

在写系列博客时,总有一两篇内容简单到可有可无…

本篇内容先选择了最简单的 JVM 和环境变量进行实现,实现过程中可以了解一个简单的规则,SPI 的配置等等,算是复杂实现前的开胃小菜。

JVM 参数

直接实现前面定义的 Config 接口就可以,系统变量太简单,以至于没有内容可讲:

package io.mybatis.config.defaults;

import io.mybatis.config.Config;

/**
 * 读取环境变量值
 *
 * @author liuzh
 */
public class SystemConfig implements Config 

  @Override
  public String getStr(String key) 
    return System.getProperty(key);
  

  @Override
  public int getOrder() 
    return SYSTEM_ORDER;
  


系统变量 JVM 参数方式是目前优先级最高的配置方式,代码中可以看到是 System.getProperty方式读取的,所以在代码中可以通过 System.setProperty("key", "value");进行设置,只要在 getProperty 前设置了,读取都会有效。

除了代码方式外,JVM 真正常用的地方还是在执行代码时,例如 Spring Boot 可执行 Jar 包运行时:

java -Dkey=value -jar xxxx-boot.jar

假如我们通过系统服务的方式运行 java 程序,通过JVM设置的参数是比较死板的,只是相对配置文件方便了一些,如果是在容器环境运行,由于优先级顺序很高,这种方式还会导不能通过环境变量进行覆盖,所以JVM覆盖值的用法在云原生环境使用较少。

环境变量

实现比 JVM 复杂了一点点,代码如下:

package io.mybatis.config.defaults;

import io.mybatis.config.Config;

/**
 * 读取环境变量值
 *
 * @author liuzh
 */
public class EnvConfig implements Config 

  @Override
  public String getStr(String key) 
    String value = System.getenv(key);
    if (value != null) 
      return value;
    
    key = key.toUpperCase().replaceAll("\\\\.", "_").replaceAll("-", "");
    return System.getenv(key);
  

  @Override
  public int getOrder() 
    return ENV_ORDER;
  

由于不同操作系统对环境变量有不同的限制或规范,从环境变量取值时一般都先通过原始 key 尝试获取,如果能拿到,就不需要做处理,如果没有再按下面规则转换:

  1. 转换为大写形式
  2. 替换.为下划线_
  3. 去掉所有 -

这里参考的 Spring 规则

在云原生(使用容器镜像或K8s)中,因为配置环境变量非常方便,所以非常有必要支持,而且推荐通过环境变量进行覆盖。

如果你用到了配置中心,可以优先配置中心方式。

在 K8s 中用 ConfigMap 或者挂载 ConfigMap 卷覆盖配置文件都是很方便的选择。

JAVA SPI 配置

src/main/resources 资源目录下面创建 META-INF/services 目录,在新建的目录下面创建 io.mybatis.config.Config 文件,文件名就是接口名,在文件中配置上面两个实现:

io.mybatis.config.defaults.EnvConfig
io.mybatis.config.defaults.SystemConfig

JAVA SPI 初始化

ConfigHelper 中通过 ServiceLoader.load(Config.class) 初始化了 Config 接口的实现:

private static void init() 
  if (CONFIGS == null) 
    synchronized (ConfigHelper.class) 
      if (CONFIGS == null) 
        CONFIGS = new ArrayList<>();
        ServiceLoader<Config> serviceLoader = ServiceLoader.load(Config.class);
        for (Config config : serviceLoader) 
          CONFIGS.add(config);
        
        CONFIGS.sort(Comparator.comparing(Config::getOrder).reversed());
        CONFIGS.forEach(c -> log.debug("加载配置类: " + c.getClass().getName()));
      
    
  

这里通过 双重检查锁(Double-Checked Locking)对 private static volatile List<Config> CONFIGS; 进行初始化。

获取所有 Config 实现后,根据 Comparator.comparing(Config::getOrder).reversed() 进行倒序排序,所以这里的数字越大优先级越高。

简单测试

测试代码如下:

public class MainTest 
    public static void main(String[] args) 
        System.out.println(ConfigHelper.getStr("hello"));
        System.out.println(ConfigHelper.getBoolean("enabled"));
    

直接用 main 方法测试,不做任何配置的情况下,运行上面代码输出如下:

null
false

在IDE中配置JVM参数如下:

-Dhello=JVM你好 -Denabled=true

再次运行,输出如下内容:

JVM你好
true

删除JVM参数后,配置环境变量如下(IDEA启动后,直接配置系统环境变量是无效的,需要完全关闭IDEA启动才可能有效,可以直接通过IDEA提供的环境变量方式进行配置):

hello=ENV你好;ENABLED=true

输出内容如下:

ENV你好
true

接下来同时配置 JVM 和环境变量:

此时的输出结果如下:

JVM你好
true

可以看到 JVM 优先级高于环境变量。

本篇内容很简单,如果你对 SPI 不是很熟悉,可以搜索相关的文章进行了解,如果你们现有系统想支持这两种扩展方式,可以参考这里的实现在自己系统中增加这两种读取参数的方式。在后续的文章中会开始介绍用户自定义配置和版本配置,因为涉及到读取文件,相对复杂了很多,难度增加了不少,不好理解时多动手试试。

java通用配置jvm和环境变量实现(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config在写系列博客时,总有一两篇内容简单到可有可无…本篇内容先选择了最简单... 查看详情

java通用配置用户配置实现(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config用户配置用户和版本配置都需要读取文件,但是两 查看详情

java通用配置用户配置实现(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config用户配置用户和版本配置都需要读取文件,但是两 查看详情

java通用配置扩展示例(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情

java通用配置扩展示例(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情

java通用配置集成spring(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/my 查看详情

java通用配置集成spring(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/my 查看详情

java通用配置1.1.0版本发布(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情

java通用配置1.1.0版本发布(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情

jdk环境变量配置(代码片段)

Java虚拟机(JVM)JVM(JavaVirtualMachine):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java最具吸引力的特性之一。我们编写的Java代码,都运行在JVM之上。跨平台:任何软件的运行,都必须要运... 查看详情

java通用配置集成spring(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config作... 查看详情

java通用配置版本配置实现(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config版本配置设计版本配置是... 查看详情

vue环境变量和模式(设置通用baseurl)(代码片段)

VueCLI3 中可以通过设置环境变量和模式,可以根据不同模式加载不同的baseUrl地址。具体如下:一、环境变量1.描述在Vue项目的根目录下可以创建以下文件来设置环境变量.env#在所有的环境中被载入.env.local#在所有的环境中... 查看详情

java基础java环境搭建(代码片段)

...章目录一、前期准备1.基础知识2.软件二、安装1.JDK安装2.配置环境变量三、总结一、前期准备1.基础知识JVM:JavaVirtualMachine,也就是Java虚拟机,它是Java运行的虚拟环境,我们所编写的代码都运行在JVM上。而JVM作为... 查看详情

那年java那些事01—环境变量和集成开发工具(代码片段)

目录 一、环境变量的安装和配置(JDK)1.1环境变量1.2分类1.3JDK的安装与配置二、Java常用集成开发工具的安装和配置2.1Eclipse的安装和配置2.2IDEA2021.1的安装和配置(推荐)俗语云:工欲善其事,必先利其器。想要学习... 查看详情

linux-linux下java安装路径查找;配置java环境变量(代码片段)

一、查看Java的安装路径1、已经安装好了JDK,也配置了环境变量1、执行java-versionjava-version出现了版本号,表示安装过了JDK,配置了环境变量2、在配置过jdk的情况下,执行java-verbose指令,在打印出的文本最后两... 查看详情

java环境变量配置(代码片段)

Java环境变量配置安装Java后,需要配置Java在windows操作系统中的环境变量,方便应用通过系统环境变量中的配置,找到并使用Java提供的SDK,配置方法非常简单。环境变量的位置在Windows操作系统中,点击“计算机”,选择“属性”... 查看详情

elasticsearch介绍(代码片段)

...前流行的企业级搜索引擎。 二、Elasticsearch的安装和配置  1、下载并解压相应的安装包,并配置ES_HOME下载链接貌似被屏蔽了,需要开代理下载。  2、在bin目录下启动elasticsearch.bat即可运行Elasticsearch,通过浏览器访问local... 查看详情