内存配置中心

内存配置中心

前言

会有一系列的文章介绍common-*.jar的各种用法,这些工具类jar包都已上传在maven中央库。可以直接通过maven坐标引入使用。源码可以参见:https://gitee.com/rjzjh/common

内存配置中心

一提到配置中心,大家想得最多的是configserver,阿波罗,consule等微服务系统较为典型的配置中心,集中存放项目的配置信息,起到权限管理、发布审核、操作审计、灰度发布等重要作用。但这些都是依赖第三方中间件来达到配置集中管理的目的,怎么选都是较重的一种方案,但有些场景需要配置中心但又不想有太重的依赖,只想把这些配置存放到内存就够用了。如:

  • 工具jar包,特别是连接一些中间件的配置项。

  • 属地化部署,没有条件使用第三方中间件来集中配置

  • demo示例,不想为了跑个demo而配置第三方中间件

    综上所述,需要一个配置中心,可以默认地把配置文件load到内存中,供程序直接使用这么一个模块。

需要考虑的问题

一个轻量化的内存配置中心,即要满足“轻”这一特性,更进一步的是多场景适配,如:

  • 因为要“轻”,不可能让你独立部署,也就只能以jar包的形态出现,让项目引用这个jar包。
  • 这个jar包可能存在不同的布署场景,如:war包中的jar(j2ee的web项目),文件系统lib目录(一些中间件),jar包中的jar(springboot为代表的FatJar打包模式)。
  • 配置冲突,你写的jar中有默认配置项与项目想要覆盖的配置项, 不同的jar有同一个配置项,你写的工具jar包跟别人引用的项目使用的配置。有些配置文件放在jar包外面,这些外部配置项与jar包内部配置项冲突。
  • 配置项的快速搜索。因为配置项可能存在不同的依赖包中,如果某个项目所依赖的jar有成百上千个,如果快速地搜索出你需要的配置项是一个技术活。
  • springboot大为流行的今天,如何与springboot的配置互为融合也是一个着重考虑项。

common-apiext公共模块

common-apiext是整个工具类的基础,它不单只有配置中心这一个内容,还有像时间、json、线程池、自定义classload等相关工具类,能降低它们的使用门槛,

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/net.wicp.tams/common-apiext -->
<dependency>
<groupId>net.wicp.tams</groupId>
<artifactId>common-apiext</artifactId>
<version>最后版本</version>
</dependency>

属性文件的配置

common-apiext只会读取放到resource的根目录下的属性文件,它会分三个层次读取属性文件:

  1. common- 开始的jar包,根目录下,common-*.properties 一系列的属性文件,它主要是用于tams系列工具类中定义的默认配置项,优先级别最低
  2. META-INF\tams\auto-config.json文件中properpre指示的默认属性配置(后面示例讲解),它主要是用于用户自定义工具类时需要配置的默认配置项,优先级别比“1”要高。
  3. META-INF\tams\auto-config.json文件中jarpre指示的具有此前缀的属性文件,用于项目中需要配置的配置项,优先级别比“2”要高
  4. 通过编程手工覆盖配置项,它的优先级别是最高的。eg:Conf.overProp(props)

auto-config.json示例

1
2
3
4
5
6
{
"jarpre": "demo-tams-",
"filterpack":"net.wicp.tams.common.apiext.test",
"properpre": "demo-tams-",
"firstConfs": "demo-default.properties"
}

默认配置项为: demo-tams-前缀的jar包中的common-aws-default.properties文件,如: demo-tams-apiext.jar包中demo-default.properties文件为默认配置项
用户用于覆盖默认配置项的属性:所有含有net.wicp.tams.common.apiext.test的package的依赖jar包,且属性文件的含有前缀:demo-tams- 的属性文件。

参考项目:https://github.com/rjzjh/demo-tams/tree/master/demo-tams-apiext

有三个地方有配置项: common.apiext.i18n  ,

1、依赖包common-apiext.jar有文件common-apiext.properties ,配置项:common.apiext.i18n=zh

2、项目文件:demo-default.properties,配置项:common.apiext.i18n=en

3、项目文件:demo-tams-user.properties ,配置项:common.apiext.i18n=de

它们的优先级是: 3>2>1 所以最后Conf.get(“common.apiext.i18n”)的值为demo-tams-user.properties文件的配置值”de”。

为什么需要有三个层次的配置项呢?

 第一层次(common-apiext.jar)是common-***.jar系列jar包保留的配置,它只检测common-前缀的jar包中的类:net.wicp.tams.common.Conf的firstReads数组指定的文件名中配置的配置项,它为common系统jar包提供默认的配置。

 第二层次(demo-default.properties)是方便业务开发自己的公用jar包,业务层引用了common系统jar包后,自己定义了用于覆盖里面的默认配置项的配置,但它本身也是一个公用的jar包,会被别的系统以jar包的方式引用。

第三层次(demo-tams-user.properties)是真正的业务系统需要用的配置项,所以它是优先级是最高的。

common-spring-autoconfig(与springboot的融合)

如果你的项目是使用spring boot(也包含spring cloud) ,那么你的配置会以各种形式存在,配置中心(阿波罗,configserver等),jar包内spring内存的配置文件application.yml 或bootstrap.yml等,不管如何,它们都是被spring所管理的配置,而common系统工具包的配置项都存在内存中,并不被spring所管理。与spring完全不相交,那么你肯定想把common所用的存在于内存中的配置项 与spring完全无缝衔接,那么你要做的很简单,再引入一个jar包:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/net.wicp.tams/common-spring -->
<dependency>
<groupId>net.wicp.tams</groupId>
<artifactId>common-spring-autoconfig</artifactId>
<version>最后版本</version>
</dependency>

这个依赖包在配置中心方面有2个作用:

  1. 把common依赖的内存配置项也交给spring管理,可以用spring的各种注解自动注入值,如:@value(“….”)

  2. 把springboot读到的属性,也包含微服务中各种配置中心读过来的配置,按自己定义好的优先级来覆盖内存中的各配置项。这样common的系统jar包就能直接使用了。

如果想了解如何实现的,就需要查看“公用spring模块”这个章节了。

坚持原创技术分享,您的支持是我前进的动力!