• Gateway--服务网关限流


            网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也很多,我们本次采用前面学过的Sentinel组件来实现网关的限流。Sentinel支持对SpringCloud Gateway、Zuul等主流网关进行限流。

    从1.6.0版本开始,Sentinel提供了SpringCloud Gateway的适配模块,可以提供两种资源维度的限流:

    • route维度:即在Spring配置文件中配置的路由条目,资源名为对应的routeId
    • 自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组

    1 导入依赖

    1. <dependency>
    2.   <groupId>com.alibaba.csp</groupId>
    3.   <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
    4. </dependency>

    2 编写配置类

            基于Sentinel 的Gateway限流是通过其提供的Filter来完成的,使用时只需注入对应的
    SentinelGatewayFilter实例以及 SentinelGatewayBlockExceptionHandler 实例即可。

    1. @Configuration
    2. public class GatewayConfiguration {
    3.   private final List<ViewResolver> viewResolvers;
    4. private final ServerCodecConfigurer serverCodecConfigurer;
    5.   public GatewayConfiguration(ObjectProvider<List<ViewResolver>>
    6. viewResolversProvider,
    7.                 ServerCodecConfigurer serverCodecConfigurer) {
    8.     this.viewResolvers =
    9. viewResolversProvider.getIfAvailable(Collections::emptyList);
    10.     this.serverCodecConfigurer = serverCodecConfigurer;
    11.  }
    12.   // 初始化一个限流的过滤器
    13.   @Bean
    14.   @Order(Ordered.HIGHEST_PRECEDENCE)
    15.   public GlobalFilter sentinelGatewayFilter() {
    16.     return new SentinelGatewayFilter();
    17.  }
    18.   // 配置初始化的限流参数
    19.   @PostConstruct
    20.   public void initGatewayRules() {
    21.     Set<GatewayFlowRule> rules = new HashSet<>();
    22.     rules.add(
    23.         new GatewayFlowRule("product_route") //资源名称,对应路由id
    24.            .setCount(1) // 限流阈值
    25.            .setIntervalSec(1) // 统计时间窗口,单位是秒,默认是 1 秒
    26.    );
    27.     GatewayRuleManager.loadRules(rules);
    28.  }
    29.   // 配置限流的异常处理器
    30.   @Bean
    31.   @Order(Ordered.HIGHEST_PRECEDENCE)
    32.   public SentinelGatewayBlockExceptionHandler
    33. sentinelGatewayBlockExceptionHandler() {
    34.     return new SentinelGatewayBlockExceptionHandler(viewResolvers,
    35. serverCodecConfigurer);
    36.  }
    37.   // 自定义限流异常页面
    38.   @PostConstruct
    39.   public void initBlockHandlers() {
    40.     BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
    41.       public Mono<ServerResponse> handleRequest(ServerWebExchange
    42. serverWebExchange, Throwable throwable) {
    43.         Map map = new HashMap<>();
    44.         map.put("code", 0);
    45.         map.put("message", "接口被限流了");
    46.         return ServerResponse.status(HttpStatus.OK).
    47.  contentType(MediaType.APPLICATION_JSON_UTF8).
    48.             body(BodyInserters.fromObject(map));
    49.      }
    50.    };
    51.     GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    52.  }
    53. }

    3 测试

    在一秒钟内多次访问http://localhost:7000/product-serv/product/1就可以看到限流启作用了。

    4 自定义API分组

    自定义API分组是一种更细粒度的限流规则定义

    1.  /**
    2.   * 配置初始化的限流参数
    3.   */
    4.   @PostConstruct
    5.   public void initGatewayRules() {
    6.     Set<GatewayFlowRule> rules = new HashSet<>();
    7.     rules.add(new
    8. GatewayFlowRule("product_api1").setCount(1).setIntervalSec(1));
    9.     rules.add(new
    10. GatewayFlowRule("product_api2").setCount(1).setIntervalSec(1));
    11.     GatewayRuleManager.loadRules(rules);
    12.  }
    13.   //自定义API分组
    14.   @PostConstruct
    15.   private void initCustomizedApis() {
    16.     Set<ApiDefinition> definitions = new HashSet<>();
    17.     ApiDefinition api1 = new ApiDefinition("product_api1")
    18.        .setPredicateItems(new HashSet<ApiPredicateItem>() {{
    19.           ///product-serv/product/api1 开头的请求
    20.           add(new ApiPathPredicateItem().setPattern("/product-
    21. serv/product/api1/**").
    22.             
    23.  setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
    24.        }});
    25.     ApiDefinition api2 = new ApiDefinition("product_api2")
    26.        .setPredicateItems(new HashSet<ApiPredicateItem>() {{
    27.           ///product-serv/product/api2/demo1 完成的url路径匹配
    28.  add(new ApiPathPredicateItem().setPattern("/product-
    29. serv/product/api2/demo1"));
    30.        }});
    31.     definitions.add(api1);
    32.     definitions.add(api2);
    33.     GatewayApiDefinitionManager.loadApiDefinitions(definitions);
    34.  }

  • 相关阅读:
    错误: 找不到或无法加载主类 Main
    微信小程序异常:navigateTo:fail can not navigateTo a tabbar page
    webpack初体验
    java毕业设计基于ssm框架的生鲜超市进销存管理系统
    QT day 2
    [数据可视化] 霍乱时期的可视化医师
    mysql8压缩包安装
    【机器学习】Logistic 分类回归算法 (二元分类 & 多元分类)
    房产中介小程序,二手房小程序带H5公众号,房产门户PC版,房产中介,房产经纪人
    11、综合应用案例
  • 原文地址:https://blog.csdn.net/Lj_chuxuezhe/article/details/132804515