当前位置:网站首页>限流设计及实现

限流设计及实现

2022-06-26 18:20:00 [email protected]

第一步:添加依赖

<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>

第二步:添加sentinel及路由规则(假如已有则无需设置)

server:
  port: 9000
spring:
  application:
    name: sca-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yml
    gateway:
      routes: #配置网关路由规则
        - id: route01  #路由id,自己指定一个唯一值即可
          #uri: http://localhost:8081/ #网关帮我们转发的url
          uri: lb://sca-provider #lb表示负载均衡,sca-provider为服务名
          predicates: ###断言(谓词):匹配请求规则(进行逻辑判断) http://ip:port/nacos/provider/echo/01
            - Path=/nacos/provider/echo/**  #请求路径定义,此路径对应uri中的资源
#            - After=2021-11-20T23:59:59.789+08:00[Asia/Shanghai]
            #- Query=pageSize,\d+
          filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
            - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
#限流设计及实现
    sentinel:
      eager: true
      transport:
        dashboard: localhost:8180

第三步:启动网关项目,检测sentinel控制台的网关菜单。

启动时,添加sentinel的jvm参数,通过此菜单可以让网关服务在sentinel控制台显示不一样的菜单,代码如下。

-Dcsp.sentinel.app.type=1

说明,假如没有发现请求链路,API管理,关闭网关项目,关闭sentinel,然后重启sentinel,重启网关项目.

第四步:在sentinel面板中设置限流策略,如图所示: 

第五步:通过url进行访问检测是否实现了限流操作 

 六,基于请求属性限流

 

 七,自定义API维度限流(重点)

å¨è¿éæå¥å¾çæè¿°

 第二步:新建分组流控规则,如图所示:

å¨è¿éæå¥å¾çæè¿°

第三步:进行访问测试,如图所示 

å¨è¿éæå¥å¾çæè¿°

八,定制流控网关返回值

定义配置类,设计流控返回值,代码如下:

方法一:在启动类同包或者子包下重新写一个类:GatewayConfig 

@Configuration
public class GatewayConfig {
    public GatewayConfig(){
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map<String,Object> map=new HashMap<>();
                map.put("state",429);
                map.put("message","two many request");
                String jsonStr= JSON.toJSONString(map);
                return ServerResponse.ok().body(Mono.just(jsonStr),String.class);
            }
        });
    }
}

方法二:在启动类中写

 配置网关:

进行访问测试,如图所示 

原网站

版权声明
本文为[[email protected]@yxg]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_49143405/article/details/121629269