实战:Springboot集成Sentinel实现流量控制、熔断降级、负载保护

news2024/11/22 11:51:57

文章目录

    • 前言
    • 知识积累
      • 流量控制
      • 负载保护
      • 熔断降级
      • 官方文档
    • 实战演练
      • 部署sentinel-dashboard
        • 直接jar包部署
        • docker-compose编排
      • springboot集成sentinel
        • 基础架构搭建
        • sentinel控制台
        • sentinel验证
    • 延伸:系统自适应限流
      • 系统规则
      • 原理
      • 配置页面
    • 写在最后

前言

前面的文章我们学习了Hystrix并和springboot项目进行了集成,实现服务的熔断降级、隔离措施。但是Hystrix对流量的控制不是很好,仅仅信号量也只能对指定的接口进行限流,至于保护机制Hystrix也只是达到指标进行熔断。那么,有没有一种中间件可以在兼容熔断降级的同时精准实现流量控制和负载保护呢?回答是当然有的,就是我们今天的主角Spring Cloud Alibaba Sentinel。
在这里插入图片描述

知识积累

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定。

流量控制

Sentinel 可以针对不同的调用关系,按照指定的指标进行流程整形控制。而且整形的策略有直接拒绝、慢启动预热和匀速器三大模式,开发者可用根据自身需求选用策略实现流量的精准控制。

负载保护

Sentinel 可用提供精准的负载保护机制,如果被调用服务达到最大负载会将请求负载均衡到其他服务提供者上面,如果其他服务也达到了最大负载则会启动服务保护机制让请求流量和服务的负载达到平衡。

熔断降级

Sentinel 也是提供了基础的熔断降级功能,如果服务提供着抛出一次会直接降级走fallback逻辑,如果是配置指标则走blockhander逻辑。当然,如果服务集群达到最大负载会执行熔断功能,防止服务雪崩的发生。

官方文档

https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
在这里插入图片描述

实战演练

部署sentinel-dashboard

下载jar包
https://github.com/alibaba/Sentinel/releases
在这里插入图片描述

直接jar包部署

nohup java -jar -Dserver.port=8109 sentinel-dashboard.jar &

docker-compose编排

有条件的可以直接使用dashboard镜像,如果pull缓慢则考虑自己构建镜像。
dockerfile

# this is sentinel-dashboard dockerfile
# version 1.0
# 基础镜像
FROM openjdk:8-jre
# 维护人
MAINTAINER senfel<187@sina.cn>
#jar
COPY ./sentinel-dashboard.jar /home/app.jar
# 端口
EXPOSE 8109
# 执行命令启动jar
ENTRYPOINT ["java","-jar","/home/app.jar"]

docker-compose.yml

version: '3.3'
services:
  sentinel:
    build: ./
    image: senfel/sentinel-dashboard
    container_name: sentinel-dashboard
    ports:
      - 8109:8109
    environment:
      JVM_OPTS: -server -Xmx512M -Xms512M -XX:MaxMetaspaceSize=256M -XX:CompressedClassSpaceSize=50M -XX:ReservedCodeCacheSize=240M -XX:MaxDirectMemorySize=400M
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "1"
    volumes:
      - "/home/test/demo/sentinel/logs:/root/logs"
      - "/home/test/demo/sentinel/logs:/app-logs"
    command: [
      "--server.port=8109",
      "--logging.file.path=/app-logs"
    ]

构件并启动容器

docker-compose up -d --build

查看sentinel容器

docker ps | grep sentinel

在这里插入图片描述

springboot集成sentinel

基础架构搭建

持久化流量控制规则,其他规则只需要增加配置即可
sentinel持久化到nacos 不持久每次重启都会清除规则

增加maven依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--sentinel持久化到nacos 不持久每次重启都会清除规则-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.0</version>
</dependency>

增加bootstrap.yml配置 nacos自行搭建

server:
  port: 9999
spring:
  application:
    name: test-demo
  profiles:
    active: uat
  cloud:
    nacos:
      config:
        server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
        username: nacos
        password: nacos
        file-extension: yaml
      discovery:
        server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
        username: nacos
        password: nacos
    sentinel:
      transport:
        dashboard: 10.10.22.174:8109
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
            dataId: test-demo-sentinel.json
            data-type: json
            rule-type: flow
            username: nacos
            password: nacos
            
#开启sentinel
feign:
  sentinel:
    enabled: true
  circuitbreaker:
    enabled: true            

nacos新增限流配置

流量控制
resource:资源名称
limitApp:来源应用
grade:阈值类型,0代表线程数,1代表QPS
count:单击阈值
strategy:流控模式,0代表直接,1代表关联,2代表链路
controlBehavior:流控效果,0代表快速失败,1代表Warm Up,2代表排队等待
clusterMode:是否集群

-其他规则大同小异这里不再累述
-nacos配置与本文无关不再累述

[
  {
    "resource": "testFeign",
    "limitApp": "default",
    "grade":   1,
    "count":   1,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  }
]

启动类开启feign与nacos

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@Slf4j
public class TestDemoApplication implements ApplicationRunner {

    public static void main(String[] args) {
        SpringApplication.run(TestDemoApplication.class, args);
    }
}

测试用例

/**
 * testFeign
 * fallback只负责业务异常
 * blockHandler只负责sentinel配置超标
 * 两个都配置,如果都出错,会进入blockHandler
 * @param str
 * @author senfel
 * @date 2023/7/11 14:26
 * @return java.lang.String
 */
@SentinelResource(value = "testFeign",blockHandler = "blockHandler",fallback = "handlerFallback")
@GetMapping("/testFeign")
public String testFeign(String str){
    if(str.contains("y")){
        throw new RuntimeException();
    }
    return testMQService.testFeign(str);
}

/**
 * 异常阻塞处理
 * @param str
 * @author senfel
 * @date 2023/7/11 14:44
 * @return java.lang.String
 */
private String blockHandler(String str, BlockException blockException){
    return "blockHandler"+"-"+str;
}

/**
 * 降级处理
 * @param str
 * @author senfel
 * @date 2023/7/11 14:44
 * @return java.lang.String
 */
private String handlerFallback(String str,Throwable throwable){
    return "handlerFallback"+"-"+str;
}

openfeign降级测试用例

/**
 * @author senfel
 * @version 1.0
 * @date 2023/7/03 15:04
 */
@Service
@FeignClient(value = "test-demo",fallback = FallbackService.class)
public interface TestService {

    /**
     * 测试sentinel
     */
    @GetMapping("/feign")
    String feign(@RequestParam String str);


}



/**
 * FallbackService
 * @author senfel
 * @version 1.0
 * @date 2023/7/3 15:26
 */
@Service
public class FallbackService implements TestService {

    @Override
    public String feign(String str) {
        return ">>>>>客户端服务降级>>>>>";
    }
}

sentinel控制台

postman请求后查看 http://10.10.22.174:8109/

在这里插入图片描述

自动加载配置的流量规则

在这里插入图片描述
在这里插入图片描述

sentinel验证

验证主动控制流量
127.0.0.1:9999/testFeign?str=fffffffffss

在这里插入图片描述

验证异常控制流量
127.0.0.1:9999/testFeign?str=fffffffffyy

在这里插入图片描述

验证客户端feign降级
127.0.0.1:9999/testFeign?str=fffffffffss

在这里插入图片描述

查看实时监控

在这里插入图片描述

延伸:系统自适应限流

系统规则

系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。
系统规则支持以下的模式:
Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5。
CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

原理

我们把系统处理请求的过程想象为一个水管,到来的请求是往这个水管灌水,当系统处理顺畅的时候,请求不需要排队,直接从水管中穿过,这个请求的RT是最短的;反之,当请求堆积的时候,那么处理请求的时间则会变为:排队时间 + 最短处理时间。
在这里插入图片描述

配置页面

在这里插入图片描述

写在最后

Sentinel实现流量控制、熔断降级、负载保护的实际使用个人觉得还是比较简单,只需要根据官方文章集成和配置使用即可。sentinel的流量控制和负载保护以及高性能都优于hystrix,并提供可视化控制台。如果在可用性和可靠性较高和重要的服务集群场景中,可以优先考虑sentinel。

⭐️路漫漫其修远兮,吾将上下而求索 🔍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程6——TCP协议的两大特性:面向字节流 + 异常情况 + 沾包BUG解决方案

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 面向字节流特性 TCP协议接发数据的流程TCP协议面向字节流导致的BUG 三、TCP协议的 异常情况 总结 前言 本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅…

DHorse v1.2.1 发布,基于k8s的发布平台

综述 DHorse是一个简单易用、以应用为中心的云原生DevOps系统&#xff0c;具有持续集成、持续部署、微服务治理等功能&#xff0c;无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用&#xff0c;主要特点&#xff1a;部署简单、操作简洁、功能快速。 优化内…

TypeScript 学习笔记(三):函数

一、函数定义 函数是由一连串的子程序&#xff08;语句的集合&#xff09;所组成的&#xff0c;可以被外部程序调用&#xff0c;向函数传递参数之后&#xff0c;函数可以返回一定的值。 通常情况下&#xff0c;TypeScript 代码是自上而下执行的&#xff0c;不过函数体内部的代…

【说明书】TA3001信号隔离器使用说明书

-为了方便需要的时候查阅分享说明书&#xff0c;特将其整理到CSDN。- 一、产品介绍&#xff1a; 给现场的变送器提供隔离电源&#xff0c;接收变送器输出的电流信号&#xff0c;隔离后输出给系统。该产品需要独立供电。 二、主要技术参数 1、供电电压:18~36 VDC 2、消耗电流…

python的字符串操作

1、字符串的驻留机制 字符串 在Python中字符串是基本数据类型&#xff0c;是一个不可变的字符序列什么叫字符串驻留机制呢? 仅保存一份相同且不可变字符串的方法&#xff0c;不同的值被存放在字符串的驻留池中&#xff0c;Python的驻留机制对相同的字符串只保留一份拷贝&…

想知道MLGO是如何工作的吗?看完这篇文章你就懂了

在当今软件开发领域&#xff0c;代码优化对于提高性能和减小代码体积至关重要。在这方面&#xff0c;内联&#xff08;Inlining&#xff09;被认为是一项关键的优化技术之一。而MLGO能够在编译过程中智能地做出内联/非内联的决策&#xff0c;从而提供更高效、更紧凑的代码。本文…

apk应用完整性校验

测试客户端程序是否对自身完整性进行校验。攻击者能够通过反编译的方法在客户端 程序中植入自己的木马&#xff0c;客户端程序如果没有自校验机制的话&#xff0c;攻击者可能会通过篡改客 户端程序窃取手机用户的隐私信息。 用 ApkTool 将目标 APK 文件解包&#xff0c;命令如…

linux下实现串口功能

1.先从wiringpi库复制一个串口代码 2.查看串口类型 3.将代码修改成ttyS5 4.改完代码后打开串口助手然后编译 代码示例&#xff1a; #include <stdio.h> #include <string.h> #include <errno.h> #include <pthread.h> #include <wiringPi.h> #i…

Ubuntu18.04.6本地部署PaddleSpeech实验代码(CPU版)

前言 因为本人不是搞python和AI的&#xff0c;所以部署这个项目是耗时耗力&#xff0c;本地部署还是挺麻烦的&#xff0c;发现了很多问题&#xff0c;关键就是权限和源代码路径问题&#xff0c;经历了14天&#xff08;大部分时间扔在做系统&#xff0c;装环境&#xff0c;代码阅…

【数学建模】常微分方程

常微分方程 博客园解释 https://www.cnblogs.com/docnan/p/8126460.html https://www.cnblogs.com/hanxi/archive/2011/12/02/2272597.html https://www.cnblogs.com/b0ttle/p/ODEaid.html matlab求解常微分方程 https://www.cnblogs.com/xxfx/p/12460628.html https://www.cn…

使用FreeMarker生成word文件自定义每页页眉或页脚

最新工作中遇到生成word中表格时&#xff0c;要求文档中每页头部和底部都是固定格式的表格&#xff0c;但是内容不一样&#xff0c;头部信息在word中画样式的时候就可以设置为“在各页顶端以标题形式重复出现”&#xff0c;而底部就没有办法这样设置了&#xff0c;之后就想着在…

【GPT模型】遥感云大数据在灾害、水体与湿地领域中的应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

TypeScript 中【class类】与 【 接口 Interfaces】的联合使用解读

导读&#xff1a; 前面章节&#xff0c;我们讲到过 接口&#xff08;Interface&#xff09;可以用于对「对象的形状&#xff08;Shape&#xff09;」进行描述。 本章节主要介绍接口的另一个用途&#xff0c;对类的一部分行为进行抽象。 类配合实现接口 实现&#xff08;impleme…

为什么Mate X3手机屏幕有水也不影响操作?

我知道现在的手机大多都防水&#xff0c;但没想到连折叠屏手机Mate X3在湿水状态下都丝毫不影响操作&#xff0c;现在的华为手机防水都做到这种程度了&#xff1f; 众所周知&#xff0c;如果手机屏幕上有水珠&#xff0c;那么手机的触屏就会变得飘忽不定。 这种“飘忽不定”是…

局域网聊天软件都有哪些?几款常用的局域网聊天软件推荐

随着科技的不断发展&#xff0c;人们在日常生活和工作中越来越需要高效便捷的沟通工具。而局域网聊天软件就是一种在局域网内使用的聊天工具&#xff0c;它能够帮助用户在同一网络内的设备之间进行即时通讯&#xff0c;无需依赖于互联网连接&#xff0c;安全又可靠。下面将为大…

学无止境·MySQL⑥(数据库备份和还原)

数据库备份和还原 备份和还原练习1、创建库和表2、使用mysqldump命令备份数据库中的所有表3、备份booksDB数据库中的books表4、使用mysqldump备份booksDB和test数据库5、使用mysqldump备份服务器中的所有数据库6、使用mysql命令还原第二题导出的book表7、进入数据库使用source命…

“快速批量去除文件夹名称中多余重复文字!轻松实现文件夹改名优化,提升整理效率!“

在日常的电脑使用中&#xff0c;我们常常面临着大量的文件和文件夹需要整理&#xff0c;而其中一个常见的问题就是文件夹名称中存在重复的文字&#xff0c;让整个文件夹结构变得混乱而不易管理。为了解决这一问题&#xff0c;我们自豪地推出了全新的文件夹改名工具&#xff0c;…

华为配置LLDP基本功能

华为配置LLDP基本功能 1.什么是lldp协议 定义 LLDP(Link Layer Discovery Protocol)是IEEE 802.1ab中定义的链路层发现协议。LLDP是一种标准的二层发现方式,可以将本端设备的管理地址、设备标识、接口标识等信息组织起来,并发布给自己的邻居设备,邻居设备收到这些信息后将…

产品新升级!MODBUS/SNMP智能协议转换器

“MODBUS TCP”是一种基于 TCP协议的工业控制设备通信协议&#xff0c;其主要功能是实现现场设备的远程控制。MODBUS TCP采用远程通讯的方式&#xff0c;通过 IP网络进行数据传输&#xff0c;因此其传输速率更快、网络负载更小、灵活性更高。 “ SNMP”是一种用于网络管理的…

如何考过PMP? 备考经历分享

考PMP的目的 周围很多同事、朋友都在学习PMP课程或者已获得证书&#xff0c;在日常工作中发现有些词语已经听不懂&#xff0c;比如项目集、项目组合&#xff0c;比如PM等&#xff0c;为了提升自己也为了能在侃大山时也能参与其中脱离“一清二白”的状态&#xff0c;所以下定决…