配置模型
背景
在业务系统中, 会有很多配置型的信息, 而且这些信息可能是系统管理员或者业务人员进行调整的,并且配置调整后, 要求立即生效,不可重启服务等。 Trantor 提供了一套可以描述配置的机制,来解决上述问题。
概念
在分布式系统中,必然会有配置中心和事件监听的功能需求,例如数据库连接信息修改,账号密码变更下发通知,黑白名单即时生效、服务限流阈值和降级开关,或者流量动态调整等等。
配置模型正是为了满足这种需求诞生的,通过创建配置模型和对应的监听器实现配置信息变更后及时通知下游应用
定义
模型字段即配置项。
@SettingModel
- 配置模型在线化定义和非持久化模型基本一致
- 没有删除策略、开启快照、开启搜索、开启订阅等配置信息
- 不能关联
link和lookup关联类型字段

监听器
某些允许业务动态修改的配置,且需要立即生效的场景,可以为配置模型添加监听器。
监听器可以注入 Function 来完成复杂场景的调用,和其他使用 Function 的方式一致。监听器也可以注入配置模型本身来获取最新的配置。
SettingChangedListener
✅ 监听器需要实现 SettingChangedListener 接口,接口泛型为@SettingListener(field =)监听的字段的类型,当监听字段数据发生变化的时候会调用onChanged()
public interface SettingChangedListener<T> extends EventListener { /** * 当配置模型字段值发生变更时(即使变更前后值一样),都会触发该方法 * * @param event 字段变更事件 */ void onChanged(FieldChangedEvent<T> event);}@SettingListener
✅ 监听器实现类需要加上@SettingListener注解
@Documented@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@TrantorComponentpublic @interface SettingListener { String name() default "";
String desc() default "";
/** * 要监听的配置模型 */ Class<? extends BaseSettingModel> modelClass();
/** * 监听字段 */ String field();}代码示例
配置模型
- 配置模型需要继承
io.terminus.trantorframework.api.BaseSettingModel类 - 字段写法和非持久化模型一致, 但是不能写
Link和Lookup关联类型字段
@Data@SettingModel(name = "交易相关的配置")public class TradeSetting extends BaseSettingModel { @Field(name = "交易编码前缀") private String tradeNumberPrefix;
@Field(name = "交易超时时间") private Long tradeTimeout;
@Field(name = "支付超时时间") private Long paymentTimeout;}监听器
@RequiredArgsConstructor@SettingListener(modelClass = TradeSetting.class, field = TradeSetting.tradeTimeout_field)//监听的是tradeTimeout字段,类型为Long,因此泛型为<Long>public class TradeSettingListener implements SettingChangedListener<Long> { //注入Function private final TradeConfigFunc tradeConfigFunc;
@Override public void onChanged(FieldChangedEvent<Long> event) { event.getValue(); // 获取到最新的配置, 做相应处理 event.getOldValue(); // 获取到旧的配置 }}配置界面
内建视图
配置模型有2个内建页面 :
{modelKey}__SettingDetail__builtIn:详情页,menuView="true"可配置为菜单{modelKey}__SettingForm__builtIn:编辑页
视图效果
详情页

编辑页

样式渲染
内建视图样式比较单一,可自定义视图,或通过下面几种方式渲染内建视图样式:
-
描述性字段:@FieldTemple
-
内建视图字段组:@BuiltInView