返回

从细节入手探究微服务架构之Sentinel数据双向同步(下)

后端

我们已经完成了后端代码中配置类和规则交互层的源码改造,现在需要改造后端代码中的规则控制层:

③ 修改规则控制层

FlowRuleManager 类是规则控制层,是Sentinel实现动态规则管理的核心组件。它负责规则的持久化、加载和生效。Sentinel会把FlowRule持久化到数据库中,FlowRuleManager通过调用数据库来加载FlowRule,然后调用 RuleManager.loadRules(FlowRule) 方法把FlowRule转换为Rule实体,再调用 RuleManager.addRule 方法把Rule实体添加到内存规则列表中。

FlowRuleManager 类中的方法 addFlowRuleremoveFlowRule 方法的内部逻辑修改如下:

public static void addFlowRule(FlowRule flowRule) {
    if (flowRule == null) {
        return;
    }
    FlowRuleEntity flowRuleEntity = FlowRuleEntity.fromFlowRule(flowRule);
    flowRuleService.addOrUpdateFlowRule(flowRuleEntity);
    FlowRule flowRule1 = flowRuleEntity.toFlowRule();
    Rule rule = RuleManager.loadRule(flowRule1);
    RuleManager.addRule(rule);
}

public static void removeFlowRule(String flowRuleId) {
    if (StringUtils.isEmpty(flowRuleId)) {
        return;
    }
    flowRuleService.deleteFlowRule(Long.parseLong(flowRuleId));
    RuleManager.removeRule(flowRuleId);
}

上述代码中,首先将 FlowRule 实体转换为 FlowRuleEntity 实体,并调用 flowRuleServiceaddOrUpdateFlowRule 方法把 FlowRuleEntity 实体持久化到数据库中。然后将 FlowRuleEntity 实体转换为 FlowRule 实体,并调用 RuleManager.loadRule(FlowRule) 方法把 FlowRule 实体转换为 Rule 实体,最后调用 RuleManager.addRule 方法把 Rule 实体添加到内存规则列表中。

删除规则时,首先调用 flowRuleServicedeleteFlowRule 方法从数据库中删除 FlowRuleEntity 实体,然后调用 RuleManager.removeRule 方法从内存规则列表中删除 Rule 实体。

到此,Sentinel的数据双向同步方案的改造已全部完成。

Sentinel的数据双向同步方案的优势和局限性

  • 优势:

    • 实时性高:Sentinel的数据双向同步方案可以保证规则在后台配置之后,可以在很短的时间内生效,从而保证了系统的稳定性和可靠性。
    • 易于使用:Sentinel的数据双向同步方案很容易使用,只需要在后台配置好规则即可,不需要额外的开发工作。
    • 可扩展性强:Sentinel的数据双向同步方案可以很容易地扩展到更多的服务器上,从而满足业务的需要。
  • 局限性:

    • 依赖于数据库:Sentinel的数据双向同步方案依赖于数据库,如果数据库出现故障,那么规则的同步就会受到影响。
    • 性能开销:Sentinel的数据双向同步方案会带来一定的性能开销,因为需要不断地从数据库中加载规则。

总体来说,Sentinel的数据双向同步方案是一个非常实用的方案,可以帮助我们快速地实现规则的动态管理,从而保证系统的稳定性和可靠性。