Spring Cloud 中 Sentinel 持久化模式解析
在微服务架构中,服务的稳定性和可靠性是至关重要的。为此,Spring Cloud 提供了多种服务容错方案,其中 Sentinel 是一个优秀的服务保护工具。为了增强 Sentinel 的灵活性与容错能力,我们可以对其规则进行持久化。Sentinel 提供了两种持久化模式,它们分别是 “文件持久化” 和 “数据库持久化”。
1. 文件持久化
文件持久化是 Sentinel 默认支持的持久化方式。通过这种方式,Sentinel 可以将限流、熔断等规则存储到文件中,从而允许我们在应用重启后恢复规则。下面是一个使用文件持久化的示例。
1.1 配置文件持久化
在 application.properties
文件中进行如下配置:
spring.cloud.sentinel.transport.dashboard=localhost:8080
spring.cloud.sentinel.file.rules=classpath:sentinel-rules.json
1.2 定义规则文件
在 src/main/resources/sentinel-rules.json
文件中定义规则,示例如下:
[
{
"resource": "hello",
"limitApp": "default",
"metricType": "QPS",
"count": 10,
"grade": 1,
"strategy": 0
}
]
1.3 注入规则
在服务代码中,我们可以通过如下方式注入规则并使用 Sentinel 进行保护:
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
@SentinelResource("hello")
public String hello() {
return "Hello, Sentinel!";
}
}
这样,当请求量超过指定的 QPS(10)时,Sentinel 会对请求进行限流处理。
2. 数据库持久化
在某些情况下,我们可能需要将规则保存在数据库中,这就需要我们使用 Sentinel 的数据库持久化方式。这种方式可以通过使用 MySQL、Redis 等关系型或非关系型数据库来实现。
2.1 添加 Maven 依赖
首先,我们需要添加相关的 Maven 依赖至 pom.xml
中:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.2 规则表设计
在数据库中创建一张规则表,例如 sentinel_rules
:
CREATE TABLE `sentinel_rules` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`resource` VARCHAR(50) NOT NULL,
`limitApp` VARCHAR(50) DEFAULT 'default',
`count` DECIMAL(10,2),
`grade` INT,
`strategy` INT
);
2.3 配置数据库连接
在 application.properties
文件中,配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2.4 使用数据库持久化
在代码中配置 Sentinel 使用数据库持久化持有规则的方式:
import com.alibaba.csp.sentinel.datasource.db.YourDatabaseDataSource;
@Configuration
public class SentinelConfig {
@Bean
public DataSource<List<Rule>> datasource() {
return new YourDatabaseDataSource("jdbc:mysql://localhost:3306/your_database",
"your_username",
"your_password");
}
}
小结
以上介绍了 Sentinel 的两种持久化模式:文件持久化和数据库持久化。文件持久化适用于简单场景,而且配置起来相对直接。数据库持久化则提供了更灵活的规则管理方式,更适合复杂的微服务架构。选择何种持久化模式,应根据具体的业务需求和环境来决定。通过合理配置 Sentinel,我们可以有效提升微服务的稳定性和容错能力。