生成一个项目confogcenter
用cms-archetype
生成一个项目,然后在此基础上开发一个模块,用于管理配置信息(CRUD)
我写的配置中心在github上: https://github.com/kangyonggan/configcenter.git
原理
在spring把占位符替换之前,发送http get请求到配置中心读取配置,拿到此项目的所有配置信息后(json),把json数据解析成一对对的名值对,最后把所有的名值对全部放入系统配置中,即:System.setProperty(name, value);
。
具体实现
在applicationContext.xml
的最上方(也不一定最上,但一定要在所有占位符的上面)添加自定义的bean
:
1 | <?xml version="1.0" encoding="UTF-8"?> |
MyPropertyPlaceholderConfigurer.java
的实现:
1 | package com.kangyonggan.archetype.cmscc.biz.core; |
其中public static void load(JSONArray jsonArray)
之所以写成了static
是因为我其他地方也想使用, 比如:我发现ftp的ip配置错了,然后修改了ftp的ip,但是又不想重启服务器,这时候我就会在配置中心的控制台上点一下推送配置
,然后客户端项目就能接收到配置了,然后就需要调用load方法刷新一下内存中的配置,但有些配置刷了也没用,比如jdbc的url等。
接收配置的代码ConfigcenterController.java
:
1 | package com.kangyonggan.archetype.cmscc.web.controller.web; |
四、注意
1. 日志的目录不能配置在配置中心,因为在读取配置中心的配置之前就使用到了日志,我的解决方案是写入了pom.xml
, 如:<log4j2.home>/Users/kyg/logs/cmscc</log4j2.home>
2. 配置中心服务器的地址配置在了app.properties
,因为配置中心的地址是可能变的,所以不能硬编码,如:app.proerperties
的内容:
1 | config.center.server=http://localhost:7777/configuration?proj=${project.parent.artifactId}&env=${env} |
其中${project.parent.artifactId}
会取自pom.xml
中父模块的artifactId,${env}
指的是环境,比如开发环境,联调环境,生产环境等。我写在了pom.xml中:
1 | <profiles> |
我把使用配置中心的项目也写了一个项目原型,地址在:https://github.com/kangyonggan/cmscc-archetype.git
附配置中心推送配置的代码
1 | /** |