sentinel之整合openfeign和gateway

367 阅读3分钟

sentinel整合openfeign

前置条件
  • 依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  • 配置yml
feign:
  sentinel:
    enabled: true
实践
  • 改造接口

配置fallback参数

@FeignClient(value = "cloud-provider-payment", fallback = PaymentFallbackService.class)
public interface CloudProviderPaymentFeignService {
​
    @GetMapping("hello")
    String hello();
​
    @GetMapping("chain3")
    String chain3();
}
  • 实现接口
@Component
public class PaymentFallbackService implements CloudProviderPaymentFeignService {
    @Override
    public String hello() {
        return "我是整合openFeign后的异常处理";
    }
​
    @Override
    public String chain3() {
        return null;
    }
}
  • 测试

    正常情况

    image-20220826164648654

    cloud provider payment 9001服务宕机。可以发现自动调用了fallback里面的实现类对应的方法。

    image-20220826164655594

总结
  • 简单

sentinel整合gateway

前置条件

若想跟 Sentinel Starter 配合使用,需要加上 spring-cloud-alibaba-sentinel-gateway 依赖,同时需要添加 spring-cloud-starter-gateway 依赖来让 spring-cloud-alibaba-sentinel-gateway 模块里的 Spring Cloud Gateway 自动化配置类生效:

  • 依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency><dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
    </dependency><dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
  • 配置yml

    server:
      port: 2001
    spring:
      application:
        name: cloud-gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
          routes:
            - id: after_route
              uri: lb://cloud-consumer-feign
              predicates:
                - Path=/api/**
                - After=2021-07-13T14:11:00.123+08:00[Asia/Shanghai]
        // 核心
        sentinel:
          filter:
            enabled: false
          transport:
            dashboard: localhost:8080
            port: 8719
        // 
        nacos:
          discovery:
            server-addr: localhost:8848
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
  • 请求一次

image-20220826164707364

  • 回到页面

image-20220826164715395

实践
流控
  • 简单演示

    • 从请求链路里面添加流控规则并填写参数

      image-20220826164727780

    • 测试

      image-20220826164734965

  • 参数解释

    image-20220826164748242

  • API分组:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/**/baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。

其中网关限流规则 GatewayFlowRule 的字段解释如下:

  • API名称:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。

  • 间隔:统计时间窗口,单位是秒,默认是 1 秒。

  • 流控方式:流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。

  • burst:应对突发请求时额外允许的请求数目。

  • maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。

    针对请求属性:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:

    • 参数属性:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。
  • 匹配模式:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)。(1.6.2 版本开始支持)

用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则,或通过 GatewayRuleManager.register2Property(property) 注册动态规则源动态推送(推荐方式)。

  • 针对请求属性演示

    这里就对header进行演示,其他的大家以此类推即可。

    • 流控配置如下

      image-20220826164759836

    • 测试

      无header

      image-20220826164822822

      有header

      image-20220826164829850

  • API分组限流演示

    • 代码

      这里我们定义了两个分组 some_customized_apianother_customized_api

      @Configuration
      public class ApiGroupConfig {
      
          @PostConstruct
          public void doInit() {
              initCustomizedApis();
          }
      
          private void initCustomizedApis() {
              Set<ApiDefinition> definitions = new HashSet<>();
              //
              ApiDefinition api1 = new ApiDefinition("some_customized_api")
                      .setPredicateItems(new HashSet<ApiPredicateItem>() {{
                          add(new ApiPathPredicateItem().setPattern("/product/baz"));
                          add(new ApiPathPredicateItem().setPattern("/product/foo/**")
                                  .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
                      }});
              //
              ApiDefinition api2 = new ApiDefinition("another_customized_api")
                      .setPredicateItems(new HashSet<ApiPredicateItem>() {{
                          add(new ApiPathPredicateItem().setPattern("/ahas"));
                      }});
              definitions.add(api1);
              definitions.add(api2);
              GatewayApiDefinitionManager.loadApiDefinitions(definitions);
          }
      }
      
    • 重启项目打开dashboard

      image-20220826164840072

    • 再流控页面则可以按照分组来进行配置

      image-20220826164847082

  • 整合gateway其实就是网关级别得流控