Sentinel 是阿里巴巴开源的面向分布式服务架构的流量控制组件,主要以流量为切入点,提供多维度的流量控制手段,以保护系统稳定性。
在Spring Cloud中,我们可以通过Spring Cloud Alibaba Sentinel来实现对Spring Cloud Gateway的限流。
以下是一个简单的例子,展示如何在Spring Cloud Gateway中使用Sentinel进行限流。
- 首先,在pom.xml中添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
- 在application.yml中配置Sentinel的数据源,这里以Nacos为例:
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719
datasource:
ds1:
nacos:
server-addr: 127.0.0.1:8848
dataId: gateway-flow-rules
groupId: DEFAULT_GROUP
rule-type: flow
- 在Java配置类中配置Sentinel:
@Configuration
public class SentinelConfiguration {
@Bean
public SentinelGatewayFilter sentinelGatewayFilter() {
return new SentinelGatewayFilter();
}
@PostConstruct
public void doInit() {
// 配置限流的规则
Set<GatewayFlowRule> rules = new HashSet<>();
rules.add(new GatewayFlowRule("route_a")
.setCount(1) // 限流阈值
.setIntervalSec(1)); // 统计时间窗口,单位是秒
GatewayRuleManager.loadRules(rules);
}
}
- 在Gateway路由配置中应用过滤器,以使得流量经过Sentinel进行限流:
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("route_a", r -> r.path("/api/**")
.filters(f -> f.filter(new SentinelGatewayFilter()))
.uri("http://example.com"))
.build();
}
}
在上述代码中,我们定义了一个名为"route\_a"的路由,并且为它配置了一个流量控制规则,限制每个客户端1秒钟只能访问一次。这样,当请求超过这个阈值时,Sentinel会拒绝新的请求,直至过了统计时间窗口。
以上就是在Spring Cloud Gateway中使用Sentinel进行限流的一个简单示例。