基于apache-commons-chain做校验链

方案

我们将我们的检验抽象成单独的节点,串成一条链来做校验
在这里插入图片描述

这里,我将采用基于数据库配置方案来封装基本框架,建立三张表来建立关系
在这里插入图片描述
建立一种场景

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

在这里插入图片描述
再次刷新页面,完成动态扩展功能
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值