从细节入手探究微服务架构之Sentinel数据双向同步(下)
2024-02-14 20:31:30
我们已经完成了后端代码中配置类和规则交互层的源码改造,现在需要改造后端代码中的规则控制层:
③ 修改规则控制层
FlowRuleManager
类是规则控制层,是Sentinel实现动态规则管理的核心组件。它负责规则的持久化、加载和生效。Sentinel会把FlowRule持久化到数据库中,FlowRuleManager
通过调用数据库来加载FlowRule,然后调用 RuleManager.loadRules(FlowRule)
方法把FlowRule转换为Rule实体,再调用 RuleManager.addRule
方法把Rule实体添加到内存规则列表中。
将 FlowRuleManager
类中的方法 addFlowRule
和 removeFlowRule
方法的内部逻辑修改如下:
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
实体,并调用 flowRuleService
的 addOrUpdateFlowRule
方法把 FlowRuleEntity
实体持久化到数据库中。然后将 FlowRuleEntity
实体转换为 FlowRule
实体,并调用 RuleManager.loadRule(FlowRule)
方法把 FlowRule
实体转换为 Rule
实体,最后调用 RuleManager.addRule
方法把 Rule
实体添加到内存规则列表中。
删除规则时,首先调用 flowRuleService
的 deleteFlowRule
方法从数据库中删除 FlowRuleEntity
实体,然后调用 RuleManager.removeRule
方法从内存规则列表中删除 Rule
实体。
到此,Sentinel的数据双向同步方案的改造已全部完成。
Sentinel的数据双向同步方案的优势和局限性
-
优势:
- 实时性高:Sentinel的数据双向同步方案可以保证规则在后台配置之后,可以在很短的时间内生效,从而保证了系统的稳定性和可靠性。
- 易于使用:Sentinel的数据双向同步方案很容易使用,只需要在后台配置好规则即可,不需要额外的开发工作。
- 可扩展性强:Sentinel的数据双向同步方案可以很容易地扩展到更多的服务器上,从而满足业务的需要。
-
局限性:
- 依赖于数据库:Sentinel的数据双向同步方案依赖于数据库,如果数据库出现故障,那么规则的同步就会受到影响。
- 性能开销:Sentinel的数据双向同步方案会带来一定的性能开销,因为需要不断地从数据库中加载规则。
总体来说,Sentinel的数据双向同步方案是一个非常实用的方案,可以帮助我们快速地实现规则的动态管理,从而保证系统的稳定性和可靠性。