配置思想
- 使用枚举类缓存配置内容:使用接口规定获取枚举类中数据方法
使用枚举类保存配置内容;通过接口定义获取枚举中数据方式;枚举类实现接口就实现了获取枚举中配置数据的方式; - 注册监听器,刷新枚举类中的配置内容
循环注册枚举类,刷新枚举类中的配置内容 - 使用配置内容
获取枚举类,然后通过接口中定义的方法获取枚举类中的数据
这样的优点是,枚举类和接口既不依赖spring框架也不依赖中心化配置,可以很好的隔离和迁移
配置案例
- 默认中心化的配置数据是JSON格式的数据
- 接口:定义了获取配置数据的方法
/**
* 数据格式为JSON
* 定义获取数据的方法:
* 1、根据key获取value[String,Integer,Long,Double,Boolean]
* 2、根据key获取Value对应的java对象或集合
*/
public interface GetDataService {
//json:根据key获取String类型value
String getString(String key);
//json:根据key获取String类型value,没有返回默认defaultValue
String getString(String key, String defaultValue);
//json:根据key获取Integer类型value
Integer getInteger(String key);
//json:根据key获取Integer类型value,没有返回默认defaultValue
Integer getInteger(String key, Integer defaultValue);
//json:根据key获取Boolean类型value
Boolean getBoolean(String key);
//json:根据key获取Boolean类型value,没有返回默认defaultValue
Boolean getBoolean(String key, Boolean defaultValue);
//json:根据key获取Long类型value
Long getLong(String key);
//json:根据key获取Long类型value,没有返回默认defaultValue
Long getLong(String key, Long defaultValue);
//json:根据key获取Double类型value
Double getDouble(String key);
//json:根据key获取Double类型value,没有返回默认defaultValue
Double getDouble(String key, Double defaultValue);
//json:根据key获取clazz类型value对象
<T> T getObject(String key, Class<T> clazz);
//json:根据key获取clazz类型value集合
<T> List<T> getList(String key, Class<T> clazz);
}
- 枚举类:保存配置数据,实现接口方法将数据对外提供出去
enum DataFactory implements GetDataService {
// 配置内容1
COMMON_CONFIG_01("config-data-1", "config-group"),
// 配置内容2
COMMON_CONFIG_02("config-data-2", "config-group"),
// 配置内容n
COMMON_CONFIG_0N("config-data-n", "config-group");
//中心化配置需要的配置数据dataId和groupId
private String dataId;
private String groupId;
DataFactory(String dataId, String groupId) {
this.dataId = dataId;
this.groupId = groupId;
}
public String getDataId() {
return dataId;
}
public String getGroupId() {
return groupId;
}
//使用该属性保存中心化配置的数据
private JSONObject configObj = new JSONObject();
//该方法给监听器使用来刷新上面的配置属性内容
public void refresh(JSONObject configObj) {
if (configObj != null) {
this.configObj = configObj;
}
}
//json:根据key获取String类型value[接口中定义方法]
@Override
public String getString(String key) {
return configObj.getString(key);
}
//json:根据key获取String类型value,没有返回默认defaultValue[接口中定义方法]
@Override
public String getString(String key, String defaultValue) {
String value = getString(key);
return ofNullable(value, defaultValue);
}
//json:根据key获取Integer类型value[接口中定义方法]
@Override
public Integer getInteger(String key) {
try {
return configObj.getInteger(key);
} catch (Exception e) {
return null;
}
}
//json:根据key获取Integer类型value,没有返回默认defaultValue[接口中定义方法]
@Override
public Integer getInteger(String key, Integer defaultValue) {
Integer value = getInteger(key);
return ofNullable(value, defaultValue);
}
//json:根据key获取Boolean类型value[接口中定义方法]
@Override
public Boolean getBoolean(String key) {
try {
return configObj.getBoolean(key);
} catch (Exception e) {
return null;
}
}
//json:根据key获取Boolean类型value,没有返回默认defaultValue[接口中定义方法]
@Override
public Boolean getBoolean(String key, Boolean defaultValue) {
Boolean value = getBoolean(key);
return ofNullable(value, defaultValue);
}
//json:根据key获取Long类型value[接口中定义方法]
@Override
public Long getLong(String key) {
try {
return configObj.getLong(key);
} catch (Exception e) {
return null;
}
}
//json:根据key获取Long类型value,没有返回默认defaultValue[接口中定义方法]
@Override
public Long getLong(String key, Long defaultValue) {
Long value = getLong(key);
return ofNullable(value, defaultValue);
}
//json:根据key获取Double类型value[接口中定义方法]
@Override
public Double getDouble(String key) {
try {
return configObj.getDouble(key);
} catch (Exception e) {
return null;
}
}
//json:根据key获取Double类型value,没有返回默认defaultValue[接口中定义方法]
@Override
public Double getDouble(String key, Double defaultValue) {
Double value = getDouble(key);
return ofNullable(value, defaultValue);
}
//json:根据key获取clazz类型value[接口中定义方法]
@Override
public <T> T getObject(String key, Class<T> clazz) {
return configObj.getObject(key, clazz);
}
//json:根据key获取clazz类型value集合[接口中定义方法]
@Override
public <T> List<T> getList(String key, Class<T> clazz) {
String value = getString(key);
return value != null ? JSONArray.parseArray(value, clazz) : new ArrayList<>();
}
//第一个参数为null则返回第二个值
private <T> T ofNullable(T origin, T defaultValue) {
return Optional.ofNullable(origin).orElse(defaultValue);
}
}
- 注册监听器:
监听新数据,将新数据转成json然后刷新到DataFactory枚举中
/**
* 初始化配置监听器
*/
@Order(Ordered.HIGHEST_PRECEDENCE)//优先级最高
@Component//交给spring容器管理
public class DataListenerInitializer {
@PostConstruct//启动时就执行该方法
public void init() {
//遍历枚举类,使用匿名内部类为每一个枚举类注册一个监听器
for (DataFactory dataFactory : DataFactory.values()) {
String dataId = dataFactory.getDataId();
String groupId = dataFactory.getGroupId();
// 匿名内部类注册监听器
Diamond.addListener(dataId, groupId, new ManagerListenerAdapter() {
//方法入参config就是中心配置中的配置数据
@Override
public void receiveConfigInfo(String config) {
try {
// 将接受到的数据转成JSONObject
JSONObject configObj = JSON.parseObject(config);
// 将最新数据刷新到枚举类dataFactory中去
dataFactory.refresh(configObj);
} catch (Exception e) {
// 数据转换出错,则记录日志,不建议抛出异常影响逻辑执行
log.error("DataFactory refresh error, dataId={}, groupId={}, cause={}", dataId, groupId,e.getMessage());
}
}
});
}
}
}
- 使用配置数据
获取配置对应的枚举类;使用枚举类
//枚举类
private GetDataService dataFactory = DataFactory.COMMON_CONFIG_02;
//获取枚举中数据
String data = dataFactory.getString("key01", "defaultKeyValue");