前言
之前整理过一篇关于商品中台的整体的设计逻辑:数据中台思考,关于高扩展部分,一期的建设时,采用了反射机制,落地过程中发现了诸多弊端。于是思考了关于这部分的一些方案。分别是Map扩展;反射扩展两种方式。如果哪位有其他方案,希望不吝赐教。
Map扩展
在JD时,垂直域的扩展内容与中台的交互时,采用的便是Map类型,数据存储时,将扩展信息直接存放到Map类型的ext扩展字段中;数据查询时,可以从Map类型的ext字段中取出扩展信息进行相关的业务逻辑处理。
- 优势
- 中台可以灵活的兼容不同的垂直领域扩展属性
- 系统设计的复杂度降低
- 劣势
- 可读性较差
实现方式
- 扩展对象
public class BusinessObject {
private Map<String, Object> ext;
public BusinessObject() {
this.ext = new HashMap<>();
}
/**
* 获取扩展数据
*
* @return 获取扩展信息
*/
public Map<String, Object> getExt() {
return ext;
}
/**
* 设置扩展数据
*
* @param ext 扩展
*/
public void setExt(Map<String, Object> ext) {
this.ext = ext;
}
/**
* 添加单个扩展数据
*
* @param key 扩展字段名
* @param value 扩展数据值
*/
public void putExt(String key, Object value) {
this.ext.put(key, value);
}
/**
* 获取单个扩展数据
*
* @param key 扩展字段名
* @return 扩展数据值
*/
public Object getExtValue(String key) {
return this.ext.get(key);
}
}
- 使用方式
以sku数据为例,sku的基础数据为中台定义,同一对外提供标准,不同垂直领域的sku的扩展数据,在数据存储、查询交互时设置到ext的扩展对象中。
public class Sku {
private Long skuId;
private String skuName;
private String skuCode;
private String upc;
private String logo;
// ...
private BusinessObject ext;
}
反射扩展
当前这家公司,也在做中台建设,由于是以历史的项目为基础,提取抽象化中台能力,所以在扩展能力方面,使用了原有的能力,即使用了反射的方式,但此方式存在诸多的不方面,所以想要采用这种方式一定要慎重。
- 优势
- 可读性较好
- 劣势
- 增加反射的中间适配层,增加了系统的复杂度
- 需要增加元数据管理系统能力,否则无法管理复杂的数据结构
实现方式
- 返回
clazz对象,在适配层指定,fieldName与value,存储在中台的属性表中,返回时,通过主数据id查询并返回,业务系统可定义对应的业务对象,通过反射的方式将数值设置到业务对象中。
public class ReflectionResult {
public static void setFieldValue(Class<?> clazz, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
// 获取指定名称的field
Field field = clazz.getDeclaredField(fieldName);
// 设置field的访问权限,允许私有字段访问
field.setAccessible(true);
// 给指定的field设置值
field.set(object, value);
}
}
总结
平台化系统,如何向上做好扩展兼容,管理扩展数据,是中台必须解决的问题,目前我还没找到一个满意的答案。
使用Map或反射的方式都不一定是好的方式,需要看业务的复杂度,从中找到比较好的答案,如果哪位大神有更好的方式,希望留言探讨,不吝赐教。