开发中一些套路玩法-中心化配置使用

配置思想

  1. 使用枚举类缓存配置内容:使用接口规定获取枚举类中数据方法
    使用枚举类保存配置内容;通过接口定义获取枚举中数据方式;枚举类实现接口就实现了获取枚举中配置数据的方式;
  2. 注册监听器,刷新枚举类中的配置内容
    循环注册枚举类,刷新枚举类中的配置内容
  3. 使用配置内容
    获取枚举类,然后通过接口中定义的方法获取枚举类中的数据

这样的优点是,枚举类和接口既不依赖spring框架也不依赖中心化配置,可以很好的隔离和迁移

配置案例

  1. 默认中心化的配置数据是JSON格式的数据
  2. 接口:定义了获取配置数据的方法
/**
 * 数据格式为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);
}
  1. 枚举类:保存配置数据,实现接口方法将数据对外提供出去
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);
    }
}
  1. 注册监听器:
    监听新数据,将新数据转成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());
                    }
                }
            });
        }
    }
}
  1. 使用配置数据
    获取配置对应的枚举类;使用枚举类
//枚举类
private GetDataService dataFactory = DataFactory.COMMON_CONFIG_02;
//获取枚举中数据
String data = dataFactory.getString("key01", "defaultKeyValue");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值