返回

Sentinel 数据双向同步(3)——后端代码改造(下)

后端







# **后端代码改造(下)** 

## **修改规则控制层** 

前面已经修改了配置类和规则交互层的源码,下面修改后端代码中的规则控制层:

### **③ 修改规则控制层** 

在规则控制层,我们主要修改 `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() 方法来比较浮点数,避免了浮点数比较的缺陷。

测试改造后的代码

在改造了后端代码之后,我们可以通过以下步骤来测试改造后的代码:

  1. 启动 Sentinel 控制台。
  2. 在 Sentinel 控制台中创建一条限流规则。
  3. 在后端代码中调用限流接口。
  4. 观察 Sentinel 控制台中的统计数据。

如果限流规则生效,则 Sentinel 控制台中的统计数据应该会显示出限流的情况。

总结

通过对后端代码的改造,我们实现了 Sentinel 数据双向同步的功能。

在改造过程中,我们主要修改了配置类、规则交互层和规则控制层。

经过改造后的代码,可以实现 Sentinel 数据的双向同步,从而保证前后端限流规则的一致性。

希望本文能够帮助大家更好地理解和使用 Sentinel。