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

Sentinel+Nacos限流规则持久化教程:轻松入门与实战

概述

本文介绍了如何将Sentinel与Nacos结合,实现限流规则的动态管理和持久化存储。通过结合Sentinel和Nacos,可以轻松配置和管理限流规则,确保大规模分布式系统中的流量控制更加灵活高效。

Sentinel与Nacos简介
什么是Sentinel

Sentinel 是一款基于阿里巴巴开源的微服务保护框架,能够对流量进行实时监控和保护,提供熔断降级、流量控制、热点防护、系统负载保护等功能。Sentinel 的设计目标是提供简单易用、高性能、高可用的流量控制和保护能力,适用于各种微服务架构和系统。

什么是Nacos

Nacos 是一个动态服务发现、配置管理和服务管理平台,具备服务发现、服务健康检测、动态配置管理、服务分组管理等功能。Nacos 能够帮助企业实现微服务架构下的动态服务发现、配置管理和服务管理,简化微服务的开发、部署与运维。

Sentinel与Nacos结合的作用

结合 Sentinel 和 Nacos,可以实现限流规则的持久化存储。Sentinel 提供了丰富的限流、降级等功能,而 Nacos 提供了配置管理功能,通过将 Sentinel 的限流规则存储到 Nacos 中,可以实现限流规则的动态管理和持久化存储。这使得在大规模分布式系统中,限流规则的调整和管理变得更加灵活和高效。

环境搭建
安装并启动Nacos
  1. 下载 Nacos 安装包
    wget https://github.com/alibaba/Nacos/releases/download/2.0.3/zip/nacos-server-2.0.3.zip
  2. 解压安装包
    unzip nacos-server-2.0.3.zip
  3. 启动 Nacos 服务
    cd nacos/bin
    ./startup.sh -m standalone
安装并引入Sentinel依赖

在你的项目中,引入 Sentinel 的依赖。例如,在 Maven 项目中,可以在 pom.xml 文件中添加如下依赖:

<dependencies>
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-core</artifactId>
        <version>1.8.2</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
        <version>1.8.2</version>
    </dependency>
</dependencies>
配置Sentinel接入Nacos

在项目中配置 Sentinel 以接入 Nacos,可以通过编写配置文件实现。

import com.alibaba.csp.sentinel.datasource.ConfigService;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
public class SentinelNacosConfig {

    @Value("${nacos.server-addr}")
    private String nacosServerAddr;

    @Value("${nacos.namespace}")
    private String nacosNamespace;

    @Value("${nacos.group-id}")
    private String nacosGroupId;

    @Bean
    public InitFunc sentinelDataSourceInitFunc() {
        return new InitFunc() {
            @Override
            public void init() throws Exception {
                Properties properties = new Properties();
                properties.put("serverAddr", nacosServerAddr);
                properties.put("namespace", nacosNamespace);
                properties.put("group", nacosGroupId);
                String dataId = "sentinel_ds_" + nacosGroupId;
                NacosDataSource dataSource = new NacosDataSource(properties, dataId, "");
                ConfigService.setInstance(dataSource);
            }
        };
    }
}
基本限流规则配置
使用Sentinel控制台创建基本限流规则

在 Sentinel 控制台中,可以创建、查看和管理限流规则。例如,创建一个限流规则,限制一个接口每秒最多处理10个请求。

  1. 打开 Sentinel 控制台,进入规则配置页面。
  2. 选择资源类型,例如 API。
  3. 输入资源名称,例如 /order/create
  4. 设置请求频率限制,例如每秒允许的请求数为10。
测试限流规则的有效性

编写一个简单的测试程序来验证限流规则的有效性。

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;

public class TestRateLimit {
    public static void main(String[] args) {
        for (int i = 0; i < 15; i++) {
            try (Entry entry = SphU.entry("/order/create", SphU.Ops.INCR)) {
                System.out.println("Passed limit: " + i);
            } catch (BlockException e) {
                System.out.println("Blocked: " + i);
            }
        }
    }
}

运行这个程序,验证当请求超过每秒10次限制时,程序会抛出 BlockException 异常,表示请求被限流。

在Controller中使用Sentinel进行限流
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;

@RestController
public class OrderController {

    @SentinelResource(value = "order.create", blockHandler = "handleBlock")
    public void createOrder() {
        // 创建订单逻辑
    }

    public void handleBlock(BlockException e) {
        // 处理被限流的逻辑
    }
}
限流规则持久化配置
启用Sentinel规则持久化功能

在 Sentinel 配置文件中启用规则持久化功能。

# sentinel.properties
sentinel.datasource.nacos.dataid=sentinel_ds
sentinel.datasource.nacos.namespace=public
sentinel.datasource.nacos.server-addr=127.0.0.1:8848
sentinel.datasource.nacos.group-id=DEFAULT_GROUP
在Nacos中配置持久化规则

在 Nacos 控制台中创建一个数据源配置,用于存储和管理 Sentinel 的限流规则。

  1. 打开 Nacos 控制台。
  2. 在配置管理页面,选择 public 命名空间。
  3. 创建一个新的配置,配置 ID 为 sentinel_ds,配置内容为空字符串 {}
验证持久化规则是否生效

在 Sentinel 控制台中修改限流规则,然后查看 Nacos 中的数据源配置,验证规则是否已经被持久化到 Nacos 中。

  1. 修改 Sentinel 控制台中的限流规则。
  2. 查看 Nacos 中 sentinel_ds 配置内容,确认规则已经更新。
实际案例演示
构建一个简单的服务限流场景

假设我们有一个订单系统,需要限制订单创建接口的请求频率。

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;

@RestController
public class OrderController {

    @SentinelResource(value = "order.create", blockHandler = "handleBlock")
    public void createOrder() {
        // 创建订单逻辑
    }

    public void handleBlock(BlockException e) {
        // 处理被限流的逻辑
    }
}
使用Nacos持久化限流规则

在 Nacos 中配置持久化限流规则,确保规则在重启后仍然有效。

  1. 在 Sentinel 控制台中创建限流规则。
  2. 在 Nacos 中配置持久化数据源,存储规则。
调整并测试规则的有效性和持久性

调整限流规则,例如将每秒限制请求次数调整为15,然后测试规则的持久性。

  1. 修改限流规则。
  2. 重启服务,验证规则是否仍然有效。
验证持久性
public class TestRateLimit {
    public static void main(String[] args) {
        for (int i = 0; i < 15; i++) {
            try (Entry entry = SphU.entry("/order/create", SphU.Ops.INCR)) {
                System.out.println("Passed limit: " + i);
            } catch (BlockException e) {
                System.out.println("Blocked: " + i);
            }
        }
    }
}
常见问题与解答
常见错误及解决方案
  1. Nacos 无法连接

    • 检查 Nacos 服务是否正常启动。
    • 配置文件中的 Nacos 地址是否正确。
    • 确认防火墙规则是否允许连接。
  2. Sentinel 限流规则未生效

    • 重新启动 Sentinel 服务。
    • 检查 Nacos 数据源配置是否正确。
    • 确保 Sentinel 依赖已经正确引入。
  3. Nacos 数据丢失

    • 重新创建数据源配置。
    • 检查 Nacos 服务是否正常。
  4. Sentinel 控制台无法访问
    • 确认 Sentinel 控制台服务是否正常启动。
    • 检查防火墙规则是否允许访问控制台端口。
常见问题FAQ
  1. Sentinel 限流规则的优先级如何确定?

    • Sentinel 限流规则的优先级由规则配置中的顺序决定,先配置的规则优先级较高。
  2. 如何查看当前的限流规则?

    • 通过 Sentinel 控制台查看当前的限流规则。
  3. 如何调整限流规则?

    • 在 Sentinel 控制台中修改限流规则,然后保存更改。
  4. 如何查看限流规则的持久化状态?

    • 通过查看 Nacos 中的数据源配置,确认规则是否已经持久化。
  5. 如何处理被限流的请求?

    • 可以在 handleBlock 方法中处理被限流的请求,例如返回友好提示信息。
  6. 如何在多节点环境中使用 Nacos?
    • 配置 Nacos 的集群模式,确保所有节点都能够访问同一个 Nacos 集群。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消