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

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

概述

本文介绍了如何将Sentinel限流规则持久化到Nacos的教程,首先搭建了必要的开发环境并安装了相关工具和依赖库。接着详细说明了如何配置Sentinel接入Nacos以及编写限流规则并将其保存到Nacos中。通过这些步骤,可以实现限流规则的动态管理和持久化存储。

Sentinel和Nacos简介

Sentinel的作用和特点

Sentinel 是一款开源的、高性能的、分布式服务保护库,它具有灵活的流量控制、实时指标监控、多样化的规则配置等功能。Sentinel 不仅可以作为微服务保护的入口,还可以在云环境、大数据服务等多个场景中实现服务的弹性扩展和容错保护。Sentinel 的主要特点包括:

  • 高可用性:支持集群模式,通过集群模式,Sentinel 可以在多个节点上进行服务保护和流量控制。
  • 灵活的流量控制:支持多种流量控制规则,如QPS、并发线程数、请求时延等。
  • 实时监控:可以实时监控各个服务的流量和资源使用情况,提供丰富的监控指标。
  • 灵活的规则配置:支持多种规则配置方式,包括内置规则和自定义规则。

Nacos的作用和特点

Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。Nacos 的主要作用是提供服务发现、服务配置管理、服务管理等功能,适用于微服务架构下的服务治理场景。Nacos 的主要特点包括:

  • 服务发现与负载均衡:支持基于DNS和RPC的服务发现,能够实现服务之间的负载均衡。
  • 服务配置管理:支持动态配置管理,可以实时更新配置,实现服务的动态配置管理。
  • 服务管理:提供服务注册、服务注销、服务同步等功能,支持服务级别的管理。
准备工作

环境搭建

在开始之前,需要确保已经搭建好了Java开发环境,包括JDK和IDE。为了确保能够正常运行示例程序,还需要安装以下工具:

  • Maven:用于项目构建和依赖管理。
  • Docker:用于运行 Nacos 服务。
  • Spring Boot:用于快速搭建微服务应用。

必要工具和依赖库的安装

  1. 安装 Docker:通过 Docker 安装 Nacos 服务。

    docker pull nacos/nacos-server:latest
    docker run -d --name nacos-server -p 8848:8848 nacos/nacos-server:latest
  2. 安装 Maven:确保 Maven 已经安装,并配置好环境变量。

    mvn -version
  3. 安装 Spring Boot:创建一个新的 Spring Boot 项目。

    mkdir sentinel-nacos-demo
    cd sentinel-nacos-demo
    mvn archetype:generate -DgroupId=com.example -DartifactId=sentinel-nacos-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    cd sentinel-nacos-demo

添加依赖库

在 Spring Boot 项目中添加 Sentinel 和 Nacos 的依赖库。

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Sentinel Starter -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-spring-boot-starter</artifactId>
        <version>1.8.2</version>
    </dependency>

    <!-- Sentinel Nacos Extension -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-extension-nacos-storage</artifactId>
        <version>1.8.2</version>
    </dependency>

    <!-- Spring Boot Starter Actuator -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
配置Sentinel接入Nacos

添加Nacos依赖

在 Spring Boot 项目中添加 Nacos 存储的依赖库。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-extension-nacos-storage</artifactId>
    <version>1.8.2</version>
</dependency>

配置Sentinel规则持久化到Nacos

application.yml 文件中配置 sentinel.datasource.nacos 相关属性,将规则持久化到 Nacos。

spring:
  application:
   name: sentinel-nacos-demo
   sentinel:
    datasource:
     nacos:
      server-addr: localhost:8848
      data-id: sentinel-demo
      group-id: DEFAULT_GROUP
      username: nacos
      password: nacos
编写限流规则并持久化到Nacos

创建限流规则

在 Spring Boot 项目中,可以通过代码创建限流规则并将其保存到 Nacos 中。

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.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;

@SpringBootApplication
@RestController
public class SentinelNacosDemoApplication {

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

    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleBlock")
    public String hello() {
        return "Hello, Sentinel and Nacos!";
    }

    public static void initRules() {
        ArrayList<FlowRule> flowRules = new ArrayList<>();
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("hello");
        flowRule.setGrade(FlowRuleManager.FLOW_GRADE_QPS);
        flowRule.setCount(10);
        flowRule.setControlBehavior(FlowRuleManager.CONTROL_BEHAVIOR_DEFAULT);
        flowRules.add(flowRule);
        FlowRuleManager.loadRules(flowRules);
    }

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

将规则保存到Nacos

为了将规则保存到 Nacos,需要编写代码来将规则持久化到 Nacos 中。

import com.alibaba.csp.sentinel.datasource.ConfigService;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.Properties;

@SpringBootApplication
public class SentinelNacosDemoApplication implements ApplicationRunner {

    @Autowired
    private ConfigService configService;

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

    @Override
    public void run(ApplicationArguments args) throws Exception {
        NacosDataSource nacosDataSource = new NacosDataSource(
                "localhost:8848",
                "nacos",
                "nacos",
                "sentinel-demo",
                "DEFAULT_GROUP",
                new NacosDataSource.Listener() {
                    @Override
                    public void receivedConfigInfo(String configInfo) {
                        System.out.println("Received config info: " + configInfo);
                    }
                }
        );

        Properties properties = new Properties();
        properties.put("serverAddr", "localhost:8848");
        properties.put("dataId", "sentinel-demo");
        properties.put("group", "DEFAULT_GROUP");

        configService.init(nacosDataSource, properties);
        ArrayList<FlowRule> flowRules = new ArrayList<>();
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("hello");
        flowRule.setGrade(FlowRuleManager.FLOW_GRADE_QPS);
        flowRule.setCount(10);
        flowRule.setControlBehavior(FlowRuleManager.CONTROL_BEHAVIOR_DEFAULT);
        flowRules.add(flowRule);
        configService.setConfig("flowRules", flowRules.toString());
    }
}
测试限流规则

发起请求测试

为了测试限流规则,可以使用 Postman 或者其他工具发起 HTTP 请求。请求的 URL 为 /hello

观察限流效果

当请求次数超过设定的 QPS 限制时,Sentinel 将会阻塞请求,并返回限流的错误信息。

常见问题及解决方法

常见错误及解决方案

  1. Nacos 连接失败:检查 Nacos 服务是否正常运行,并确认 Nacos 的地址和端口号是否正确。
  2. Sentinel 规则加载失败:检查 sentinel.datasource.nacos 配置是否正确,确保 Nacos 中存在相应的配置信息。
  3. 限流规则未生效:检查规则配置是否正确,确保规则已经成功加载到 Sentinel 中。

注意事项

  • 确保 Nacos 服务正常运行,并且配置信息已经正确设置。
  • 在生产环境中,建议使用集群模式部署 Sentinel,确保服务的高可用性。
  • 定期检查和更新限流规则,确保服务的稳定性和性能。

通过以上步骤,可以实现 Sentinel 和 Nacos 的集成,从而实现限流规则的持久化存储和动态管理。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

正在加载中
手记
粉丝
51
获赞与收藏
244

关注作者,订阅最新文章

阅读免费教程

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消