Spring Boot集成Resilience4J实现断路器功能
创作时间:
作者:
@小白创作中心
Spring Boot集成Resilience4J实现断路器功能
引用
CSDN
1.
https://blog.csdn.net/dot_life/article/details/140882444
什么是Resilience4J?
Netflix Hystrix 断路器是 Spring Cloud 中最早就开始支持的一种服务调用容错解决方案,但是目前的 Hystrix 已经处于维护模式了,虽然这并不影响已经上线的项目,并且在短期内,你甚至也可以继续在项目中使用 Hystrix 。但是长远来看,处于维护状态的 Hystrix 走下历史舞台只是一个时间问题,特别是在 Spring Cloud Greenwich 版中,官方已经给出了 Hystrix 的建议替代方案。如下图:
Resilience4j 是 Spring Cloud Greenwich 版推荐的容错解决方案,它是一个轻量级的容错库,受 Netflix Hystrix 的启发而设计,它专为 Java 8 和函数式编程而设计。 Resilience4j 非常轻量级,因为它的库只使用 Vavr (以前称为 Javaslang ),它没有任何其他外部库依赖项。相比之下, Netflix Hystrix 对Archaius 具有编译依赖性,这导致了更多的外部库依赖,例如 Guava 和 Apache Commons 。而如果使用Resilience4j,你无需引用全部依赖,可以根据自己需要的功能引用相关的模块即可。 Resilience4j 也提供了一系列增强微服务可用性的功能,主要功能如下:
- 断路器
- 限流
- 基于信号量的隔离
- 缓存
- 限时
- 请求重试
今天我么主要讲解断路器是如何实现的?
实验工程
实验目的
实现断路器功能
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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>resilience4j</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</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-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot3</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
controller
package com.et.resilience4j.controller;
import com.et.resilience4j.model.Activity;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@Slf4j
@RequestMapping("/activity")
@RestController
public class ActivityController {
private RestTemplate restTemplate;
private final String BORED_API = "http://www.liuhaihua.cn/api/activity";
public ActivityController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping
@CircuitBreaker(name = "randomActivity", fallbackMethod = "fallbackRandomActivity")
public String getRandomActivity() {
ResponseEntity<Activity> responseEntity = restTemplate.getForEntity(BORED_API, Activity.class);
Activity activity = responseEntity.getBody();
log.info("Activity received: " + activity.getActivity());
return activity.getActivity();
}
public String fallbackRandomActivity(Throwable throwable) {
return "fail to read a Activity from HBLOG";
}
}
entity
package com.et.resilience4j.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/* sample message
{
"activity": "Start a family tree",
"type": "social",
"participants": 1,
"price": 0,
"link": "https://en.wikipedia.org/wiki/Family_tree",
"key": "6825484",
"accessibility": 1
}*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Activity {
private String activity;
private String type;
private String link;
private String key;
private Integer participants;
private Double price;
private Double accessibility;
}
DemoApplication.java
package com.et.resilience4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
application.yaml
spring:
application.name: resilience4j-demo
jackson.serialization.indent_output: true
management:
endpoints.web.exposure.include:
- '*'
endpoint.health.show-details: always
health.circuitbreakers.enabled: true
resilience4j.circuitbreaker:
configs:
default:
registerHealthIndicator: true
slidingWindowSize: 10
minimumNumberOfCalls: 5
permittedNumberOfCallsInHalfOpenState: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
waitDurationInOpenState: 5s
failureRateThreshold: 50
eventConsumerBufferSize: 10
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
测试
- 启动Spring Boot应用工程
- 访问http://127.0.0.1:8080/activity
- 返回
fail to read a Activity from HBLOG
引用
- Cloud Native Applications
热门推荐
PISA 2018数据集:全球教育评估的权威参考
肺活量不足有什么影响 正确锻炼帮助提升肺功能
详细解析牙冠佩戴全过程:从准备到佩戴的每个步骤及注意事项
多方联系巧沟通 庭前调解化纠纷
财经热搜索,解读市场趋势与投资机会
深度解析沪深300指数:投资潜力与策略全攻略
预防流感,你正确洗手了吗?
同样是鸭蛋,“白皮”和“青皮”哪个更好!区别很大,别再乱买了
蜥蜴王组队出装攻略:打造最强阵容的全方位解析
男生烫完头发怎么护理
黑龙庙与古镇街:碛口古镇的两大必游之地
Excel数据去重完全指南:6种实用方法详解
支付个人劳务费如何写会计分录?
电子税局中的发票入账标识功能详解
“乙巳蛇年”还是“已巳蛇年”?追溯干支历法,周口有“迹”可循
如何通过MBTI气质类型理解不同性格
巧克力锅包肉:东北传统与创新的完美结合
法律文书写作评判标准与实践指南
如何知道自己适合从事什么工作?有什么方式方法?
详解ArcGIS 水文分析模型构建
已记录高等植物353种、脊椎动物238种!走进生物天堂云桥湿地
探索视频 CDN:优化视频流媒体体验的关键技术
祭祀的深意与文化传承:为什么我们如此重视祭祖
懒人减重,轻松健康
《逆转裁判5》:无聊的游戏千千万,能让我睡着的游戏却是独一份
港股新股分配机制详解:从公开发售到主动回拨
揭秘支付安全:为什么你的交易无法被篡改
“动”出降压奇迹:高血压患者的运动指南
癌症患者化疗后肿瘤指标不断升高,是病情恶化的表现吗?
腊梅的养殖和养护(易爱又好养——了解腊梅的养殖方法和养护要点)