Spring Cloud【Resilience4j(重试机制、异常比例熔断降级、信号量隔离实现、线程池隔离实现、限流 ) 】(五)

news2024/11/27 21:00:10

 

目录

服务断路器_Resilience4j重试机制

服务断路器_Resilience4j异常比例熔断降级

服务断路器_Resilience4j慢调用比例熔断降级 

服务断路器_Resilience4j信号量隔离实现

服务断路器_Resilience4j线程池隔离实现 

服务断路器_Resilience4j限流 

服务网关Gateway_微服务中的应用 

为什么要使用服务网关 


 

服务断路器_Resilience4j重试机制

 重试机制比较简单,当服务端处理客户端请求异常时,服务端将会开启重试机制,重试期间内,服务端将每隔一段时间重试业务逻辑处理。 如果最大重试次数内成功处理业务,则停止重试,视为处理成功。如果在最大重试次数内处理业务逻辑依然异常,则此时系统将拒绝该请求。

修改YML文件 

resilience4j:
 retry:
   instances:
     backendA:
        # 最大重试次数
       maxRetryAttempts: 3
        # 固定的重试间隔
       waitDuration: 10s
       enableExponentialBackoff: true
       exponentialBackoffMultiplier: 2

服务提供者新增controller方法

/**
* 重试机制
* @return
*/
@GetMapping("/retry")
@Retry(name = "backendA")
public CompletableFuture<String> retry() {
        log.info("********* 进入方法 ******");
        //异步操作
        CompletableFuture<String> completableFuture = CompletableFuture
               .supplyAsync((Supplier<String>) () -> (paymentFeignService.index()));
        log.info("********* 离开方法 ******");
        return completableFuture;
   }

服务断路器_Resilience4j异常比例熔断降级

给coud-consumer-feign-order80添加resilience4j依赖

修改yml文件

resilience4j.circuitbreaker:
 configs:
   default:
      # 熔断器打开的失败阈值
     failureRateThreshold: 30
      # 默认滑动窗口大小,circuitbreaker使用基于计数和时间范围欢动窗口聚合统计失败率
     slidingWindowSize: 10
      # 计算比率的最小值,和滑动窗口大小去最小值,即当请求发生5次才会计算失败率
     minimumNumberOfCalls: 5
      # 滑动窗口类型,默认为基于计数的滑动窗口
     slidingWindowType: TIME_BASED
      # 半开状态允许的请求数
     permittedNumberOfCallsInHalfOpenState: 3
      # 是否自动从打开到半开
     automaticTransitionFromOpenToHalfOpenEnabled: true
      # 熔断器从打开到半开需要的时间
     waitDurationInOpenState: 2s
     recordExceptions:
       - java.lang.Exception
 instances:
   backendA:
     baseConfig: default

编写OrderController

/**
* 异常比例熔断降级
* @return
*/
@GetMapping("/citcuitBackend")
@CircuitBreaker(name = "backendA")
public String citcuitBackend(){
        log.info("************ 进入方法***********");
        String index = paymentFeignService.index();
        log.info("************ 离开方法***********");
        return index;
}

使用JMeter进行压力测试

修改语言

创建线程组 

创建取样器HTTP请求

 

添加查看结果树 

修改线程数量

 修改HTTP请求参数

半开状态只有三次请求 

编写降级方法 

/**
* 异常比例熔断降级
* @return
*/
@GetMapping("/citcuitBackend")
@CircuitBreaker(name = "backendA")
public String citcuitTest(){
        log.info("************ 进入方法***********");
        String index =paymentFeignService.index();
        log.info("************ 离开方法***********");
        return index;
   }  
/**
     * 服务降级方法
     * @param e
     * @return
     */
    public String fallback(Throwable e){
        e.printStackTrace();
            return "客官服务繁忙,稍等一会。。。。";
   }

测试降级方法

1 关闭服务提供者

2 服务消费者发起请求 

产生服务降级

 

服务断路器_Resilience4j慢调用比例熔断降级 

编写OrderController

    /**
     * 慢调用比例熔断降级
     * @return
     */
    @GetMapping("/slowcircuitbackend")
    @CircuitBreaker(name = "backendB",fallbackMethod = "slowfallback")
    public String slowcircuitbackend(){
        log.info("************ 进入方法***********");
        try {
            TimeUnit.SECONDS.sleep(10);
       } catch (InterruptedException e) {
            e.printStackTrace();
       }
        String index = paymentFeignService.index();
        log.info("************ 离开方法***********");
        return index;
   }

编写yml文件

resilience4j.circuitbreaker:
 configs:
   default:
            # 熔断器打开的失败阈值
     failureRateThreshold: 30
      # 默认滑动窗口大小,circuitbreaker使用基于计数和时间范围欢动窗口聚合统计失败率
     slidingWindowSize: 10
      # 计算比率的最小值,和滑动窗口大小去最小值,即当请求发生5次才会计算失败率
     minimumNumberOfCalls: 5
      # 滑动窗口类型,默认为基于计数的滑动窗口
     slidingWindowType: TIME_BASED
      # 半开状态允许的请求数
     permittedNumberOfCallsInHalfOpenState: 3
      # 是否自动从打开到半开
     automaticTransitionFromOpenToHalfOpenEnabled: true
      # 熔断器从打开到半开需要的时间
     waitDurationInOpenState: 2s
     recordExceptions:
       - java.lang.Exception
 instances:
   backendA:
     baseConfig: default
   backendB:
      # 熔断器打开的失败阈值
     failureRateThreshold: 50
      # 慢调用时间阈值 高于这个阈值的
     slowCallDurationThreshold: 2s
      # 慢调用百分比阈值,断路器吧调用事件大于slow
     slowCallRateThreshold: 30
     slidingWindowSize: 10
     slidingWindowType: TIME_BASED
     minimumNumberOfCalls: 2
     permittedNumberOfCallsInHalfOpenState:2
     waitDurationInOpenState: 2s
     eventConsumerBufferSize: 10

服务断路器_Resilience4j信号量隔离实现

POM引入依赖 

<dependency>
     <groupId>io.github.resilience4j</groupId>
     <artifactId>resilience4j-bulkhead</artifactId>
     <version>1.7.0</version>
</dependency>

信号量隔离修改YML文件

resilience4j:
  #信号量隔离
 bulkhead:
   instances:
     backendA:
        # 隔离允许并发线程执行的最大数量
       maxConcurrentCalls: 5
        # 当达到并发调用数量时,新的线程的阻塞时间
       maxWaitDuration: 20ms

编写controller

/**
     * 测试信号量隔离
     * @return
     */
    @Bulkhead(name = "backendA",type = Bulkhead.Type.SEMAPHORE)
    @GetMapping("bulkhead")
    public String bulkhead() throws InterruptedException {
        log.info("************** 进入方法*******");
        TimeUnit.SECONDS.sleep(10);
        String index = paymentOpenFeignService.index();
        log.info("************** 离开方法*******");
        return index;
   }

测试

配置隔离并发线程最大数量为5

服务断路器_Resilience4j线程池隔离实现 

 线程池隔离配置修改YML文件

resilience4j:
 thread-pool-bulkhead:  
   instances:
     backendA:
         # 最大线程池大小
       maxThreadPoolSize: 4
        # 核心线程池大小
       coreThreadPoolSize: 2
        # 队列容量
       queueCapacity: 2

编写controller

    /**
     * 测试线程池服务隔离
     * @return
     */
    @Bulkhead(name = "backendA",type = Bulkhead.Type.THREADPOOL)
    @GetMapping("/futrue")
    public CompletableFuture  future(){
        log.info("********** 进入方法*******");
        try {
            TimeUnit.SECONDS.sleep(5);
       } catch (InterruptedException e) {
            e.printStackTrace();
       }
        log.info("********** 离开方法*******");
        return CompletableFuture.supplyAsync(() -> "线程池隔离信息......");
   }

测试

配置文件设置核心线程2个最大4个服务会一次处理4个请求

服务断路器_Resilience4j限流 

限流YML配置

ratelimiter:
   instances:
     backendA:
        # 限流周期时长。       默认:500纳秒
       limitRefreshPeriod: 5s
        # 周期内允许通过的请求数量。     默认:50
       limitForPeriod: 2

先写Controller

    /**
     * 限流
     * @return
     */
    @GetMapping("/limiter")
    @RateLimiter(name = "backendA")
    public CompletableFuture<String> RateLimiter() {
        log.info("********* 进入方法 ******");
        //异步操作
        CompletableFuture<String> completableFuture = CompletableFuture
               .supplyAsync((Supplier<String>) () ->(paymentFeignService.index()));
        log.info("********* 离开方法 ******");
        return completableFuture;
   }

JMeter压测

线程数 - 5

 

服务网关Gateway_微服务中的应用 

没有服务网关 

问题:

1 地址太多

2 安全性

3 管理问题 

为什么要使用服务网关 

网关是微服务架构中不可或缺的部分。使用网关后,客户端和微服务之间的网络结构如下。 

 

注意: 网关统一向外部系统(如访问者、服务)提供REST API。在 SpringCloud 中,使用Zuul、Spring Cloud Gateway等作为API Gateway来实现动态路由、监控、回退、安全等功能。 

认识Spring Cloud Gateway 

Spring Cloud Gateway 是 Spring Cloud生态系统中的网关,它是基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发的, 旨在为微服务架构提供一种简单有效的、统一的API路由管理方式, 并为微服务架构提供安全、监控、指标和弹性等功能。其目标是替代Zuul。

 

注意: Spring Cloud Gateway 用"Netty + Webflux"实现,不要加入 Web依赖,否则会报错,它需要加入Webflux依赖。 

什么是WebFlux 

Webflux模式替换了旧的Servlet线程模型。用少量的线程处理 request和response io操作,这些线程称为Loop线程,而业务交给响应式编程框架处理,响应式编程是非常灵活的,用户可以将业务中阻塞的操作提交到响应式框架的work线程中执行,而不阻塞的操作依然可以在Loop线程中进行处理,大大提高了Loop线程的利用 率。

 

注意:

Webflux虽然可以兼容多个底层的通信框架,但是一般情况下, 底层使用的还是Netty,毕竟,Netty是目前业界认可的最高性能的通信框架。而Webflux的Loop线程,正好就是著名的 Reactor模式IO处理模型的Reactor线程,如果使用的是高性能的通信框架Netty。

温馨提示:

什么是Netty,Netty 是一个基于NIO的客户、服务器端的编程 框架。提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 

Spring Cloud Gateway特点

1、易于编写谓词( Predicates )和过滤器( Filters ) 。其Predicates和Filters可作用于特定路由。

2、支持路径重写。

3、支持动态路由。

4、集成了Spring Cloud DiscoveryClient。 

实时效果反馈

1.Spring Cloud Gateway 是 Spring Cloud生态系统中的_____。

A 断路器

B 注册发现服务

C 网关

D 以上都不是

2.下列不属于服务网关Gateway特点得是____。

A 支持路径重写

B 支持动态路由 

C 服务熔断

D 集成服务发现

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

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

相关文章

Docker 的数据管理、容器互联、镜像创建

目录 一、数据管理 1.数据卷 2. 数据卷容器 二、容器互联&#xff08;使用centos镜像&#xff09; 三、Docker 镜像的创建 1.基于现有镜像创建 1.1首先启动一个镜像&#xff0c;在容器里修改 1.2将修改后的容器提交为新的镜像&#xff0c;需使用该容器的id号创建新镜像 …

JAVA设计模式——模板设计模式(itheima)

JAVA设计模式——模板设计模式(itheima) 文章目录 JAVA设计模式——模板设计模式(itheima)一、模板类二、子类2.1 Tom类2.2 Tony类 三、测试类 一、模板类 package _01模板设计模式;public abstract class TextTemplate{public final void write(){System.out.println("&…

使用 Docker 快速上手官方版 LLaMA2 开源大模型

本篇文章&#xff0c;我们聊聊如何使用 Docker 容器快速上手 Meta AI 出品的 LLaMA2 开源大模型。 写在前面 昨天特别忙&#xff0c;早晨申请完 LLaMA2 模型下载权限后&#xff0c;直到晚上才顾上折腾了一个 Docker 容器运行方案&#xff0c;都没来得及写文章来聊聊这个容器怎…

c# 使用socket进行tcp通信

服务端开启监听代码示例&#xff1a; //服务端开启监听示例Socket ListenSocket;private void btnStartListen_Click(object sender, EventArgs e){if (ListenSocket null){ListenSocket new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAd…

【cef】2023最新windows编译全流程

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 准备工作环境准备确定要编译的cef版本 2️⃣ 搭建编译环境保证可以访问chrome源码创建代码目录下载自动构建脚本创建.boto文件checkout 版本号创建2个编译脚本 3️⃣ 开始编译下载代码真正的拉取代码修改.gclient运行build.ba…

Debezium日常分享系列之:在 OpenShift 上部署 Debezium

Debezium日常分享系列之&#xff1a;在 OpenShift 上部署 Debezium 一、先决条件二、部署 Strimzi Operator三、为数据库创建机密四、部署Apache Kafka五、部署数据源六、部署 Debezium 连接器七、创建 Debezium 连接器八、验证部署 此过程用于在 Red Hat 的 OpenShift 容器平台…

【C++技能树】Vector类解析与模拟实现

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我bua&#xff01; Vector 0.Vector简介1.Vector常用接口1.1constructor构造函数1.2 iteratorsort与findfindsort 1.3 Capacity相关接口1.4 Modify相关接口 2. Vector模拟实…

uniapp 微信小程序 placeholder字体、颜色自定义

效果图&#xff1a; 1、template <input type"text" placeholder"搜索标题" placeholder-class"placeholder-style"></input>2、style .placeholder-style{color: #2D94FF; }

python_day13_综合案例

导包准备 from pyspark import SparkConf, SparkContext import os import jsonos.environ["PYSPARK_PYTHON"] "D:/dev/python/python3.10.4/python.exe" conf SparkConf().setMaster("local[*]").setAppName("test_spark") sc Sp…

生命游戏(力扣)思维 JAVA

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &…

FreeRTOS源码分析-4 SysTick系统时钟详解

目录 1 SysTick初始化 2 SysTick中断服务函数 3 SysTick任务调度 1 SysTick初始化 初始化流程 配置SysTick装载值使能SysTick时钟源 使能SysTick中断 使能SysTick 其中装载值1ms、10ms、100ms都可以&#xff0c;但是不要小于1ms //main.c //--->osKernelStart(); //--…

vue开源基础框架之岗位管理配置及使用

JVS是面向软件开发团队可以快速实现应用的基础开发脚手架&#xff0c;主要定位于企业信息化通用底座&#xff0c;采用微服务分布式框架&#xff0c;提供丰富的基础功能&#xff0c;集成众多业务引擎&#xff0c;它灵活性强&#xff0c;界面化配置对开发者友好&#xff0c;底层容…

机器视觉:工业自动化和智能化的核心技术

机器视觉作为实现工业自动化和智能化的关键核心技术&#xff0c;是人工智能领域发展最迅速的分支之一。它包括四个关键构件&#xff1a;光源、摄像机、图像采集卡和视觉处理软件&#xff08;集成了AI算法&#xff09;。其中&#xff0c;图像采集卡是工厂自动化中常用的外购组件…

Java多线程基础复习

文章目录 多线程1.进程进程属性并发和并行虚拟地址空间 2.线程概念线程的创建方式 3.Thread类常见构造方法和属性线程的状态优先级后台线程线程是否存活start和run 4. 线程的一些基本操作线程中断(interrupted)线程等待joincurrentThread&#xff08;获取当前线程引用&#xff…

安全开发-JS应用原生开发JQuery库Ajax技术加密编码库断点调试逆向分析元素属性操作

文章目录 JS原生开发-文件上传-变量&对象&函数&事件JS导入库开发-登录验证-JQuery库&Ajax技术JS导入库开发-编码加密-逆向调试 JS原生开发-文件上传-变量&对象&函数&事件 1、布置前端页面 2、JS获取提交数据 3、JS对上传格式判断 <script>…

Spring MVC 详解(2)

目录 3. 返回数据的功能 3.1 返回静态页面 3.2 请求转发 VS 请求重定向 前言 上一篇文章已经介绍了 Spring MVC 框架的两个功能&#xff0c;和前端建立连接的功能和从前端获取参数的功能&#xff0c;还有最后一个功能就是 输出数据的功能。 3. 返回数据的功能 返回的数据大致…

2min搞定 mac pycharm新建导入python项目

mac pycharm新建和导入python项目&虚拟环境配置&下载类库 一、通用设置step1 、通过自定义配置&#xff0c;指定默认虚拟环境变量step2、设置虚拟环境和指定默认工作空间step3 、导入或者新建python项目 二、pycharm新建python项目step1、点击新建【file->newProjec…

appscan 应用

HCL appscan是个常见的web app DAST 扫描工具 有企业版和standalone 版本。大家常用的都是单机版本。企业版平台&#xff0c;集成了IAST。 appscan 使用比较简单&#xff0c;基本输入url 账号密码就开扫了。 用了一段时间几点体验 1 还是需要手动explore的&#xff0c;他自…

ShardingSphere分库分表实战之读写分离原理解析

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

MFC第十九天 记事本项目功能完善和开发、CTabCtrl类与分页模式开发

文章目录 记事本项目功能完善和开发查找界面的记忆功能 、使用F3快捷键自动向下查找功能 的开发单次替换的算法研究 CFileDialog 构造函数详解 应用另存为时选择编码 &#xff08;三种方案&#xff09;vista 样式文件对话框 bVistaStyle 为TRUE时 1pch.hCApp NotePad.cpp 对编码…