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

Sentinel+Nacos限流规则持久化学习入门

概述

本文将带你学习如何使用Sentinel+Nacos限流规则持久化,增强应用的稳定性和可管理性。通过Nacos,你可以轻松地将限流规则进行集中化管理和动态更新,以适应业务变化。文章详细介绍了环境搭建、规则配置以及实战演练,帮助你快速掌握相关技能。

Sentinel与Nacos简介
Sentinel概述

Sentinel 是阿里巴巴开源的一款流量控制组件,能够实时监控和保护微服务中的接口。它支持多种限流和流控模式,可在生产环境中有效防止过载导致的服务不可用。Sentinel 通过提供简单易用的 API 和直观的控制台界面,使得开发者能够快速地对业务系统进行防护。

Nacos概述

Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。Nacos 使服务发现、配置管理和服务管理变得更加容易,通过 Nacos,开发者可以集中管理应用的配置信息,实现配置的动态更新。此外,Nacos 还支持集群模式,具备高可用的特点。

Sentinel与Nacos的集成意义

Sentinel 与 Nacos 的集成,使得 Sentinel 的限流规则可以从内存走向持久化存储,增强了应用的稳定性和可管理性。通过 Nacos,开发者可以将限流规则配置集中化管理,并且可以进行动态更新。这样,当业务发生变化时,开发者可以更高效地调整限流策略,而无需重启应用。

环境搭建
Sentinel环境搭建

为了使用 Sentinel,你首先需要完成它的环境搭建。这里介绍两种方式:使用 Maven 依赖来引入 Sentinel,或者单独下载 Sentinel 并将其添加到项目中。

方式一:Maven 依赖

在你的项目中添加如下 Maven 依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.8.RELEASE</version>
</dependency>

方式二:下载并引入JAR包

Sentinel 官方 GitHub 仓库 下载所需的 JAR 包,并将这些 JAR 包加入到你的项目构建路径中。

Nacos环境搭建

Nacos 的环境搭建主要包括两个步骤,一是下载 Nacos,二是启动 Nacos。

下载Nacos

到 Nacos 的 GitHub 仓库下载适合你环境的版本:

wget https://github.com/alibaba/Nacos/releases/download/2.0.3/nacos-server-2.0.3.tar.gz

启动Nacos

下载完成后,解压 Nacos 压缩包,并在命令行中执行启动命令:

cd nacos/bin
sh startup.sh -m standalone

启动完成后,你应该可以在浏览器中访问 http://localhost:8848/nacos 进行配置管理。

安装与配置Sentinel Dashboard

为了能够可视化地管理和观察限流规则,你需要安装并配置 Sentinel Dashboard。

下载并启动Dashboard

下载并启动 Sentinel Dashboard,同样可以从 GitHub 仓库中获取合适的版本。

wget https://github.com/alibaba/Sentinel/releases/download/1.8.1/sentinel-dashboard-1.8.1.jar
java -jar sentinel-dashboard-1.8.1.jar --server.port=8080

配置Dashboard

访问 http://localhost:8080 来启动 Sentinel Dashboard,确保所有配置符合你的项目需求。

配置Sentinel与Nacos的集成

为了使 Sentinel 能够与 Nacos 进行通信,需要在应用中配置 Nacos 数据源。

添加Nacos配置

application.propertiesapplication.yml 文件中添加如下配置:

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

在代码中添加DataSource

你需要在代码中添加 Nacos 数据源配置:

import com.alibaba.csp.sentinel.datasource.FileRefreshService;
import com.alibaba.csp.sentinel.datasource.NacosDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class NacosConfig implements InitFunc {
    @Override
    public void init() throws Exception {
        NacosDataSource nacosDataSource = new NacosDataSource(
            "localhost",
            8848,
            "sentinel_rules",
            (namespace, dataId, group, json) -> {
                List<FlowRule> rules = new Gson().fromJson(json, new TypeToken<List<FlowRule>>(){}.getType());
                FlowRuleManager.loadRules(rules);
            }
        );
    }
}
基础限流规则介绍
什么是限流规则

限流规则定义了对流量进行限制的策略,可以保护系统免于过载。常见的限流策略包括基于请求速率的限流,基于资源的限流等。

Sentinel支持的限流模式

Sentinel 支持四种限流模式:

  1. QPS:每秒请求数量
  2. 并发线程数:同一时间处理的线程数
  3. 请求入队:请求进入队列等待处理
  4. 关联资源:通过关联规则实现复杂的流量控制
通过Sentinel Dashboard添加限流规则

打开 Sentinel Dashboard,选择进入限流规则界面,输入规则详情,包含资源名、阈值类型、阈值等信息。点击保存,即可将规则应用到 Sentinel 中。

示例代码

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

@RestController
public class UserController {
    @GetMapping("/user")
    @SentinelResource(value = "getUserById", blockHandler = "handleBlock")
    public String getUserById() {
        // 处理业务逻辑
        return "User information";
    }

    public String handleBlock(BlockException e) {
        return "请求被限流了!";
    }
}
观察限流规则的效果

通过发送模拟请求到被限流的资源,观察请求是否被限流。可以通过控制台查看限流规则的执行情况,确保规则生效。

限流规则持久化
持久化的意义

持久化规则可以使限流策略在重启后仍然有效,方便运维人员集中管理规则配置,并支持动态调整。

利用Nacos进行限流规则持久化

为了实现限流规则的持久化,你需要将规则数据存储到 Nacos 中,并确保 Sentinel 能够读取并应用这些规则。

在Nacos中创建配置

在 Nacos 控制台创建一个配置文件,例如 sentinel_rules.json,写出初始的限流规则 JSON 格式数据。

[
    {
        "resource": "example",
        "count": 1,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": 0
    }
]

配置Sentinel读取Nacos数据

在 Sentinel 配置文件中添加 Nacos 数据源,设置 Nacos 数据源的 URL 和数据 ID。

import com.alibaba.csp.sentinel.datasource.NacosDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class NacosConfig implements InitFunc {
    @Override
    public void init() throws Exception {
        NacosDataSource nacosDataSource = new NacosDataSource(
            "localhost",
            8848,
            "sentinel_rules",
            (namespace, dataId, group, json) -> {
                List<FlowRule> rules = new Gson().fromJson(json, new TypeToken<List<FlowRule>>(){}.getType());
                FlowRuleManager.loadRules(rules);
            }
        );
    }
}
修改持久化规则并观察效果

在 Nacos 控制台上修改 sentinel_rules.json 文件中的规则内容,观察新的规则是否生效。可以通过发送测试请求验证限流规则的变化。

实战演练
实际项目中的限流规则配置

在实际项目中,你需要根据业务需求来设计限流规则。例如,限制用户访问相关接口的频率,或者限制某个接口的并发请求数量。以下是一个简单的示例,限制某个 API 每秒最多处理 10 个请求。

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

@RestController
public class UserController {
    @GetMapping("/user")
    @SentinelResource(value = "getUserById", blockHandler = "handleBlock")
    public String getUserById() {
        // 处理业务逻辑
        return "User information";
    }

    public String handleBlock(BlockException e) {
        return "请求被限流了!";
    }
}

复杂限流规则示例

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

@RestController
public class ComplexController {
    @GetMapping("/complex")
    @SentinelResource(value = "getComplexData", blockHandler = "handleComplexBlock")
    public String getComplexData() {
        // 复杂业务逻辑
        return "Complex data";
    }

    public String handleComplexBlock(BlockException e) {
        return "复杂请求被限流了!";
    }
}
通过Nacos更新限流规则并实时监控

在 Nacos 控制台中更新 sentinel_rules.json 文件中的规则,然后发送请求到对应的接口观察效果。此时,规则的变化应该立即生效。

遇到的问题及解决方法

在实际操作过程中可能会遇到一些问题,比如 Nacos 数据源配置错误、规则格式不正确等。解决这些问题通常需要检查配置文件,并确保规则格式符合 JSON 标准。如果遇到错误,可以参考 Sentinel 和 Nacos 的官方文档进行排查。

总结与展望
学习总结

通过本教程,你应该已经掌握了使用 Sentinel 和 Nacos 实现限流规则持久化的基础方法。限流规则的持久化可以使运维人员更方便地集中管理和调整限流策略,从而确保服务的稳定和高效运行。

Sentinel+Nacos未来发展方向

未来,Sentinel 和 Nacos 可能会结合更多的功能,例如更精细的流量控制策略、更丰富的监控指标等。同时,它们也会支持更多的云原生技术,使得微服务治理更加灵活和高效。

学习资源推荐
  • 慕课网 提供了大量的在线学习资源,涵盖了从基础到高级的各种编程技能,非常适合进行深入学习。
  • Sentinel 官方文档Nacos 官方文档 都提供了详细的使用指南和示例代码,是深入了解这两个工具的绝佳资源。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消