基于apache-commons-chain做校验链

方案

我们将我们的检验抽象成单独的节点,串成一条链来做校验
基于apache-commons-chain做校验链_第1张图片

这里,我将采用基于数据库配置方案来封装基本框架,建立三张表来建立关系
基于apache-commons-chain做校验链_第2张图片
建立一种场景

SELECT * FROM rule.rm_sence;

基于apache-commons-chain做校验链_第3张图片

根据场景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';

基于apache-commons-chain做校验链_第4张图片

编写核心处理逻辑

通过读取数据库配置,加载处理链

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项目做垂直拆分的模块做优化,架构变为
基于apache-commons-chain做校验链_第5张图片
需要使用到的工程
基于apache-commons-chain做校验链_第6张图片

代码地址:https://github.com/dengjili/dubbo-demo

测试

编写三个与数据库对应的实现类

数据库
基于apache-commons-chain做校验链_第7张图片
代码
基于apache-commons-chain做校验链_第8张图片

@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;
	}

输入测试地址
基于apache-commons-chain做校验链_第9张图片
校验成功

修改测试类,抛出业务异常

@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;
	}
}

重启规则中心

基于apache-commons-chain做校验链_第10张图片

完成基本框架功能

根据数据库配置规则链

删除数据库中刚出现异常的检验数据,IsUserExist

基于apache-commons-chain做校验链_第11张图片
再次刷新页面,完成动态扩展功能
基于apache-commons-chain做校验链_第12张图片

你可能感兴趣的:(dubbo)