Sentinel+Nacos限流规则持久化实战教程
本文介绍了如何将Sentinel的限流规则持久化到Nacos中,首先讲解了Sentinel和Nacos的基本概念和安装步骤,然后详细说明了如何配置Sentinel使用Nacos作为数据源,并通过代码示例展示了如何实现限流规则的存储和读取,确保了Sentinel+Nacos限流规则持久化的顺利进行。
引入Sentinel和NacosSentinel 是阿里巴巴开源的一款轻量级、高性能的Java分布式服务保护框架,提供流量控制、熔断降级、系统负载保护等功能。Sentinel 提供了一个简单易用的控制台,能够直观地展示实时监控以及保护规则定义,设计理念是保持简洁,通过简单、易懂、高性能的原语,为企业级分布式系统提供强大的流量控制和防护能力。
Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台,提供了服务发现、配置管理和服务管理三大功能。其中服务发现和负载均衡支持Dubbo、Spring Cloud、gRPC等多种开发框架,能够帮助微服务架构中的服务实现动态配置管理、服务发现和服务健康监测等功能。
安装Sentinel和Nacos的步骤安装Sentinel
Sentinel 本身是一个Java库,可以通过Maven或Gradle添加到您的Java项目中。以下是使用Maven安装的示例:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-netty</artifactId>
<version>1.8.4</version>
</dependency>
安装完成后,您可以启动Sentinel控制台。控制台是一个Java Web应用,可以从GitHub下载源码并编译,或者直接下载预编译的war包部署在Tomcat等Web容器中。
安装Nacos
Nacos 提供了多种安装方式,如使用Docker、编译源代码或直接下载预编译的war包。以下以下载war包为例:
- 下载最新的Nacos版本的war包。
- 将war包部署到Tomcat或其他Java应用服务器上。
- 启动Tomcat,Nacos的服务会自动启动。
- 访问
http://localhost:8848/nacos/
,使用默认账号密码nacos/nacos
登录Nacos控制台。
创建Sentinel控制台
创建Sentinel控制台需要启动控制台的Web应用。如果您是从源码编译的,可以使用如下命令启动:
mvn clean install
cd sentinel-dashboard
mvn exec:java -Dexec.mainClass=com.alibaba.csp.sentinel.dashboard.SentinelDashboardApplication
如果您使用的是预编译的war包,可以将其部署到Tomcat或其他Java应用服务器。
添加和测试简单的限流规则
创建限流规则后,可以在Sentinel控制台中进行规则配置和测试。假设您已经部署了一个Web服务,并且想对其访问进行限流保护。
- 打开Sentinel控制台,登录进入控制台。
- 在左侧菜单中选择“规则管理” -> “流控规则”,然后点击“添加流控规则”按钮。
- 在弹出的窗口中,填写规则相关信息。例如,可以设置资源为
/api/user
,选择流控模式为“链路模式”,设置QPS阈值为5。 - 点击保存按钮,保存新的限流规则。
- 为了验证设定的限流规则,可以使用工具(如Postman)请求您的Web服务的
/api/user
接口,观察请求是否被限流。
要在Sentinel中使用Nacos作为数据源,需要实现Sentinel的指定接口。以下是配置步骤:
配置Sentinel使用Nacos作为数据源
- 分别配置好Nacos的地址、命名空间、dataId、group等信息。
- 在Sentinel控制台上配置Nacos数据源,可以在Sentinel控制台的“规则管理” -> “数据源管理”页面中添加一个新的Nacos数据源。
- 配置完成后,控制台将自动从Nacos中读取限流规则并应用到系统中。
存储和读取限流规则到Nacos
要将限流规则存储到Nacos中,需要实现相应的接口,并在Sentinel控制台中配置Nacos作为数据源。以下是Nacos的存储配置示例:
-
配置Nacos的配置信息:在
application.properties
或application.yml
中,配置Nacos的地址、命名空间、dataId、group等信息。spring: application: name: sentinel-dashboard nacos: server-addr: 127.0.0.1:8848 namespace: 你的namespace dataId: sentinel-rules group: DEFAULT_GROUP
-
实现Rule Nacos持久化接口:实现
FlowRuleStore
和FlowRulePublisher
接口,将规则存储到Nacos中。import com.alibaba.csp.sentinel.cluster.sharerule.flow.FlowRuleStore; import com.alibaba.csp.sentinel.cluster.sharerule.flow.FlowRulePublisher; import com.alibaba.csp.sentinel.cluster.sharerule.flow.FlowRuleStorage; import com.alibaba.csp.sentinel.datasource.WritableDataSource; import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; @Configuration public class NacosConfig { @Autowired private NacosDataSource nacosDataSource; @Bean public FlowRuleStore flowRuleStore() { return new FlowRuleStore() { @Override public void loadRules(FlowRuleManager manager) { Properties properties = new Properties(); properties.put("serverAddr", nacosDataSource.getServerAddr()); properties.put("namespace", nacosDataSource.getNamespace()); properties.put("dataId", nacosDataSource.getDataId()); properties.put("group", nacosDataSource.getGroup()); properties.put("appName", nacosDataSource.getAppName()); WritableDataSource<String> writableDataSource = new NacosDataSource<>(properties, object -> { if (object != null && !object.isEmpty()) { manager.loadRules(object); } }, "sentinel.rules"); } }; } @Bean public FlowRulePublisher flowRulePublisher() { return new FlowRulePublisher() { @Override public void publish(FlowRuleManager manager) { manager.saveRules(); } }; } @Bean public CommandLineRunner start(FlowRuleStore flowRuleStore) { return args -> { flowRuleStore.loadRules(FlowRuleManager.getInstance()); }; } }
- 配置Nacos数据源:在Sentinel控制台中添加新的Nacos数据源,并配置Nacos的地址、命名空间、dataId、group等信息。
解释持久化流程
当Sentinel控制台中的限流规则发生变化时,Sentinel会调用自定义的持久化接口将规则保存到Nacos。Nacos将这些规则保存到其内部的存储中(通常是一个MySQL数据库),从而实现了规则的持久化。当Sentinel控制台启动时,它会从Nacos中读取最新的规则并加载到内存中进行管理。
手动添加和编辑Nacos中的限流规则
要手动添加或编辑Nacos中的限流规则,可以通过Nacos控制台进行操作。以下是具体步骤:
- 前往Nacos控制台并登录。
- 在左侧菜单中选择“配置管理”,然后找到对应的
dataId
。 - 编辑对应的配置内容以添加或修改规则。
- 保存更改并返回Sentinel控制台,验证规则已经被正确加载。
代码集成示例
应用程序需要引入Sentinel和Nacos客户端的依赖,并配置Nacos的数据源。以下是Spring Boot应用程序的代码集成示例:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-netty</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在application.yml
中配置Nacos的数据源:
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 你的namespace
group: DEFAULT_GROUP
dataId: sentinel-rules
然后在应用程序代码中使用Sentinel API:
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SampleController {
@Autowired
private FlowRuleStore flowRuleStore;
@GetMapping("/hello")
@SentinelResource(value = "hello", blockHandler = "handleException")
public String hello() {
return "Hello World";
}
public String handleException(BlockException ex) {
return "Blocked by Sentinel";
}
}
测试持久化效果
启动您的应用程序和Sentinel控制台,确保它们都能正确读取规则。
- 在Nacos控制台中编辑配置,添加或修改Sentinel规则。
- 保存更改,然后在Sentinel控制台中刷新规则。
- 访问您的应用程序,观察是否按照新的规则进行限流。
常见问题解答
- Sentinel控制台没有显示规则:检查是否正确配置了Nacos数据源,并确保Nacos中存储的规则信息是正确的。
- 规则没有生效:确保Sentinel控制台已经正确读取了规则,并且应用程序已正确启动。
- 规则更新不及时:检查Nacos和Sentinel的连接配置,确保它们之间的通信正常。
持久化中的注意事项
- 数据一致性:确保Sentinel控制台和Nacos之间的数据一致性,防止由于网络或配置错误导致规则丢失或不一致。
- 规则变更策略:在生产环境中,规则变更应该通过Nacos控制台或脚本进行,避免直接修改Nacos的数据存储。
- 监控和报警:设置监控和报警机制,当规则变更或应用失败时能够及时发现和处理问题。
共同学习,写下你的评论
评论加载中...
作者其他优质文章