Spring Cloud Circuit Breaker 使用示例

news2025/8/13 14:42:38

Spring Cloud Circuit Breaker 使用示例

作者: Grey

原文地址:

博客园:Spring Cloud Circuit Breaker 使用示例

CSDN:Spring Cloud Circuit Breaker 使用示例

说明

Spring Cloud Circuit breaker提供了一个跨越不同断路器实现的抽象。它提供了一个一致的API,可以在你的应用程序中使用,允许你的开发者选择最适合你的应用程序需求的断路器实现。

它还支持的实现有如下几种

Resilience4j

Hystrix

Sentinel

Spring Retry

完整代码

spring-cloud-circuit-breaker-usage

环境

  • JDK 1.8+

  • Maven 3.5+

  • Spring Boot 版本:2.7.5

  • Spring Cloud 版本:2021.0.5

项目结构和说明

  • spring-cloud-circuit-breaker-usage:父项目名称
    • server : 服务端端模块
      • src/
      • pom.xml
    • client : 客户端模块
      • src/
      • pom.xml
    • pom.xml:父项目 pom 配置

代码说明

服务端需要引入如下依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

然后暴露一个简单服务

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class BookController {
    @RequestMapping(value = "/recommended")
    public Mono<String> readingList() {
        return Mono.just("book1,book2,book3");
    }
}

暴露端口

server.port=8090

客户端的配置也很简单,核心在ReactiveCircuitBreaker的初始化,客户端的依赖如下

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreakerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Service
public class BookService {

    private static final Logger LOG = LoggerFactory.getLogger(BookService.class);


    private final WebClient webClient;
    private final ReactiveCircuitBreaker readingListCircuitBreaker;

    public BookService(ReactiveCircuitBreakerFactory circuitBreakerFactory) {
        this.webClient = WebClient.builder().baseUrl("http://localhost:8090").build();
        this.readingListCircuitBreaker = circuitBreakerFactory.create("recommended");
    }

    public Mono<String> readingList() {
        return readingListCircuitBreaker.run(webClient.get().uri("/recommended").retrieve().bodyToMono(String.class), throwable -> {
            LOG.warn("Error making request to book service", throwable);
            return Mono.just("local store book");
        });
    }
}

如果需要配置一些熔断条件,则做如下设置即可

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
  .failureRateThreshold(50)
  .waitDurationInOpenState(Duration.ofMillis(1000))
  .slidingWindowSize(2)
  .build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
  .timeoutDuration(Duration.ofSeconds(4))
  .build();

this.readingListCircuitBreaker = circuitBreakerFactory.configureDefault(
                id -> new Resilience4JConfigBuilder(id)
                .timeLimiterConfig(timeLimiterConfig)
                .circuitBreakerConfig(circuitBreakerConfig)

客户端暴露一个接口用于测试

@RestController
public class ReadingController {

    private final BookService bookService;

    public ReadingController(BookService bookService) {
        this.bookService = bookService;
    }

    @RequestMapping("/to-read")
    public Mono<String> toRead() {
        return bookService.readingList();
    }
}

客户端设置端口

server.port=8080

接下来,启动服务端,然后启动客户端,用 Postman 或者其他相关工具访问: http://localhost:8080/to-read

image

然后把服务端停止,模拟服务中断,再次访问: http://localhost:8080/to-read

image

显示了降级后的内容。

参考文档

Spring Cloud Circuit Breaker

spring-cloud-circuitbreaker-demo

Spring Cloud Circuit Breaker Guide

Quick Guide to Spring Cloud Circuit Breaker

spring-retry

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

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

相关文章

留学Essay写作怎么注意具体结构?

留学生都知道Essay一般分为Introduction,Main Body和Conclusion这三个部分&#xff0c;Introduction说明了文章的整体内容&#xff0c;但本身并没有提出任何论点&#xff1b;Conclusion通常简要地概括了正文的要点&#xff0c;并建议进一步研究给出一些或结论性的想法&#xff…

Springboot实现ENC加密

目录1. 为什么要用ENC加密2. jasypt实现ENC加密1. 实现流程2. 说明1. 自定义加密秘钥1. 盐、前缀、后缀2. 自定义加密方案2. 部署方案1. 为什么要用ENC加密 以下是未经过加密的数据库配置&#xff0c;密码均是采用明文密码&#xff0c;很容易导致数据库泄露。 spring:datasou…

gitlab 简单优化 gitlab cpu高,内存高 gitlab 负载飙高

1.首先要说得是&#xff0c;优化不能解决根本问题&#xff0c;机器小水管&#xff0c;再优化还是不行。 我感觉4核8g应该可以&#xff0c;截图这机器是阿里云送的免费一个月 4核8g 内存&#xff0c;不知是不是送得问题&#xff0c;感觉也是hold不住。 负载逛逛升&#xff0c;8…

【springboot】19、数据库操作

文章目录基本说明默认数据源HikariDataSource切换数据源为Druid基本说明 这篇文章介绍如何在springboot的项目中进行数据库的连接&#xff0c;完成数据库操作。 默认数据源HikariDataSource HikariDataSource是springboot的默认数据源&#xff0c;性能十分优秀&#xff0c;我…

【Hack The Box】windows练习-- love

HTB 学习笔记 【Hack The Box】windows练习-- love &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f36d…

【freeRTOS】操作系统之四-事件标志组

事件标志组是实现多任务同步的有效机制之一。 ​ 搞个全局变量不是更简单&#xff1f;其实不然&#xff0c;在裸机编程时&#xff0c;使用全局变量的确比较方便&#xff0c;但是在加上 RTOS 后就是另一种情况了。 使用全局变量相比事件标志组主要有如下三个问题&#xff1a; …

人工智能 AI 绘画 AI绘制的图片 ? 简介的版权,以及如何使用图像生成AI 绘画 ?

人工智能 AI 绘画 AI绘制的图片 ? 简介的版权&#xff0c;以及如何使用图像生成AI 绘画 ? 我认为&#xff0c;许多人认为工作的绘画是人类独有的。 然而&#xff0c;在最新的&#xff0c;大赦国际还可以在工作的绘画和绘画创作大赦国际已经生一个接一个。和有些人感到惊奇的…

Docker从入门到精通,一文详解

一、Docker简介 1、背景 物理机时代 一个物理机上安装操作系统&#xff0c;然后直接运行我们的软件。也就是说你电脑上直接跑了一个软件&#xff0c;并没有开虚拟机什么的&#xff0c;资源极其浪费。 缺点 部署慢成本高 虚拟机都不开&#xff0c;直接上物理机部署应用&#x…

libusb系列-006-Qt下使用libusb1.0.9源码

libusb系列-006-Qt下使用libusb1.0.9源码 文章目录libusb系列-006-Qt下使用libusb1.0.9源码摘要添加宏添加源文件编译文件测试libusb工程源码关键字&#xff1a; Debian、 Linux、 Qt、 libusb、 源码内容背景&#xff1a; 最近项目终于切到Linux下开发了&#xff0c;所以最近的…

生产者消费者问题实践(头歌实验)第1关:生产者消费者问题实践,第2关:进程互斥和同步。

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 题目&#xff1a; 第1关&#xff1a;生产者消费者问题实践 任务&#xff1a; 相关知识 代码&#xff1a; 效果截图&#xff1a; 第2关&#xff1a;进程互斥和同步…

Linux的命令行

命令行的格式 command [-options] [parameter] options和parameter并不是每一个的命令都需要的 ls命令 直接的ls 查看当前文件目录下的所有文件以及文件夹 ls -a 查看所有的同时&#xff0c;查看隐藏的文件&#xff0c;在Linux中以.开头的文件都会被隐藏起来 ls -l 以…

【Java学习笔记】第四章 面向对象编程三部曲(上)

【Java学习笔记】第四章 面向对象编程三部曲&#xff08;上&#xff09; 【Java学习笔记】第四章 面向对象编程三部曲&#xff08;中&#xff09; 【Java学习笔记】第四章 面向对象编程三部曲&#xff08;下&#xff09; 文章目录4.面向对象编程&#xff08;上&#xff09;4.…

Kafka 插件并创建 Kafka Producer 发送

相关说明 启动测试前清空所有数据。每次测试先把所有数据写入 Kafka&#xff0c;再加载 Kafka 插件同步数据到 DolphinDB 中。目的是将同步数据的压力全部集中到 Kafka 插件。以 Kafka 插件从收到第一批数据到收到最后一批数据的时间差作为同步数据的总耗时。 测试流程 加载 …

公网远程连接内网Everything实现快速搜索私有云文件

企业外派出差&#xff0c;已经是稀松平常的事&#xff0c;通常出差的同事都会带一个优盘或移动硬盘。但优盘和硬盘是离线设备&#xff0c;所存储的文件数据无法及时更新&#xff0c;因此能够连接公司主机获得最新文件才是出差的首选。可是公司主机位于内网&#xff0c;且面对浩…

【搭建NextCloud私有云盘服务】采用docker在linux上进行部署,内含nextCloud移植(迁移服务器)方法

1、前言 完成的效果&#xff1a; 在linux上搭建NextCloud云盘服务&#xff0c;可以通过域名访问到云盘服务&#xff0c;并且安装有SSL证书&#xff0c;可进行https访问。 例如&#xff1a; 服务器公网ip为47.110.66.88 域名为&#xff1a;test.huahua.com 可直接通过访问https…

Java#10(String 类的构造方法和练习)

目录 一.String类的构造方法 1.public String()空参构造 2.public String(char[ ] ch2);(对堆区已有的值没有办法复用,数据多会浪费内存空间,而直接赋值如果已有相同数据可以复用,不会在浪费太多内存) 3.public String(byte[ ] bytes) 二.字符串的比较 1.前提基础: 比较…

解决使用svg绘制后下载图片以及下载svg内部嵌套image图片失败的问题。

在使用svg进行图形绘制之后&#xff0c;可能需要下载已经绘制的svg图片&#xff0c;我们可能会遇到以下两种情况&#xff1a; 情况1&#xff1a; <svg width"640" height"400" xmlns"http://www.w3.org/2000/svg" id"svgColumn">…

解决问题 - 错误:不支持发行版本 5

文章目录一、提出问题二、解决问题&#xff08;一&#xff09;设置项目SDK与语言等级&#xff08;二&#xff09;设置模块语言等级&#xff08;三&#xff09;设置Java编译器等级&#xff08;四&#xff09;运行程序&#xff0c;测试问题是否已解决一、提出问题 基于JDK11创建…

阿里Redis最全面试全攻略,读完这个就可以和阿里面试官好好聊聊

简述Redis常用的数据结构及其如何实现的&#xff1f; Redis支持的常用5种数据类型指的是value类型&#xff0c;分别为&#xff1a;字符串String、列表List、哈希Hash、集合Set、有序集合Zset&#xff0c;但是Redis后续又丰富了几种数据类型分别是Bitmaps、HyperLogLogs、GEO。…

年搜索量超 7 亿次背后:这款 APP 用火山引擎 DataTester 完成“数据驱动”

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 双十一刚过&#xff0c;双十二在即&#xff0c;随着线上营销玩法的层出不穷&#xff0c;各平台之间的价格逐渐“内卷”。消费者对跨平台比价的需求越来越强烈&#…