开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第三阶段:网关限流-路由维度】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/685/detail/11895
网关限流-路由维度
内容介绍
一、网关限流
二、代码编写
三、限流模拟
一、网关限流
网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也很多,我们本次采用前面学过的 Sentinel 组件来实现网关的限流。Sentinel 支持对SpringCloud Gateway、Zuul 等主流网关进行限流。
Sentinel 网关限流公共模块(API Gateway Adapter Common):
请求属性解析 网关规则管理 网关规则检查
调用参数组装 自定义 API 分组管理 API 路径匹配
Sentinel 网关支持的网关:NETFLIXZuul 和 Spring Cloud Gateway
从1.6.0版本开始,Sentinel 提供了 SpringCloud Gateway 的适配模块,可以提供两种资源维度的限流方式。
route 维度:
即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeld,可以具体到某一路由上限流
e自定义 API 维度:
用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组,可以以 API 划分分组。
二、代码编写
(1)导入依赖
I<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</
artifactId>
</dependency>
(2)编写配置类
基于 Sentinel 的 Gateway 限流是通过其提供的 Filter 来完成的,使用时只需注入对应的 SentinelGatewayFilter
实例以及 SentinelGatewayBlockExceptionHandler 实例即可。
@Configuration
public class GatewayConfiguration
private final List viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer
;
// 初始化一个限流的过滤器
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public GlobalFilter sentinelGatewayFilter()
return new SentinelGatewayFilter();
// 配置初始化的限流参数
@PostConstruct
public void initGatewayRules() (
Set rules = new HashSet<>();
rules.add(
newGatewayF1owRule( resource: "product_route")
//资源名称,对应路由 id
.setCount(1)
// 限流國值
.setIntervalSec1)
//统计时间窗口,单位是秒,默认是 1秒
);
GatewayRuleManager.loadRules(rules);
// 配置限流的异常处理器
@Bean
@Order (Ordered.HIGHEST PRECEDENCE)
Public SentinelGatewayBlockExceptionHandler
sentinelGatewayBlockExceptionHandler(
return new SentinelGatewayBlockExceptionHandler
(viewResolvers, serverCodecConfigurer);
// 自定义限流异常页面
@PostConstruct
public void initBlockHandlers() (
BlockRequestHandler blockRequestHandler = new BlockRequestHandler((
public Mono handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) (Map map = new HashMap<>();
map.put("code",0);
map.put("message",“接口被限流了");
return ServerResponse.status(HttpStatus.OK).
contentType(MediaType.APPLICATION_JSON_UTF8).
body (BodyInserters.fromobject(map));
GatewayCallbackManager.setBlockHandler(blockRequestHandler);
三、限流模拟
创建 orderApplication,快速刷新查看效果,发现已经被限流了。
再访问 order,刷新后没有限流,针对第一个维度,就做完了。