返回
Sentinel 数据双向同步(3)——后端代码改造(下)
后端
2023-11-04 08:52:12
# **后端代码改造(下)**
## **修改规则控制层**
前面已经修改了配置类和规则交互层的源码,下面修改后端代码中的规则控制层:
### **③ 修改规则控制层**
在规则控制层,我们主要修改 `com.alibaba.csp.sentinel.slots.block.flow.param.ParameterFlowRuleManager` 类。
```java
public class ParameterFlowRuleManager {
/**
* 根据参数的 index,判断该参数是否限流
*
* @param rule 限流规则
* @param index 参数的下标
* @param parameterMetricCounts 参数的指标信息,根据一定的规则,指定指标统计方式,比如按照普通的参数名,或者是根据一定的规则进行参数名组合,对统计指标进行区分
* @return true: 限流;false: 不限流
*/
public static boolean hasTrafficBlock(ParameterFlowRule rule, int index,
ParameterMetricCounts parameterMetricCounts) {
if (rule == null) {
return false;
}
// 解析参数的 QPS
// 这里是根据 index 从 parameterMetricCounts 中获取参数的 QPS
// 同时限流规则中,如果将均值作为阈值,则此处将 QPS 取平均值。
double qps = parameterMetricCounts.getQps(rule, index);
// 获取限流阈值
double count = rule.getCount();
// 与限流阈值进行比较,判断是否限流
// 阈值使用了 double,但此处的比较未使用浮点数的比较方式
// (Java 中,浮点数的比较有缺陷)
// 而使用了基于字节的比较方式
if (qps > count) {
return true;
}
return false;
}
}
原来的限流判断逻辑是这样的:
if (qps > count) {
return true;
}
我们将它修改为:
if (Double.compare(qps, count) > 0) {
return true;
}
这样就使用了 Double.compare()
方法来比较浮点数,避免了浮点数比较的缺陷。
测试改造后的代码
在改造了后端代码之后,我们可以通过以下步骤来测试改造后的代码:
- 启动 Sentinel 控制台。
- 在 Sentinel 控制台中创建一条限流规则。
- 在后端代码中调用限流接口。
- 观察 Sentinel 控制台中的统计数据。
如果限流规则生效,则 Sentinel 控制台中的统计数据应该会显示出限流的情况。
总结
通过对后端代码的改造,我们实现了 Sentinel 数据双向同步的功能。
在改造过程中,我们主要修改了配置类、规则交互层和规则控制层。
经过改造后的代码,可以实现 Sentinel 数据的双向同步,从而保证前后端限流规则的一致性。
希望本文能够帮助大家更好地理解和使用 Sentinel。