方案
我们将我们的检验抽象成单独的节点,串成一条链来做校验
这里,我将采用基于数据库配置方案来封装基本框架,建立三张表来建立关系
建立一种场景
SELECT * FROM rule.rm_sence;
根据场景code,找出校验链
SELECT t1.* FROM
rule.rm_rule t1, rule.rm_rule_sence_rel t2, rule.rm_sence t3 where
t2.rule_id = t1.id
and t2.sence_id = t3.id and t3.`code` = 'ADD_OFFER';
编写核心处理逻辑
通过读取数据库配置,加载处理链
List<RmRule> rmRules = rmRuleMapper.getRmRulesByBusiCode(busiCode);
if (rmRules != null) {
for (RmRule rmRule : rmRules) {
String clazz = rmRule.getClazz();
try {
Class<?> forName = Class.forName(clazz);
Object instance = SpringContextUtils.getBean(forName);
if (instance instanceof Command) {
Command rule = (Command) instance;
chain.addRule(rule);
}
} catch (ClassNotFoundException e) {
logger.error("加载异常处理链失败, 当前异常信息:{}", e.getMessage());
continue;
}
}
}
对外提供统一的暴露方法
@Service
public class RuleOperateServiceImpl implements IRuleOperateService {
@Autowired
private RuleBootstrap bootstrap;
@Override
public RuleResult checkRuleByCode(String ruleCode) {
RuleResponse doCheckRule = bootstrap.doCheckRule(ruleCode);
return doCheckRule.toRuleResult();
}
}
架构搭建
基于基于dubbo+zookeeper将web项目做垂直拆分的模块做优化,架构变为
需要使用到的工程
代码地址:https://github.com/dengjili/dubbo-demo
测试
编写三个与数据库对应的实现类
数据库
代码
@Component
public class IsOrderExist implements Rule {
@Autowired
private IOrderOperateService orderOperateService;
@Override
public boolean execute(Context context) throws Exception {
String result = orderOperateService.queryOrder("test");
// 这里主做服务调用,不做数据验证
if (result != null) {
}
return false;
}
}
@Component
public class IsScoreCount implements Rule {
@Autowired
private IScoreOperateService scoreOperateService;
@Override
public boolean execute(Context context) throws Exception {
String result = scoreOperateService.queryScore("test");
// 这里主做服务调用,不做数据验证
if (result != null) {
}
return false;
}
}
@Component
public class IsUserExist implements Rule {
@Autowired
private IUserOperateService userOperateService;
@Override
public boolean execute(Context context) throws Exception {
String result = userOperateService.queryUser("test");
// 这里主做服务调用,不做数据验证
if (result != null) {
}
return false;
}
}
入口代码
@RequestMapping("/check")
public ModelAndView check() {
ModelAndView mv = new ModelAndView();
RuleResult result = ruleOperateService.checkRuleByCode("ADD_OFFER");
mv.addObject("code", result.getCode());
mv.addObject("message", result.getMessage());
mv.setViewName("check");
return mv;
}
输入测试地址
校验成功
修改测试类,抛出业务异常
@Component
public class IsUserExist implements Rule {
@Autowired
private IUserOperateService userOperateService;
@Override
public boolean execute(Context context) throws Exception {
String result = userOperateService.queryUser("test");
// 这里主做服务调用,不做数据验证
if (result != null) {
}
RuleExceptionUtils.throwException(RuleConstantEnum.EXCEPTION_ORDER_001);
return false;
}
}
重启规则中心
完成基本框架功能
根据数据库配置规则链
删除数据库中刚出现异常的检验数据,IsUserExist
再次刷新页面,完成动态扩展功能