Sentinel+Nacos限流规则持久化教程:轻松入门与实战
本文介绍了如何将Sentinel与Nacos结合,实现限流规则的动态管理和持久化存储。通过结合Sentinel和Nacos,可以轻松配置和管理限流规则,确保大规模分布式系统中的流量控制更加灵活高效。
Sentinel与Nacos简介 什么是SentinelSentinel 是一款基于阿里巴巴开源的微服务保护框架,能够对流量进行实时监控和保护,提供熔断降级、流量控制、热点防护、系统负载保护等功能。Sentinel 的设计目标是提供简单易用、高性能、高可用的流量控制和保护能力,适用于各种微服务架构和系统。
什么是NacosNacos 是一个动态服务发现、配置管理和服务管理平台,具备服务发现、服务健康检测、动态配置管理、服务分组管理等功能。Nacos 能够帮助企业实现微服务架构下的动态服务发现、配置管理和服务管理,简化微服务的开发、部署与运维。
Sentinel与Nacos结合的作用结合 Sentinel 和 Nacos,可以实现限流规则的持久化存储。Sentinel 提供了丰富的限流、降级等功能,而 Nacos 提供了配置管理功能,通过将 Sentinel 的限流规则存储到 Nacos 中,可以实现限流规则的动态管理和持久化存储。这使得在大规模分布式系统中,限流规则的调整和管理变得更加灵活和高效。
环境搭建 安装并启动Nacos- 下载 Nacos 安装包
wget https://github.com/alibaba/Nacos/releases/download/2.0.3/zip/nacos-server-2.0.3.zip
- 解压安装包
unzip nacos-server-2.0.3.zip
- 启动 Nacos 服务
cd nacos/bin ./startup.sh -m standalone
在你的项目中,引入 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个请求。
- 打开 Sentinel 控制台,进入规则配置页面。
- 选择资源类型,例如 API。
- 输入资源名称,例如
/order/create
。 - 设置请求频率限制,例如每秒允许的请求数为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
异常,表示请求被限流。
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 的限流规则。
- 打开 Nacos 控制台。
- 在配置管理页面,选择
public
命名空间。 - 创建一个新的配置,配置 ID 为
sentinel_ds
,配置内容为空字符串{}
。
在 Sentinel 控制台中修改限流规则,然后查看 Nacos 中的数据源配置,验证规则是否已经被持久化到 Nacos 中。
- 修改 Sentinel 控制台中的限流规则。
- 查看 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 中配置持久化限流规则,确保规则在重启后仍然有效。
- 在 Sentinel 控制台中创建限流规则。
- 在 Nacos 中配置持久化数据源,存储规则。
调整限流规则,例如将每秒限制请求次数调整为15,然后测试规则的持久性。
- 修改限流规则。
- 重启服务,验证规则是否仍然有效。
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);
}
}
}
}
常见问题与解答
常见错误及解决方案
-
Nacos 无法连接
- 检查 Nacos 服务是否正常启动。
- 配置文件中的 Nacos 地址是否正确。
- 确认防火墙规则是否允许连接。
-
Sentinel 限流规则未生效
- 重新启动 Sentinel 服务。
- 检查 Nacos 数据源配置是否正确。
- 确保 Sentinel 依赖已经正确引入。
-
Nacos 数据丢失
- 重新创建数据源配置。
- 检查 Nacos 服务是否正常。
- Sentinel 控制台无法访问
- 确认 Sentinel 控制台服务是否正常启动。
- 检查防火墙规则是否允许访问控制台端口。
-
Sentinel 限流规则的优先级如何确定?
- Sentinel 限流规则的优先级由规则配置中的顺序决定,先配置的规则优先级较高。
-
如何查看当前的限流规则?
- 通过 Sentinel 控制台查看当前的限流规则。
-
如何调整限流规则?
- 在 Sentinel 控制台中修改限流规则,然后保存更改。
-
如何查看限流规则的持久化状态?
- 通过查看 Nacos 中的数据源配置,确认规则是否已经持久化。
-
如何处理被限流的请求?
- 可以在
handleBlock
方法中处理被限流的请求,例如返回友好提示信息。
- 可以在
- 如何在多节点环境中使用 Nacos?
- 配置 Nacos 的集群模式,确保所有节点都能够访问同一个 Nacos 集群。
共同学习,写下你的评论
评论加载中...
作者其他优质文章