Sentinel整合Gateway

发布于 2022-04-22  2.03k 次阅读


  网关作为内部系统的屏障,对内起了保护作用,它整合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);
    }
}


路漫漫其修远兮,吾将上下而求索