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

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

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

java微服务商城高并发秒杀项目--009.流控规则和降级规则_第1张图片

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

java微服务商城高并发秒杀项目--009.流控规则和降级规则_第2张图片

在SentinelController中增加sentinel3的controller:

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

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

java微服务商城高并发秒杀项目--009.流控规则和降级规则_第3张图片

链路流控:

在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:8848
    sentinel:
      transport:
        port: 9999
        dashboard: localhost:8080
      web-context-unify: false 

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

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

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

java微服务商城高并发秒杀项目--009.流控规则和降级规则_第4张图片

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

java微服务商城高并发秒杀项目--009.流控规则和降级规则_第5张图片

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

java微服务商城高并发秒杀项目--009.流控规则和降级规则_第6张图片

异常比例

在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.流控规则和降级规则_第7张图片

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

java微服务商城高并发秒杀项目--009.流控规则和降级规则_第8张图片

你可能感兴趣的:(java,微服务,spring)