Spring Cloud Alibaba 学习 -- 3、Sentinel服务限流降级

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

学习视频(B站):www.bilibili.com/video/BV1Mt…
GitHub 源码地址:github.com/tyronczt/sp…

简介

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

雪崩效应

如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住。堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称:雪崩效应。

解决方案

  1. 设置线程超时
  2. 设置限流
  3. 熔断器 Sentinel、Hystrix
  • 降级:在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)
  • 限流:服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶,计数器也可以进行粗暴限流实现。
  • 熔断:熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。

集成Sentinel

  • provider 的 pom.xml 引入依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
  • application.yml 配置
# 配置限流路径
management:
  endpoints:
    web:
      exposure:
        include: "*"
# sentinel的控制面板路径
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
复制代码

用户名/密码:sentinel/sentinel

实时监控

当访问provider项目中index接口时 [http://localhost:3333/index],sentinel会将流量实时记录,每十秒刷新:

在这里插入图片描述

簇点链路

在这里插入图片描述

流控规则

在这里插入图片描述

一般阈值类型选择QPS(Query Per Second每秒查询率)

直接限流

选择单机阈值为1时,即表示每秒查询超过1时,即被流量限制,默认提示:Blocked by Sentinel (flow limiting)

关联限流

流控模式为 **关联 **时,输入关联资源,如list,即效果为:当list超过阈值时,index限制访问

模拟访问list接口:

public static void main(String[] args) throws InterruptedException {
    RestTemplate restTemplate = new RestTemplate();
    for (int i = 0; i < 1000; i++) {
        restTemplate.getForEntity("http://localhost:3333/list",String.class);
        Thread.sleep(200);
    }
}
复制代码

效果: 在这里插入图片描述

链路限流

主要对service或dao层的接口进行限流保护。

pom.xml 添加依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.7.1</version>
</dependency>

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-web-servlet</artifactId>
    <version>1.7.1</version>
</dependency>
复制代码

修改配置文件application.yml

spring:
	cloud:
        sentinel:
          filter:
            enabled: false
复制代码

添加配置类

@Configuration
public class FilterConfiguration {

    @Bean
    public FilterRegistrationBean registrationBean(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new CommonFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
        registrationBean.setName("sentinelFilter");
        return registrationBean;
    }
}
复制代码

Service层

@Service
public class ProviderService {

    @SentinelResource("provider")
    public String provider(){
        return "ProviderService";
    }
}
复制代码

Controller层

@Autowired
private ProviderService providerService;

@GetMapping("/provider1")
public String provider1() {
	return providerService.provider();
}

@GetMapping("/provider2")
public String provider2() {
    return providerService.provider();
}
复制代码

配置规则 在这里插入图片描述

访问:http://localhost:3333/provider2,当QPS超过1时,提示500

猜你喜欢

转载自juejin.im/post/7032168154168033310