当前位置:   article > 正文

SpringCloudGateWay结合Sentinel针对部分接口url限流_sentinel gateway 按照url

sentinel gateway 按照url

 看了好多文章没有针对于指定url进行限流 自己实践了一下。

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  4. <spring-cloud.version>Hoxton.SR11</spring-cloud.version>
  5. <java.version>1.8</java.version>
  6. </properties>
  7. <dependencyManagement>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-dependencies</artifactId>
  12. <version>${spring-cloud.version}</version>
  13. <type>pom</type>
  14. <scope>import</scope>
  15. </dependency>
  16. </dependencies>
  17. </dependencyManagement>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-gateway</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.alibaba.csp</groupId>
  24. <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
  25. <version>1.8.2</version>
  26. </dependency>
  1. package com.main.fintech.config;
  2. import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
  3. import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
  4. import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
  5. import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
  6. import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
  7. import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
  8. import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayParamFlowItem;
  9. import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
  10. import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
  11. import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
  12. import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
  13. import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
  14. import org.springframework.beans.factory.ObjectProvider;
  15. import org.springframework.cloud.gateway.filter.GlobalFilter;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;
  18. import org.springframework.core.Ordered;
  19. import org.springframework.core.annotation.Order;
  20. import org.springframework.http.HttpStatus;
  21. import org.springframework.http.MediaType;
  22. import org.springframework.http.codec.ServerCodecConfigurer;
  23. import org.springframework.web.reactive.function.BodyInserters;
  24. import org.springframework.web.reactive.function.server.ServerResponse;
  25. import org.springframework.web.reactive.result.view.ViewResolver;
  26. import javax.annotation.PostConstruct;
  27. import java.util.*;
  28. import static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP;
  29. import static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME;
  30. /**
  31. * @author whc
  32. * @version v1.0
  33. * @date 2021/9/13
  34. * @Description gateway限流配置 基于sentinel自定义api接口方式
  35. */
  36. @Configuration
  37. public class GatewayLimitConfiguration {
  38. private final List<ViewResolver> viewResolvers;
  39. private final ServerCodecConfigurer serverCodecConfigurer;
  40. public GatewayLimitConfiguration(ObjectProvider<List<ViewResolver>> viewResolverProvider,
  41. ServerCodecConfigurer serverCodecConfigurer) {
  42. this.viewResolvers = viewResolverProvider.getIfAvailable(Collections::emptyList);
  43. this.serverCodecConfigurer = serverCodecConfigurer;
  44. }
  45. /**
  46. * 配置限流的异常处理器
  47. *
  48. * @return SentinelGatewayBlockExceptionHandler
  49. */
  50. @Bean
  51. @Order(Ordered.HIGHEST_PRECEDENCE)
  52. public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
  53. // Register the block exception handler for Spring Cloud Gateway.
  54. return new SentinelGatewayBlockExceptionHandler(this.viewResolvers, this.serverCodecConfigurer);
  55. }
  56. /**
  57. * 配置限流过滤器
  58. *
  59. * @return SentinelGatewayFilter
  60. */
  61. @Bean
  62. @Order(Ordered.HIGHEST_PRECEDENCE)
  63. public GlobalFilter sentinelGlobalFilter() {
  64. return new SentinelGatewayFilter();
  65. }
  66. /**
  67. * 初始化限流策略
  68. */
  69. @PostConstruct
  70. public void doInit() {
  71. initGatewayRules();
  72. initCustomizedApis();
  73. }
  74. /**
  75. * 全局限流配置器
  76. * resource:资源名称 可以为配置文件中的routesId 也可以为自定义Api分组名称 这里为Api分组名称
  77. * setResourceMode:模式为routesId->RESOURCE_MODE_ROUTE_ID还是为Api分组名称->RESOURCE_MODE_CUSTOM_API_NAME 配合resource一起使用 这里为Api分组名称
  78. * setCount : 限流阈值 这里设置为15 即每秒可请求15次
  79. * setIntervalSec: 统计时间窗口/秒
  80. * setParamItem:参数限流配置,若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则。这里配置了IP模式
  81. * 最终限流结果为:每个IP每秒可访问15次
  82. *
  83. * @author whc
  84. */
  85. public void initGatewayRules() {
  86. Set<GatewayFlowRule> rules = new HashSet<>();
  87. rules.add(new GatewayFlowRule("ocrLimit")
  88. .setResourceMode(RESOURCE_MODE_CUSTOM_API_NAME)
  89. .setCount(15)
  90. .setIntervalSec(1)
  91. .setParamItem(new GatewayParamFlowItem().setParseStrategy(PARAM_PARSE_STRATEGY_CLIENT_IP)));
  92. GatewayRuleManager.loadRules(rules);
  93. }
  94. /**
  95. * 自定义限流错误返回
  96. */
  97. @PostConstruct
  98. public void initBlockHandler() {
  99. BlockRequestHandler blockHandler = (serverWebExchange, throwable) -> {
  100. Map<String, String> map = new HashMap<>(8);
  101. map.put("code", "E88888");
  102. map.put("message", "操作频繁");
  103. return ServerResponse.status(HttpStatus.OK)
  104. .contentType(MediaType.APPLICATION_JSON)
  105. .body(BodyInserters.fromValue(map));
  106. };
  107. GatewayCallbackManager.setBlockHandler(blockHandler);
  108. }
  109. /**
  110. * 自定义Api策略
  111. * apiName:自定义Api名称
  112. * setPattern:限流策略 这里是针对my/ocr/**所有的请求进行限流
  113. * setMatchStrategy:匹配规则 这里是URL_MATCH_STRATEGY_PREFIX 前缀
  114. * @author whc
  115. */
  116. private void initCustomizedApis() {
  117. Set<ApiDefinition> definitions = new HashSet<>();
  118. ApiDefinition api1 = new ApiDefinition("ocrLimit")
  119. .setPredicateItems(new HashSet<ApiPredicateItem>() {{
  120. add(new ApiPathPredicateItem().setPattern("/my/ocr/**")
  121. .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
  122. }});
  123. definitions.add(api1);
  124. GatewayApiDefinitionManager.loadApiDefinitions(definitions);
  125. }
  126. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/739460
推荐阅读
相关标签
  

闽ICP备14008679号