在Spring Cloud Alibaba微服务实战中,网关限流通常是通过Sentinel来实现的。以下是一个简单的例子,展示如何在Spring Cloud Alibaba Gateway中使用Sentinel进行限流。
- 首先,确保你的项目中已经引入了Sentinel依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 在
application.yml
配置文件中配置Sentinel的限流规则:
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080 # Sentinel 控制台地址
port: 8719 # Sentinel 默认端口
web-context-unify: false
filter:
enabled: true
- 接下来,在你的网关路由配置中为特定的路由添加Sentinel的限流规则:
@Configuration
public class GatewayConfiguration {
@Bean
public RouteLocator customRouteLocator(RouteLocator routeLocator) {
RouteLocatorBuilder.Builder routes = routeLocator.getRoutes().filter(r -> r.getId().startsWith("Path")).route(r -> r.path("/your-service/**")
.filters(f -> f.stripPrefix(1))
.id("your-service-route")
.uri("lb://YOUR-SERVICE")
.order(0)
);
// 添加Sentinel流量控制规则
fireSentinelFlowRules();
return routes.build();
}
private void fireSentinelFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("your-service-route"); // 对应路由的ID
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 限流规则的类型,这里是QPS
rule.setCount(20); // 限流阈值
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}
在上述代码中,我们定义了一个GatewayConfiguration
类,并在其中定义了一个路由,同时使用fireSentinelFlowRules
方法来配置限流规则。通过这种方式,我们可以针对特定的路由ID设置限流规则,从而实现对特定服务的访问频率控制。