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,我们可以有效提升微服务的稳定性和容错能力。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部