至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)

Spring Cloud Alibaba全文目录

源码

搭建Maven父工程,傻瓜式操作

初次邂逅SpringCloud Alibaba

一、至高心法 - SpringCloud Alibaba (一)初识 Nacos 以及安装

二、至高心法 - SpringCloud Alibaba (二)Nacos 服务注册与配置中心

三、至高心法 - SpringCloud Alibaba (三)初识 Sentinel 以及安装

四、至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)

文章持续更新中,欢迎关注!

微服务集成Sentinel

Maven父工程:https://blog.csdn.net/qq_42322632/article/details/121712223

1.新建module: springcloudalibaba-sentinel-service8401

至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第1张图片

2.pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloudartifactId>
        <groupId>com.dyh.springcloudgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>springcloudalibaba-sentinel-service8401artifactId>
    
    <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.cspgroupId>
            <artifactId>sentinel-datasource-nacosartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
        <dependency>
            <groupId>com.dyh.springcloudgroupId>
            <artifactId>springcloud-api-commonsartifactId>
            <version>${project.version}version>
        dependency>
    dependencies>


project>

3.application.yml

#yml配置
server:
  port: 8401

spring:
  application:
    name: springcloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        #Nacos服务注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        #配置sentinel dashboard地址
        dashboard: localhost:8080
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719

management:
  endpoints:
    web:
      exposure:
        include: '*'

4.主启动类 MainApp8401

package com.dyh.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @ClassName: MainApp8401
 * @author: dyh
 * @since: 2021/12/16 11:38
 */
@SpringBootApplication
@EnableDiscoveryClient
public class MainApp8401 {
    public static void main(String[] args) {
        SpringApplication.run(MainApp8401.class, args);
    }
}



5. 业务类

FlowLimitController

package com.dyh.springcloud.alibaba.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName: FlowLimitController
 * @author: dyh
 * @since: 2021/12/16 11:39
 */
@RestController
public class FlowLimitController {
    @GetMapping("/testA")
    public String testA() {
        return "--------testA";
    }

    @GetMapping("/testB")
    public String testB() {
        return "--------testB";
    }
}


6. 启动Sentinel

java -jar sentinel-dashboard-1.7.1.jar
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第2张图片

Sentinel 监控

启动8401微服务查看Sentinel控制台
注意点:sentinel默认是懒加载、所以启动成功后其实页面是没有我们集成的微服务信息,当我们随便访问一个接口时才能看到。
先执行一次请求
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第3张图片
然后打开Sentinel监控
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第4张图片

这样Sentinel就在监控微服务8401

Sentinel 流控(限流)

至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第5张图片

流控规则基本介绍

  • 资源名:唯一名称,默认请求路径

  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

  • 阈值类型/单机阈值:

    1. QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
    2. 线程数:当调用该api的线程数达到阈值的时候,进行限流
  • 是否集群:(不)需要集群

  • 流控模式:

    1. 直接:api达到限流条件时,直接限流
    2. 关联:当关联的资源达到阈值时,就限流自己
    3. 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)
  • 流控效果:

    1. 快速失败:直接失败,抛异常
    2. Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
    3. 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS。否则无效。

流控模式——直接 快速失败

QPS:
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第6张图片
每秒内请求超过1次报错,这就是限流了。
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第7张图片
线程数:
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第8张图片

当调用该api的线程数达到阈值的时候,进行限流

流控模式——关联 快速失败

至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第9张图片
当有大量并发请求打到B上,A就限流自己。

流控效果——Warm Up

Warm Up方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过“冷启动”,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第10张图片
默认coldFactor为3,即请求QPS从threshold / 3开始,经预热时长逐渐升至设定的QPS阈值。
秒杀系统在开启的瞬间,会有很多流量进来,很有可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。

流控效果——排队等待

至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第11张图片
至高心法 - SpringCloud Alibaba (四)Sentinel 监控与流控(限流)_第12张图片

你可能感兴趣的:(SpringCloud,Alibaba,spring,cloud,java,spring)