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

Sentinel+Nacos限流规则持久化学习指南

概述

本文详细介绍了如何利用Sentinel+Nacos限流规则持久化学习,涵盖了Sentinel的流量控制、熔断降级、系统保护等功能,并通过Nacos实现限流规则的持久化配置。文中提供了详细的环境搭建、配置说明以及实战演练,帮助读者掌握该技术的实际应用。

Sentinel与Nacos简介
Sentinel核心概念

Sentinel 是一款针对微服务的高可用保护组件,主要功能包括流量控制、熔断降级、系统保护以及限流。Sentinel的核心在于流量控制,提供了包括链路、资源、规则在内的多种维度的流量控制方法。Sentinel的特点在于其轻量级的特性,不需要对业务代码进行大量的侵入式改动即可实现上述功能。Sentinel的配置与运行时可以通过Java的动态代理或AOP等技术来实现,减少对现有代码的影响。

流量控制

Sentinel 的流量控制功能包含定义和执行过程,包括多种策略,如基于请求的QPS限制,基于并发数的限制,以及基于系统负载(如CPU使用率)的限制。流量控制策略适用于不同的资源,例如服务、方法、HTTP请求等。

熔断降级

熔断降级机制在系统异常时允许部分服务调用失败,避免整个系统崩溃。当服务调用失败率达到一定阈值时,Sentinel会自动将该服务切换到"降级"状态,停止调用该服务,防止进一步的雪崩效应。

系统保护

系统保护是对整个系统的保护,包括限制CPU使用情况、限制单个线程的运行时间等。这些保护机制可以在系统负载过重时自动降低系统的负载,防止系统崩溃。

限流

Sentinel的限流功能限定从外部来的流量,防止过多流量涌入导致系统崩溃。Sentinel提供了多种限流策略,可以针对不同的资源进行限制。

Nacos核心概念

Nacos是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。Nacos支持动态配置和服务发现,实现服务间的动态配置和发现。Nacos的核心功能包括服务发现、配置管理、服务管理等。

服务发现

服务发现功能允许服务提供者和服务消费者之间自动进行连接。Nacos服务发现使用健康检查机制,确保连接的服务实例是健康的。

配置管理

Nacos的配置管理功能允许用户在不重启应用的情况下更新配置。配置可以是应用级别,也可以是环境级别。Nacos支持实时推送配置变更到各个客户端,支持多环境配置。

服务管理

Nacos的服务管理功能允许用户管理服务,包括服务的注册、注销、列表查看等功能。此外,Nacos还提供服务的健康检查、服务的动态路由等功能。

Sentinel与Nacos的集成意义

Sentinel与Nacos的集成在于Sentinel可以利用Nacos的配置管理功能实现限流规则的持久化。通过Nacos,可以将Sentinel的限流规则持久化到配置中心,实现规则的动态调整和实时查看。调整限流规则时,只需修改Nacos中的配置,无需重启应用即可生效。

准备工作
环境搭建

Java环境

Sentinel和Nacos均基于Java实现,需要安装Java环境,推荐使用Java 8或更高版本。

Maven环境

推荐使用Maven来管理项目依赖。确保已经安装了Maven,并正确配置了Maven环境变量。

IDE工具

推荐使用Eclipse或IntelliJ IDEA等IDE工具编写代码。

Sentinel、Nacos的安装与配置

Sentinel安装

pom.xml中添加Sentinel相关依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.2</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-slotallocator</artifactId>
    <version>1.8.2</version>
</dependency>

Nacos安装

下载Nacos的安装包,并按照官方文档安装。Nacos可以以单机模式或集群模式运行。官方文档有详细的安装指南。

配置Nacos的客户端连接:

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>2.0.3</version>
</dependency>
快速入门实例

接下来,创建一个简单的限流规则,并使用Nacos持久化。

创建一个简单的应用

创建一个新的Spring Boot项目,并引入Sentinel和Nacos的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.2</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-boot-starter</artifactId>
    <version>1.8.2</version>
</dependency>
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>2.0.3</version>
</dependency>

编写简单的限流规则

定义一个简单的限流规则,限制接口访问速率:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
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.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class SentinelRuleLoader implements CommandLineRunner {

    @Autowired
    private SentinelService sentinelService;

    @Override
    public void run(String... args) throws Exception {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource(sentinelService.getClass().getName());
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(2);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

使用Nacos进行限流规则的持久化

application.yml中配置Nacos的连接信息:

spring:
  cloud:
    sentinel:
      transport:
        serverPort: 8719
        dashboard: localhost:8080
  application:
    name: sentinel-nacos-demo
  nacos:
    server-addr: 127.0.0.1:8848
    namespace: your-namespace

在代码中使用NacosDataSourceProperty来读取和写入规则:

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Properties;

@Component
public class SentinelNacosConfig implements ApplicationRunner {

    @Value("${spring.cloud.sentinel.nacos.namespace}")
    private String namespace;

    @Value("${spring.cloud.sentinel.nacos.config.group}")
    private String group;

    @Value("${spring.cloud.sentinel.nacos.config.key}")
    private String key;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        ConfigService configService = new ConfigService("127.0.0.1:8848", namespace);
        String content = configService.getConfigInfo(key, group);
        if (content != null) {
            List<FlowRule> rules = new ArrayList<>();
            // 解析规则
            // rules = parseRulesFrom(content);
            FlowRuleManager.loadRules(rules);
        }

        configService.addListener(key, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                List<FlowRule> rules = new ArrayList<>();
                // 解析规则
                // rules = parseRulesFrom(configInfo);
                FlowRuleManager.loadRules(rules);
            }
        });
    }

    private List<FlowRule> parseRulesFrom(String content) {
        // 解析逻辑
        return new ArrayList<>();
    }
}
Sentinel限流规则介绍
流控规则详解

流控规则用于限制进入系统的流量。Sentinel提供了多种类型的流控规则,包括QPS规则和并发数规则。

QPS规则

QPS规则是指每秒钟允许通过的请求数量,通过设置每秒钟的最大请求数进行限制:

FlowRule rule = new FlowRule();
rule.setResource("HelloService");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(20);
rule.setLimitApp("default");
FlowRuleManager.loadRules(Arrays.asList(rule));

并发数规则

并发数规则是指同时允许的请求数量,通过设置最大并发数进行限制:

FlowRule rule = new FlowRule();
rule.setResource("HelloService");
rule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
rule.setCount(20);
rule.setLimitApp("default");
FlowRuleManager.loadRules(Arrays.asList(rule));
系统规则详解

系统规则用于基于系统负载进行保护,如CPU使用率、系统负载等。Sentinel提供了多种系统规则,包括系统规则和系统保护规则。

系统规则

系统规则可以保护整个系统的负载,如CPU使用率、系统负载等:

SystemRule systemRule = new SystemRule();
systemRule.setGrade(RuleConstant.STREAM_SYSTEM);
systemRule.setCount(100);
systemRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
SystemRuleManager.loadRules(Arrays.asList(systemRule));

系统保护规则

系统保护规则可以基于当前系统负载进行保护,如CPU使用率、系统负载等:

SystemRule systemRule = new SystemRule();
systemRule.setGrade(RuleConstant.STREAM_SYSTEM);
systemRule.setCount(100);
systemRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
SystemRuleManager.loadRules(Arrays.asList(systemRule));
接口规则详解

接口规则用于限制特定接口的访问。Sentinel提供了丰富的接口规则,包括接口规则和服务规则。

接口规则

接口规则可以限制特定接口的访问,如QPS限制、并发数限制等:

FlowRule rule = new FlowRule();
rule.setResource("HelloService");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(20);
rule.setLimitApp("default");
FlowRuleManager.loadRules(Arrays.asList(rule));

服务规则

服务规则可以限制特定服务的访问,如QPS限制、并发数限制等:

FlowRule rule = new FlowRule();
rule.setResource("HelloService");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(20);
rule.setLimitApp("default");
FlowRuleManager.loadRules(Arrays.asList(rule));
Nacos持久化功能介绍
Nacos持久化原理

Nacos持久化原理是指Nacos如何将配置信息持久化到数据库中。Nacos提供了多种持久化策略,包括内存持久化、MySQL持久化、MongoDB持久化等。内存持久化是将配置信息存储在内存中,速度快但重启后数据会丢失。MySQL持久化是将配置信息存储到MySQL数据库中,可以持久化但速度较慢。

内存持久化

内存持久化是将配置信息存储在内存中,速度快但重启后数据会丢失。

// 配置示例
spring.cloud.nacos.config.serverAddr=127.0.0.1:8848

MySQL持久化

MySQL持久化是将配置信息存储到MySQL数据库中,可以持久化但速度较慢。

# 配置示例
spring.datasource.url=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=root
配置持久化与管理

Nacos提供了配置持久化与管理功能,可以将配置信息持久化到数据库中,并支持实时推送配置变更到各个客户端。

配置持久化

配置持久化是将配置信息持久化到数据库中,支持实时推送配置变更到各个客户端。

# 配置示例
spring.cloud.nacos.config.serverAddr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=your-namespace
spring.cloud.nacos.config.group=your-group
spring.cloud.nacos.config.key=your-key

配置管理

配置管理是管理配置信息,支持多环境配置。

# 配置示例
spring.cloud.nacos.config.serverAddr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=your-namespace
spring.cloud.nacos.config.group=your-group
spring.cloud.nacos.config.key=your-key
使用Nacos进行限流规则的持久化

使用Nacos进行限流规则的持久化,可以将限流规则持久化到Nacos配置中心,支持实时推送限流规则变更到各个客户端。

配置示例

application.yml中配置Nacos的连接信息:

spring:
  cloud:
    sentinel:
      transport:
        serverPort: 8719
        dashboard: localhost:8080
  application:
    name: sentinel-nacos-demo
  nacos:
    server-addr: 127.0.0.1:8848
    namespace: your-namespace

代码示例

在代码中使用NacosDataSourceProperty来读取和写入规则:

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Properties;

@Component
public class SentinelNacosConfig implements ApplicationRunner {

    @Value("${spring.cloud.sentinel.nacos.namespace}")
    private String namespace;

    @Value("${spring.cloud.sentinel.nacos.config.group}")
    private String group;

    @Value("${spring.cloud.sentinel.nacos.config.key}")
    private String key;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        ConfigService configService = new ConfigService("127.0.0.1:8848", namespace);
        String content = configService.getConfigInfo(key, group);
        if (content != null) {
            List<FlowRule> rules = new ArrayList<>();
            // 解析规则
            // rules = parseRulesFrom(content);
            FlowRuleManager.loadRules(rules);
        }

        configService.addListener(key, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                List<FlowRule> rules = new ArrayList<>();
                // 解析规则
                // rules = parseRulesFrom(configInfo);
                FlowRuleManager.loadRules(rules);
            }
        });
    }

    private List<FlowRule> parseRulesFrom(String content) {
        // 解析逻辑
        return new ArrayList<>();
    }
}
实战演练
创建限流规则

创建一个简单的限流规则,限制接口访问速率:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class SentinelController {

    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleException")
    public String hello() throws InterruptedException {
        TimeUnit.SECONDS.sleep(1);
        return "Hello World";
    }

    public String handleException(BlockException e) {
        return "Blocked";
    }
}
将规则保存至Nacos

使用Nacos将限流规则保存到配置中心,支持实时推送规则变更到各个客户端:

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Properties;

@Component
public class SentinelNacosConfig implements ApplicationRunner {

    @Value("${spring.cloud.sentinel.nacos.namespace}")
    private String namespace;

    @Value("${spring.cloud.sentinel.nacos.config.group}")
    private String group;

    @Value("${spring.cloud.sentinel.nacos.config.key}")
    private String key;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        ConfigService configService = new ConfigService("127.0.0.1:8848", namespace);
        String content = configService.getConfigInfo(key, group);
        if (content != null) {
            List<FlowRule> rules = new ArrayList<>();
            // 解析规则
            // rules = parseRulesFrom(content);
            FlowRuleManager.loadRules(rules);
        }

        configService.addListener(key, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                List<FlowRule> rules = new ArrayList<>();
                // 解析规则
                // rules = parseRulesFrom(configInfo);
                FlowRuleManager.loadRules(rules);
            }
        });
    }

    private List<FlowRule> parseRulesFrom(String content) {
        // 解析逻辑
        return new ArrayList<>();
    }
}
动态调整与实时查看规则

动态调整和实时查看限流规则,支持实时推送规则变更到各个客户端:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class SentinelController {

    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleException")
    public String hello() throws InterruptedException {
        TimeUnit.SECONDS.sleep(1);
        return "Hello World";
    }

    public String handleException(BlockException e) {
        return "Blocked";
    }
}
总结与后续步骤
本次学习的收获

通过学习,掌握了如何使用Sentinel和Nacos进行限流规则的持久化。Sentinel提供了丰富的限流规则,包括QPS规则、并发数规则等。Nacos提供了配置持久化功能,可以将限流规则持久化到配置中心。

进一步学习的方向

后续可以深入学习Sentinel的熔断降级和系统保护功能。Sentinel提供了丰富的熔断降级策略,如慢调用比例、服务降级等。Sentinel还提供了系统保护功能,如CPU使用率保护等。Sentinel提供了丰富的API,方便配置和调整。

常见问题与解答

Q: 如何调整限流规则?

A: 可以通过修改Nacos中的配置信息调整限流规则,修改配置后,Nacos会实时推送配置变更到各个客户端,无需重启应用即可生效。

Q: 如何查看限流规则?

A: 可以通过Nacos的管理界面查看限流规则,Nacos提供了管理界面,可以查看各个配置信息。

Q: 如何进行熔断降级?

A: 可以通过Sentinel提供的熔断降级API进行熔断降级。Sentinel提供了丰富的熔断降级策略,如慢调用比例、服务降级等。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消