Sentinel [Feature] Support setting the universal default rule for all resources

qmelpv7a  于 2021-11-29  发布在  Java
关注(0)|答案(19)|浏览(376)

据了解,目前的规则只能针对某个资源进行设置。希望提供支持全局规则设置,或资源名可通配符表达。
应用场景:所有资源默认错误率达到多少自动降级,有特殊需求的资源另外设置。

0ve6wy6x

0ve6wy6x16#

我觉得这相当于给每个资源的降级规则的加载和生效增加了层级和优先级关系。
规则加载:

**1、每个资源都默认加载全局配置的降级规则。

2、每个资源有单独的用户降级规则配置。**

生效规则:

**(1) 把加载的全局配置失效掉,只保留的单独配置。

(2) 继续保留全局配置,并且生效,但优先校验用户配置。**

同时在这里我提一些关于全局配置的一些想法:

**1、每个类型的全局规则配置应有且只有一个。

2、支持持久化
3、全局规则配置可存放在对应的Manager中,加一个新的静态属性标注。
4、增加一个配置开关,控制是否开启全局规则配置,兼容旧逻辑,默认是关闭状态。
5、dashboard开辟一个新的配置页面,专门配置全局规则。**

如何实现:
我的理解应该是不用做在sentinel-extension里面,在对应规则的Manager里面进行管理就可以了。因为这更贴近于规则管理的范畴

j9per5c4

j9per5c417#

我在想能不能这个降级规则加入类似于分组的这种概念,不同服务的的降级业务处理一般来说都是不同的,但是不排除存在某部分的业务他们的降级处理业务大同小异,那么它们的降级服务便可以纳入一个奖及服务分组,而这个分组的代码只需要在一处维护,不同的服务可以动态的去选择某个分组作为自己默认的服务降级处理方式,当然也是可以实现自己特有的服务降级逻辑。 也不知道这种想法现不现实、可不可行。

vaj7vani

vaj7vani18#

It's inappropriate to set default rules in sentinel-core, instead, let some kind of sentinel-extension do this work could be considered.

lvmkulzt

lvmkulzt19#

目前规则与统计插槽(ClusterBuilderSlot)是强关系……针对这样设计,我认为可以以这种方式实现(改动最小):复制全局规则以初始化某资源规则。经过我初步测试是可行的。以下是我修改DegradeRuleManager.checkDegrade()的代码,供参考:

/修改支持全局规则 - shenjian/
private static final String GLOBAL = "*";

public static void checkDegrade(ResourceWrapper resource, Context context, DefaultNode node, int count) throws BlockException {
	if (degradeRules == null) {
		return;
	}
	List<DegradeRule> rules = getRules(resource.getName());
	if (rules == null) {
		return;
	}
	for (DegradeRule rule : rules) {
		if (!rule.passCheck(context, node, count)) {
			throw new DegradeException(rule.getLimitApp());
		}
	}
}

private static List<DegradeRule> getRules(String resourceName) {
	List<DegradeRule> rules = degradeRules.get(resourceName);
	if (rules != null) {
		return rules;
	}
	rules = degradeRules.get(GLOBAL);
	if (rules == null || rules.isEmpty()) {
		return null;
	}
	// 使用全局规则初始化资源规则
	rules = copyRules(rules, resourceName);
	List<DegradeRule> rules2 = degradeRules.putIfAbsent(resourceName, rules);
	if (rules2 != null && !rules2.equals(rules)) {// 没有添加成功:规则已存在
		return rules2;
	}
	return rules;
}

private static List<DegradeRule> copyRules(List<DegradeRule> rules, String newResourceName) {
	List<DegradeRule> list = new ArrayList<DegradeRule>(rules.size());
	for (DegradeRule rule : rules) {
		list.add(copyRule(rule, newResourceName));
	}
	return list;
}

private static DegradeRule copyRule(DegradeRule rule, String newResourceName) {
	DegradeRule newRule = new DegradeRule();
	newRule.setResource(newResourceName);
	newRule.setCount(rule.getCount());
	newRule.setGrade(rule.getGrade());
	newRule.setLimitApp(rule.getLimitApp());
	newRule.setTimeWindow(rule.getTimeWindow());
	return newRule;
}

相关问题