最近在做springcloud的集群构建,在业务代码层,遇到了动态配置,当然可以采用springcloud的config的配置中心,但是感觉这个配置在使用上极度不爽,因为我不仅仅要构建一版开发环境的,还需要我手动的将配置文件上传到生产内网去,这都是次要的,动态加载,总感觉不是很爽。
所以在网上寻找动态配置中心,单纯的做业务方面的配置,而且还得必须高效可用,所以找到了diamond,不过一开始采用淘宝版的,不过使用起来有点不爽,就找到了git上大神开源的项目。
diamond的改进版:
git地址:https://github.com/bingoohuang/diamond-miner
下载源码,解压开后:
首先先构建配置服务中心
进入到 diamond-miner-master\diamond-server 改目录下
进行maven打包
mvn clean
mvn package
打包完事后,可以在target下找到war包,这个就是源码处理后的,因为diamond的持久化是数据库,所以可以自定义数据源。我这边采用的mysql
同级目录下放数据源配置文件,文件内容可以参考git上的示例:
随后就可以启动war包,可以采用命令启动:
java -jar diamond-server-0.0.8-exec.war -httpPort 17002
启动完成后,直接访问:
http://127.0.0.1:17002/diamond-server
账号密码都是admin/admin
登录进去后就是一个空的配置中心
左侧菜单:
、
- Configuration 配置中心
- Privileges 登录账号管理中心
主要关心的配置中心即可
New Config 新加配置
Upload Config 更新配置
query查询所有,fuzzyquery模糊查
我为了方便测试,初始化了几条配置
group 组
dataId 数据ID
content 配置内容 遵循properties方式 xxxx=xxxx 注释的话可以在desc加也可以用#标注
配置服务中心就建立好了,高可用文章最后会说明的
现在开始实际代码使用,我实际的工程采用的springboot开发的,所以,不会的小伙伴建议学习下,毕竟现在基本的都是spirngboot了,springmvc的也是一样的方式,
<!-- https://mvnrepository.com/artifact/com.github.bingoohuang/diamond-client -->
<dependency>
<groupId>com.github.bingoohuang</groupId>
<artifactId>diamond-client</artifactId>
<version>0.0.21</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>
首先引入pom,排除这个fastjson是因为我工程引入了,所以排除了,这个可以自由把握。
resources目录下建立配置文件, 名称为: diamond-client.properties
内容如下:
DiamondServer.address=127.0.0.1:17002
这个也是可以采用pom文件打包分环境的方式采取,比如:
pom文件下:
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
<eureka-url>http://127.0.0.1:9010/eureka/</eureka-url>
<diamond-url>127.0.0.1:17002</diamond-url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
<eureka-url>http://127.0.0.1:9010/eureka/</eureka-url>
<diamond-url>127.0.0.1:17002</diamond-url>
</properties>
</profile>
<profile>
<id>pro</id>
<properties>
<env>pro</env>
<eureka-url>http://127.0.0.1:9010/eureka/</eureka-url>
<diamond-url>127.0.0.1:17002</diamond-url>
</properties>
</profile>
</profiles>
配置文件内容:
DiamondServer.address=@diamond-url@
这样的话也是可以的,如果不懂pom分环境打包的话,建议自学,这个是一个maven常用的技能。
简单的写了一个controller的测试验证类:
package com.zh.controller.diamond;
import com.alibaba.fastjson.JSONObject;
import com.zh.common.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.n3r.diamond.client.Miner;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author Lu code people
* @Date 2019/9/4 15:26
* @Desc v
**/
@Slf4j
@RestController
@RequestMapping(value = "/diamond")
public class DiamondController {
@GetMapping(value = "/get")
public Result getDiamond() {
JSONObject data = new JSONObject();
// 获取默认分组下的dataId为demo的content中的配置,
/**
* key 如果没有对应的key会返回改默认值,也可以不写
* getString("demo.id", "no value")
*/
data.put("demo.id", new Miner().getMiner("demo").getString("demo.id", "no value"));
data.put("demo.name", new Miner().getMiner("demo").getString("demo.name"));
JSONObject data2 = new JSONObject();
// 获取指定分组user下的dataId为demo的下的content中的配置
data2.put("user.swatch", new Miner().getMiner("user", "demo").getString("user.swatch", "no value"));
data2.put("user.auth", new Miner().getMiner("user", "demo").getString("user.auth"));
JSONObject res = new JSONObject();
res.put("DEFAULT_GROUP", data);
res.put("user", data2);
// 获取指定分组user下的dataId为demo的conten的内容,所有的配置
String stone = new Miner().getStone("user", "demo");
log.info("指定分组user下的dataId为demo的conten的内容 : {}", stone);
return Result.success(res);
}
}
这样的话就可以获取到配置了。
上述基本完成了动态配置的搭建与使用,接下来说说其他特性。
首先,关闭你的配置中心服务,再次调用获取配置,发现是可以获取到的,是不是很意外,具体的可以参考下载下源码中心的那个ppt文件,要想直观的看得到的话,可以在自己本地电脑上的用户目录下发现有一份缓存文件
C:\Users\ThinkPad\.diamond-client
会在其中一个找打跟线上一样的配置,
当配置中心挂掉后,项目还是可以从本地获取到配置的,只不过这份配置不可以从配置服务中心进行同步了,不会影响到实际的使用,项目日志会不断刷连接配置中心超时,
这个配置中心建议只是使用在业务层面的配置,
至于更具体的原理什么的,建议看源码吧,毕竟个人也是懂了一个大致的,也经过实际测试后才选型改技术使用了。