IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Cloud Alibaba:整合Sentinel & 流控规则详细介绍 -> 正文阅读

[Java知识库]Spring Cloud Alibaba:整合Sentinel & 流控规则详细介绍

Spring Cloud Alibaba:整合Sentinel & 流控规则详细介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel具有以下特征:

  • 丰富的应用场景Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控Sentinel同时提供实时的监控功能。可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
  • 广泛的开源生态Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring CloudApache DubbogRPCQuarkus的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。同时Sentinel提供Java/Go/C++等多语言的原生实现。
  • 完善的SPI扩展机制:Sentinel提供简单易用、完善的SPI扩展接口。可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel的主要特性:
在这里插入图片描述
Sentinel的开源生态:
在这里插入图片描述
Sentinel分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo / Spring Cloud等框架也有较好的支持。
  • 控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

启动Sentinel

Spring Cloud Alibaba版本关系:

博主这边使用的是2.2.6.RELEASE版本的Spring Cloud Alibaba,因此需要下载1.8.1版本的Sentinel,以及使用兼容的2.3.2.RELEASE版本的Spring Boot

在这里插入图片描述
在这里插入图片描述
启动Sentinel

在这里插入图片描述
服务端口为8080
在这里插入图片描述
访问http://localhost:8080(用户名和密码都是sentinel):
在这里插入图片描述
需要等应用启动并且应用的服务被请求后,Sentinel控制台才会有展示数据。
在这里插入图片描述

整合Sentinel

创建一个maven工程作为父modulepom.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kaven</groupId>
    <artifactId>alibaba</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <description>Spring Cloud Alibaba</description>
    <modules>
        <module>sentinel</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-cloud-alibaba-version>2.2.6.RELEASE</spring-cloud-alibaba-version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

再创建一个maven工程作为子module(需要整合Sentinel的模块)。
在这里插入图片描述

pom.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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>alibaba</artifactId>
        <groupId>com.kaven</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sentinel</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>
</project>

application.yml

server:
  port: 8095

# 暴露所有端点,供Sentinel访问
management:
  endpoints:
    web:
      exposure:
        include: "*"

# 配置Sentinel的dashboard地址和日志输出路径
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
      log:
        dir: ./logs
  # 应用名称
  application:
    name: sentinel

MessageController类:

package com.kaven.alibaba.controller;

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

@RestController
public class MessageController {

    @GetMapping("message")
    public String getMessage() {
        return "hello sentinel";
    }
}

启动类Application

package com.kaven.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

启动应用:
在这里插入图片描述
多次请求接口http://localhost:8095/message
在这里插入图片描述
Sentinel控制台就会展示这些请求的统计信息:
在这里插入图片描述
在这里插入图片描述

流控规则

添加流控规则:
在这里插入图片描述

在这里插入图片描述
阈值类型中QPS表示每秒访问的次数,线程数表示同时可以访问的线程的数量,单机阈值则为具体的数值,如下图所示:
在这里插入图片描述
在这里插入图片描述
快速访问接口http://localhost:8095/message,超过指定QPS会快速失败(返回字符串Blocked by Sentinel (flow limiting)):
在这里插入图片描述

流控模式

在这里插入图片描述
点击高级选项。
在这里插入图片描述
在这里插入图片描述

直接模式

默认的流控模式,直接限制资源名的QPS或者线程数,上面已经演示过了。

关联模式

如果关联资源的访问超过指定的QPS或者线程数,则该资源也会被Sentinel限流。先增加一个接口:

    @GetMapping("kaven")
    public String getKaven() {
        return "hello kaven";
    }

在这里插入图片描述

博主使用Postman来进行测试,每访问一次/kaven资源延迟700ms再继续访问它,一共访问1000次。 在这里插入图片描述
当访问/kaven资源的QPS超过/message资源流控规则指定的QPS时,访问/message资源也会被限流,因为它们是关联的。

在这里插入图片描述
而这种关联关系是单向的,即当访问/message资源的QPS超过/message资源流控规则指定的QPS时,关联的/kaven资源还是可以正常访问的,因为/kaven资源本身并没有设置流控规则。
在这里插入图片描述
在这里插入图片描述

链路模式

之前都是基于Controller层的限流,Sentinel同样支持细粒度的从ControllerService层的限流。

IMessageService接口(服务抽象):

package com.kaven.alibaba.service;

public interface IMessageService {
    String getMessage();
}

MessageServiceImpl类(实现了IMessageService接口,服务实现):

package com.kaven.alibaba.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.kaven.alibaba.service.IMessageService;
import org.springframework.stereotype.Service;

@Service
public class MessageServiceImpl implements IMessageService {
    @SentinelResource("MessageServiceImpl")
    @Override
    public String getMessage() {
        return "MessageServiceImpl";
    }
}

注解@SentinelResource("MessageServiceImpl")会将Service层的getMessage方法作为Sentinel的资源,资源名为MessageServiceImpl

修改接口:

package com.kaven.alibaba.controller;

import com.kaven.alibaba.service.IMessageService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class MessageController {

    @Resource
    private IMessageService messageService;

    @GetMapping("message")
    public String getMessage() {
        return "hello sentinel " + messageService.getMessage();
    }

    @GetMapping("kaven")
    public String getKaven() {
        return "hello kaven " + messageService.getMessage();
    }
}

添加依赖:

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-web-servlet</artifactId>
        </dependency>

还需要一个配置类FilterConfiguration(通过过滤器实现的):

package com.kaven.alibaba;

import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfiguration {
    @Bean
    public FilterRegistrationBean<CommonFilter> registrationBean(){
        FilterRegistrationBean<CommonFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CommonFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
        registrationBean.setName("sentinelFilter");
        return registrationBean;
    }
}

FilterRegistrationBean泛型类用于在Servlet 3.0+容器中注册FilterServletContextInitializer 。 类似于ServletContext提供的registration功能,但具有Spring Bean的友好设计。CommonFilter类是与Sentinel集成的Servlet过滤器。
修改配置文件:

server:
  port: 8095

# 暴露所有端点,供Sentinel访问
management:
  endpoints:
    web:
      exposure:
        include: "*"

# 配置Sentinel的dashboard地址和日志输出路径
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
      log:
        dir: ./logs
      filter:
        enabled: false
  # 应用名称
  application:
    name: sentinel

重新启动应用。先请求几次接口,让Sentinel控制台有展示数据,方便给Service层的资源添加流控规则。

在这里插入图片描述
Service层的MessageServiceImpl资源添加流控规则(针对入口资源/kaven)。在这里插入图片描述
访问/kaven资源超过MessageServiceImpl资源流控规则指定QPS,直接返回500状态码的响应页面。
在这里插入图片描述
应用后台也有日志输出:
在这里插入图片描述
而访问/message资源没有任何限制,因为MessageServiceImpl资源没有针对它的流控规则。

流控效果

快速失败

直接快速失败,返回字符串Blocked by Sentinel (flow limiting)或者返回500状态码的响应页面。

Warm Up

表示应用需要预热一段时间,预热时间内进行更严格的限流(相对于指定的流控规则),预热完成后恢复成指定的限流,如下图所示,QPS3,冷加载因子为3QPS限流阈值初始为3/3并且缓慢增加到阈值为3,时间为120s,一般用于服务器刚刚启动时的场景。
在这里插入图片描述
预热时间内,快速访问资源/kaven会被Sentinel限流(只要QPS超过1)。
在这里插入图片描述
预热完成后,访问/kaven资源QPS超过3才会被Sentinel限流,大家可以自己尝试一下。

排队等待

在这里插入图片描述

在超过资源流控规则指定的QPS后,等待超时时间200毫秒后,如果没有被限流则访问成功,如果被限流则访问失败。使用Postman来进行测试,每访问一次/kaven资源延迟500ms再继续访问它,一共访问100次。
在这里插入图片描述
第一次访问成功,第二次访问超过资源流控规则指定的QPS,会被限流,等待超时时间200毫秒后(500ms + 200ms < 1000ms),访问还是会被限流,以此类推。
在这里插入图片描述
排队的流控效果多用于对一些响应不太稳定的服务做流控。

如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:35:19  更:2021-12-11 15:36:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:43:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码