CGB2109Step4—Sentinel 限流应用实践(流控)

一、Sentinel简介

Why

保护系统

WHAT

分布式系统的流量防卫兵:它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。

HOW

1.启动,pom,配置

java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
spring:
  cloud:
    sentinel:
      transport:
         dashboard: localhost:8180 # 指定sentinel控制台地址。

2.限流

在这里插入图片描述

小节面试分析

 限流的分类:

1.直接限流(如上图)

2.关联限流(A访问多了限流B)

在这里插入图片描述

 3.链路限流

1.定义:链路模式只记录指定链路入口的流量

2.方式:

第一步:在指定包创建一个ResourceService类,代码如下:

package com.jt.provider.service;
@Service
public class ResourceService{
    @SentinelResource("doGetResource")
    public String doGetResource(){
        return "doGetResource";
    }
}

这个是一个面向切面编程(AOP) 

第二步:在ProviderSentinelController中添加一个方法,例如:

    @Autowired
    private ResourceService resourceService;
    @GetMapping("/sentinel03")
    public String doSentinel03() throws InterruptedException {
        resourceService.doGetResource();
        return "sentinel 03 test";
    }

第三步:在sentinel中配置限流规则,例如: 

在这里插入图片描述

在这里插入图片描述 

在这里插入图片描述

3.注意:

说明,流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在application.yml添加如下语句来关闭URL PATH聚合,例如:
 

sentinel:
     web-context-unify: false

这样就可以一次搞两个以上的方法了

4.异常进行自定义处理

1.自定义一个异常类

package com.jt.provider.service;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class ResourceBlockHandler {
  
    public static String call(BlockException ex){
        log.error("block exception {}", ex.getMessage());
        return "访问太频繁了,稍等片刻再访问";
    }
}

     * 注意此方法中的异常类型必须为BlockException它是所有限流,降级等异常的父类类型)
     * 方法的返回值类型为@SentinelResource注解描述的返回值类型
     * 方法的其他参数为@SentinelResource注解描述的方法参数,
     * 并且此方法必须为静态方法


     第二步:修改@SentinelResource注解中的属性定义,例如:

@SentinelResource(value="doGetResource",
        blockHandlerClass = ResourceBlockHandler.class,
        blockHandler = "call")
public String doGetResource(){
    return "do get resource";
}

第三步:演示

/**
 * 演示链路限流
 * @return
 */
@GetMapping("/sentinel03")
public String doSentinel03(){
   return resourceService.doGetResource();

}

小节面试分析

 常见问题分析

  • 为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行)
  • 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)
  • Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)
  • @SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点)
  • Sentinel常用限流效果有哪些?(快速失败,预热,排队)
  • Sentinel中限流被触发时出现的异常类型是什么?(都是BlockException类型的子类)
  • 如何对限流结果进行处理?(有默认处理方案,我们也可以自己定义处理规则-实现BlockExceptionHandler接口)
  • Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)
     

在这里插入图片描述 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值