为了账号安全,请及时绑定邮箱和手机立即绑定

Sentinel+Nacos限流规则持久化实战教程

概述

本文介绍了如何将Sentinel的限流规则持久化到Nacos中,首先讲解了Sentinel和Nacos的基本概念和安装步骤,然后详细说明了如何配置Sentinel使用Nacos作为数据源,并通过代码示例展示了如何实现限流规则的存储和读取,确保了Sentinel+Nacos限流规则持久化的顺利进行。

引入Sentinel和Nacos

Sentinel 是阿里巴巴开源的一款轻量级、高性能的Java分布式服务保护框架,提供流量控制、熔断降级、系统负载保护等功能。Sentinel 提供了一个简单易用的控制台,能够直观地展示实时监控以及保护规则定义,设计理念是保持简洁,通过简单、易懂、高性能的原语,为企业级分布式系统提供强大的流量控制和防护能力。

Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台,提供了服务发现、配置管理和服务管理三大功能。其中服务发现和负载均衡支持Dubbo、Spring Cloud、gRPC等多种开发框架,能够帮助微服务架构中的服务实现动态配置管理、服务发现和服务健康监测等功能。

安装Sentinel和Nacos的步骤

安装Sentinel

Sentinel 本身是一个Java库,可以通过Maven或Gradle添加到您的Java项目中。以下是使用Maven安装的示例:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-netty</artifactId>
    <version>1.8.4</version>
</dependency>

安装完成后,您可以启动Sentinel控制台。控制台是一个Java Web应用,可以从GitHub下载源码并编译,或者直接下载预编译的war包部署在Tomcat等Web容器中。

安装Nacos

Nacos 提供了多种安装方式,如使用Docker、编译源代码或直接下载预编译的war包。以下以下载war包为例:

  1. 下载最新的Nacos版本的war包。
  2. 将war包部署到Tomcat或其他Java应用服务器上。
  3. 启动Tomcat,Nacos的服务会自动启动。
  4. 访问http://localhost:8848/nacos/,使用默认账号密码nacos/nacos登录Nacos控制台。
配置Sentinel限流规则

创建Sentinel控制台

创建Sentinel控制台需要启动控制台的Web应用。如果您是从源码编译的,可以使用如下命令启动:

mvn clean install
cd sentinel-dashboard
mvn exec:java -Dexec.mainClass=com.alibaba.csp.sentinel.dashboard.SentinelDashboardApplication

如果您使用的是预编译的war包,可以将其部署到Tomcat或其他Java应用服务器。

添加和测试简单的限流规则

创建限流规则后,可以在Sentinel控制台中进行规则配置和测试。假设您已经部署了一个Web服务,并且想对其访问进行限流保护。

  1. 打开Sentinel控制台,登录进入控制台。
  2. 在左侧菜单中选择“规则管理” -> “流控规则”,然后点击“添加流控规则”按钮。
  3. 在弹出的窗口中,填写规则相关信息。例如,可以设置资源为/api/user,选择流控模式为“链路模式”,设置QPS阈值为5。
  4. 点击保存按钮,保存新的限流规则。
  5. 为了验证设定的限流规则,可以使用工具(如Postman)请求您的Web服务的/api/user接口,观察请求是否被限流。
将限流规则存储到Nacos中

要在Sentinel中使用Nacos作为数据源,需要实现Sentinel的指定接口。以下是配置步骤:

配置Sentinel使用Nacos作为数据源

  1. 分别配置好Nacos的地址、命名空间、dataId、group等信息。
  2. 在Sentinel控制台上配置Nacos数据源,可以在Sentinel控制台的“规则管理” -> “数据源管理”页面中添加一个新的Nacos数据源。
  3. 配置完成后,控制台将自动从Nacos中读取限流规则并应用到系统中。

存储和读取限流规则到Nacos

要将限流规则存储到Nacos中,需要实现相应的接口,并在Sentinel控制台中配置Nacos作为数据源。以下是Nacos的存储配置示例:

  1. 配置Nacos的配置信息:在application.propertiesapplication.yml中,配置Nacos的地址、命名空间、dataId、group等信息。

    spring:
     application:
       name: sentinel-dashboard
    nacos:
     server-addr: 127.0.0.1:8848
     namespace: 你的namespace
     dataId: sentinel-rules
     group: DEFAULT_GROUP
  2. 实现Rule Nacos持久化接口:实现FlowRuleStoreFlowRulePublisher接口,将规则存储到Nacos中。

    import com.alibaba.csp.sentinel.cluster.sharerule.flow.FlowRuleStore;
    import com.alibaba.csp.sentinel.cluster.sharerule.flow.FlowRulePublisher;
    import com.alibaba.csp.sentinel.cluster.sharerule.flow.FlowRuleStorage;
    import com.alibaba.csp.sentinel.datasource.WritableDataSource;
    import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.Properties;
    
    @Configuration
    public class NacosConfig {
    
       @Autowired
       private NacosDataSource nacosDataSource;
    
       @Bean
       public FlowRuleStore flowRuleStore() {
           return new FlowRuleStore() {
               @Override
               public void loadRules(FlowRuleManager manager) {
                   Properties properties = new Properties();
                   properties.put("serverAddr", nacosDataSource.getServerAddr());
                   properties.put("namespace", nacosDataSource.getNamespace());
                   properties.put("dataId", nacosDataSource.getDataId());
                   properties.put("group", nacosDataSource.getGroup());
                   properties.put("appName", nacosDataSource.getAppName());
                   WritableDataSource<String> writableDataSource = new NacosDataSource<>(properties, object -> {
                       if (object != null && !object.isEmpty()) {
                           manager.loadRules(object);
                       }
                   }, "sentinel.rules");
               }
           };
       }
    
       @Bean
       public FlowRulePublisher flowRulePublisher() {
           return new FlowRulePublisher() {
               @Override
               public void publish(FlowRuleManager manager) {
                   manager.saveRules();
               }
           };
       }
    
       @Bean
       public CommandLineRunner start(FlowRuleStore flowRuleStore) {
           return args -> {
               flowRuleStore.loadRules(FlowRuleManager.getInstance());
           };
       }
    
    }
  3. 配置Nacos数据源:在Sentinel控制台中添加新的Nacos数据源,并配置Nacos的地址、命名空间、dataId、group等信息。
Nacos限流规则持久化实现细节

解释持久化流程

当Sentinel控制台中的限流规则发生变化时,Sentinel会调用自定义的持久化接口将规则保存到Nacos。Nacos将这些规则保存到其内部的存储中(通常是一个MySQL数据库),从而实现了规则的持久化。当Sentinel控制台启动时,它会从Nacos中读取最新的规则并加载到内存中进行管理。

手动添加和编辑Nacos中的限流规则

要手动添加或编辑Nacos中的限流规则,可以通过Nacos控制台进行操作。以下是具体步骤:

  1. 前往Nacos控制台并登录。
  2. 在左侧菜单中选择“配置管理”,然后找到对应的dataId
  3. 编辑对应的配置内容以添加或修改规则。
  4. 保存更改并返回Sentinel控制台,验证规则已经被正确加载。
应用程序中的Sentinel+Nacos集成

代码集成示例

应用程序需要引入Sentinel和Nacos客户端的依赖,并配置Nacos的数据源。以下是Spring Boot应用程序的代码集成示例:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-netty</artifactId>
    <version>1.8.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

application.yml中配置Nacos的数据源:

spring:
  cloud:
   nacos:
      config:
         server-addr: 127.0.0.1:8848
         namespace: 你的namespace
         group: DEFAULT_GROUP
         dataId: sentinel-rules

然后在应用程序代码中使用Sentinel API:

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {

    @Autowired
    private FlowRuleStore flowRuleStore;

    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleException")
    public String hello() {
        return "Hello World";
    }

    public String handleException(BlockException ex) {
        return "Blocked by Sentinel";
    }
}

测试持久化效果

启动您的应用程序和Sentinel控制台,确保它们都能正确读取规则。

  1. 在Nacos控制台中编辑配置,添加或修改Sentinel规则。
  2. 保存更改,然后在Sentinel控制台中刷新规则。
  3. 访问您的应用程序,观察是否按照新的规则进行限流。
注意事项和常见问题

常见问题解答

  1. Sentinel控制台没有显示规则:检查是否正确配置了Nacos数据源,并确保Nacos中存储的规则信息是正确的。
  2. 规则没有生效:确保Sentinel控制台已经正确读取了规则,并且应用程序已正确启动。
  3. 规则更新不及时:检查Nacos和Sentinel的连接配置,确保它们之间的通信正常。

持久化中的注意事项

  1. 数据一致性:确保Sentinel控制台和Nacos之间的数据一致性,防止由于网络或配置错误导致规则丢失或不一致。
  2. 规则变更策略:在生产环境中,规则变更应该通过Nacos控制台或脚本进行,避免直接修改Nacos的数据存储。
  3. 监控和报警:设置监控和报警机制,当规则变更或应用失败时能够及时发现和处理问题。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消