网关作为内部系统的屏障,对内起了保护作用,它整合Sentinel限流之后,无论是宏观的服务还是具体的接口资源都能进行匹配限流
router(路由)+predicate(断言)+filer(过滤)+sentinel限流可以实现粗-细粒度的流量控制
在SpringAlibaba2.1.6之后提供sentinel-gateway的整合包,她自动配置了Sentinel合Gateway的整合 ,在之前的老版本中使用gateway-adapter进行整合需要配置bean,而sentinel-gateway提供了SentinelSCGAutoConfiguration的自动配置类进行了配置
一,整合配置
整合相对简单,不需要额外配置
① maven依赖(注:gateway不需要web依赖否则会冲突报错)
<!--实现服务的注册与发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--sentinel服务限流降级框架--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--GateWay依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--sentinel和gateway整合--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>
② application配置
server: port: 9108 spring: application: name: cloudalibaba-sentinelmain-gateway cloud: gateway: discovery: locator: enabled: true routes: #加入一个规则 - id: sentinelgateway_routh #路由的ID,没有固定规则但要求唯一(建议配合服务名) uri: lb://cloudalibaba-sentinelmain-service #匹配后提供服务的路由地址 predicates: #断言路径相匹配进行断言 - Path=/testB/** nacos: discovery: server-addr: 192.168.68.134:8084 #nacos服务端地址,Nginx做了代理 sentinel: transport: dashboard: localhost:8080 #SentinelMain dashboard地址 port: 8719 #默认端口为8719,如果被占用开始+1扫描,直到找到未被占用的端口
测试:
刷新sentinel控制台:
二,网关的流控降级
Sentinel对Gateway网关限流降级提供专门控制台操作
1,资源类型:
- Route ID:通过路由ID进行资源限流
- API分组:通过API分组进行限流,这个API分组需要在API管理中单独创建
2,API名称:假如为Route ID类型名称就为Gateway设置的路由id,假如为分组就为分组名称
3,参数属性:需要对那些参数属性进行匹配精准化限流,这个和一gateway的Predicate断言是一样的
- Client IP:根据路由的IP进行精准化匹配限流
- Remote Host:根据域名进行匹配
- Header:请求头匹配
- URL参数:Url参数匹配
- Cookie:Cookie匹配
3,属性匹配模式:
- 精准:把详细写上
- 子串:内容包括那些子子符,如:localhost 子串就可以写成l
- 正则:正则表达式
4,阈值类型:QPS和线程数
5,流控方式:快速失败和匀速排队,没有预热Warm Up
例:使用API分组进行流控
① 新建一个API分组
② 对分组进行流量控制
③ 测试
三,自定义异常处理
在普通的服务限流中可以通过@SentinelResource注解中的BlockHandler和Fallback对异常进行处理,但在网关限流中无法被使用,假如触发异常只会默认返回Blocked by Sentinel: ParamFlowException
针对网关限流提供了两个异常处理方式:
- 配置类
- 配置文件
1,配置文件处理异常
sentinel: transport: dashboard: localhost:8080 port: 8719 scg: fallback: mode: response #响应 response-body: "{code:'200',message:'网关被限流'}" #网关限流异常触发的响应信息
2,配置类异常处理
@Configuration public class GatewayConfig { @PostConstruct //在容器创建后就加载 public void init(){ BlockRequestHandler blockRequestHandler = new BlockRequestHandler() { @Override public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) { return ServerResponse.status(HttpStatus.OK)//自定义异常处理 .contentType(MediaType.APPLICATION_JSON) .body(BodyInserters.fromValue("网关降级")); } }; //将异常处理添加 GatewayCallbackManager.setBlockHandler(blockRequestHandler); } }
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109