返回

Sentinel双向通信:告别规则丢失,尽享稳定监控体验

后端

Sentinel 与 Nacos:实现分布式限流的持久化

背景

在分布式系统中,实时监控和限制服务访问至关重要。Sentinel 是一款开源工具,可以帮助我们实现这些目标。然而,默认情况下,Sentinel 将配置规则存储在内存中,这可能会导致重启后配置丢失。

Nacos 是一个分布式配置中心,可以为微服务提供服务注册、配置管理和动态 DNS 服务。通过将 Sentinel 与 Nacos 集成,我们可以将配置规则持久化存储,提高 Sentinel 的可用性。

Sentinel 源码改造

要实现 Sentinel 和 Nacos 的双向通信,我们需要对 Sentinel 源码进行改造。具体来说,我们需要集成 Nacos 客户端并添加代码,以便 Sentinel 可以将配置规则存储到 Nacos 中。

Nacos 中创建 Sentinel 配置规则

在 Nacos 中,Sentinel 配置规则由名称、内容和生效范围组成。我们可以通过 Dashboard 界面或 Nacos API 创建、修改和删除这些规则。

Dashboard 中管理 Sentinel 配置规则

Dashboard 是 Sentinel 的可视化管理界面。它允许我们查看、管理和启停 Sentinel 配置规则。通过 Dashboard,我们可以轻松地对规则进行更改并查看其执行情况。

Sentinel 与 Nacos 双向通信的优势

  • 持久化存储: 配置规则存储在 Nacos 中,避免了重启后丢失。
  • 集中化管理: 通过 Dashboard,我们可以集中管理 Sentinel 规则,提高效率。
  • 提高可用性: 即使 Dashboard 宕机,Sentinel 仍可继续工作,提高可用性。

示例代码

下面是一个示例代码,演示如何将 Sentinel 配置规则存储到 Nacos 中:

import com.alibaba.cloud.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.cloud.sentinel.datasource.nacos.NacosProperties;
import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.init.InitExecutor;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.util.ConverterUtil;
import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Bean
  public ReadableDataSource<List<FlowRule>> flowRuleDataSource() {
    NacosProperties nacosProperties = new NacosProperties();
    nacosProperties.setServerAddr("127.0.0.1:8848");
    nacosProperties.setGroupId("DEFAULT_GROUP");
    nacosProperties.setDataId("sentinel-flow-rules");

    NacosDataSource<List<FlowRule>> dataSource = new NacosDataSource<>(nacosProperties);
    dataSource.setConverter(new Converter<String, List<FlowRule>>() {
      @Override
      public List<FlowRule> convert(String source) {
        return ConverterUtil.convert(source, FlowRule.class);
      }
    });

    return dataSource;
  }

  @Bean
  public InitExecutor initFlowRuleManager() {
    return () -> FlowRuleManager.register2Property(flowRuleDataSource());
  }
}

结论

通过改造 Sentinel 源码,我们成功实现了 Sentinel 与 Nacos 的双向通信。这种集成提高了 Sentinel 的可用性和配置管理的便利性,为分布式限流提供了更强大的解决方案。

常见问题解答

  1. 如何判断 Sentinel 是否已连接到 Nacos?
    通过检查 Nacos 控制台或 Sentinel 日志,查看 Sentinel 是否正在读取配置规则。

  2. 如何修改 Sentinel 配置规则生效范围?
    通过 Nacos 界面或 API,编辑配置规则的 dataIdgroupId 属性。

  3. Sentinel 与 Nacos 集成后,如何升级 Sentinel?
    升级 Sentinel 时,需要同时升级 Sentinel 和 Nacos 客户端依赖项。

  4. Nacos 宕机后,Sentinel 还能正常工作吗?
    是的,Sentinel 仍可继续工作,但无法获取最新的配置规则。

  5. Sentinel 与 Nacos 集成后,是否有其他需要考虑的安全隐患?
    是的,需要确保 Nacos 服务器安全,并对访问 Sentinel 配置规则进行授权。