> 文章列表 > java微服务商城高并发秒杀项目--009.流控规则和降级规则

java微服务商城高并发秒杀项目--009.流控规则和降级规则

java微服务商城高并发秒杀项目--009.流控规则和降级规则

线程流控(只要线程数达到了指定数量,访问就会被流控):

java微服务商城高并发秒杀项目--009.流控规则和降级规则

warm up流控效果(慢慢增加QPS的数量,之后最后达到阈值,这种情况下,一开始会容易限流,后期就不会限流了):

java微服务商城高并发秒杀项目--009.流控规则和降级规则

排队处理(当每秒的访问达到阈值的时候,这一秒内的下一次访问会等待0.5s,可以看到访问的图标会有一个转圈的动态 ):

java微服务商城高并发秒杀项目--009.流控规则和降级规则

在SentinelController中增加sentinel3的controller:

    @RequestMapping("/sentinel3")public String sentinel3() {return "sentinel3"; } 

关联流控(将/sentinel3和/sentinel2进行关联后,只要/sentinel2的每秒访问超过3,/sentinel3 就会被流控):

java微服务商城高并发秒杀项目--009.流控规则和降级规则

链路流控:

在shop-order-server项⽬中新增TraceServiceImpl.java

@Service
@Slf4j
public class SentinelServiceImpl {@SentinelResource(value = "tranceService")public void tranceService(){// 做业务log.info("业务资源");}
} 

在shop-order-server项⽬的application.yml⽂件中新增如下配置,防止访问路径被折叠:

spring:cloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:port: 9999dashboard: localhost:8080web-context-unify: false 

在shop-order-server项⽬中新增TraceController.java:

@RestController
public class TraceController {@Autowiredprivate SentinelServiceImpl sentinelService;@RequestMapping("/trace1")public String trace1(){sentinelService.tranceService();return "trace1";}@RequestMapping("/trace2")public String trace2(){sentinelService .tranceService();return "trace2";}
}

设置流控规则(这样实现了对/trace2限流,但对/trace1不限流):

java微服务商城高并发秒杀项目--009.流控规则和降级规则

去除tomcat对线程的限制,并重新启动order模块:

java微服务商城高并发秒杀项目--009.流控规则和降级规则

新增sentinel1降级规则(这个检验一个人完成不了,因为本身我们会睡眠1s,无法实现1s三次请求,理论上1s内访问3次后,比例为1超过了设定的0.5,会直接熔断5s,5s可重新访问):

java微服务商城高并发秒杀项目--009.流控规则和降级规则

异常比例

在shop-order-server项⽬的SentinelController.java类新增fallBack2⽅法:

@RestController
@Slf4j
public class SentinelController  {@RequestMapping("/sentinel1")public String sentinel1() throws InterruptedException {TimeUnit.SECONDS.sleep(1);return "sentinel1";}@RequestMapping("/sentinel2")public String sentinel2() {return "sentinel2";}@RequestMapping("/sentinel3")public String sentinel3() {return "sentinel3";}int i=0;@RequestMapping("/fallBack2")public String fallBack2(){log.info("fallBack2执⾏业务逻辑");//模拟出现异常,异常⽐例为33%if(++i%3==0){throw new RuntimeException();}return "fallBack2"; }
}

异常数降级(一般每三次请求会被降级一次):

java微服务商城高并发秒杀项目--009.流控规则和降级规则

异常数降级(1s内出现1个异常就降级,熔断5s)

java微服务商城高并发秒杀项目--009.流控规则和降级规则