踩坑Resilience4j @Bulkhead

news2024/9/30 12:50:38

先说问题情况

系统环境

  1. java version: 17
  2. spring boot: 3.x
  3. spring cloud: 4.x

项目配置和代码

项目中使用了Spring Cloud Circuit Breaker

<dependency>
    <groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>

在代码里面使用了@Bulkhead避免远程服务出现问题或者性能低下时蔓延到当前服务导致当前服务出现资源耗尽。黑话就是解决爆炸半径问题。

@CircuitBreaker(name = "licenseService", fallbackMethod = "buildFallbackLicenseList")
@Bulkhead(name = "bulkheadLicenseService", fallbackMethod = "buildFallbackLicenseList")
public List<License> getLicensesByOrganization(String organizationId) {
    LOGGER.info("find all licenses belong to {}", organizationId);
    LicenseExample example = new LicenseExample();
    example.createCriteria().andOrganizationIdEqualTo(organizationId);
    return licenseMapper.selectByExample(example);
}

当我们运行调试业务时发现@Bulkhead未生效, 代码也没报错,通过日志信息发现线程依然是tomcat的线程。另外从prometheus 指标也能反映@Bulkhead未生效。
查看文档,我在Bulkhead pattern supporting里面发现需要io.github.resilience4j:resilience4j-bulkhead,查看maven 依赖树确实没有io.github.resilience4j:resilience4j-bulkhead,好吧我把它加到pom.xml

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

重新启动项目,测试发现问题依然没变
在这里插入图片描述
经过一番查找发现缺少org.aspectj:aspectjweaver,so在pom.xml中加入

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

why?

debug调试

解决问题后,回过头去分析为什么会应为没有org.aspectj:aspectjweaver@Bulkhead就不生效
io.github.resilience4j.springboot3.bulkhead.autoconfigure.AbstractBulkheadConfigurationOnMissingBean发现了问题

@Bean
@Conditional(value = {AspectJOnClasspathCondition.class})
@ConditionalOnMissingBean
public BulkheadAspect bulkheadAspect(
    BulkheadConfigurationProperties bulkheadConfigurationProperties,
    ThreadPoolBulkheadRegistry threadPoolBulkheadRegistry,
    BulkheadRegistry bulkheadRegistry,
    @Autowired(required = false) List<BulkheadAspectExt> bulkHeadAspectExtList,
    FallbackExecutor fallbackExecutor,
    SpelResolver spelResolver) {
    return bulkheadConfiguration
        .bulkheadAspect(bulkheadConfigurationProperties, threadPoolBulkheadRegistry,
            bulkheadRegistry, bulkHeadAspectExtList, fallbackExecutor, spelResolver);
}

要创建BulkheadAspect 需要经过AspectJOnClasspathCondition条件判断,我们经入AspectJOnClasspathCondition看看是怎么判断的

package io.github.resilience4j.spring6.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class AspectJOnClasspathCondition implements Condition {

    private static final Logger logger = LoggerFactory.getLogger(AspectJOnClasspathCondition.class);
    private static final String CLASS_TO_CHECK = "org.aspectj.lang.ProceedingJoinPoint";

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return AspectUtil.checkClassIfFound(context, CLASS_TO_CHECK, (e) -> logger
            .debug("Aspects are not activated because AspectJ is not on the classpath."));
    }

}

AspectJOnClasspathCondition会检测org.aspectj.lang.ProceedingJoinPoint是否出现在classpath中。
本地调试我们调整日志level就可以看到debug提示

2024-09-30T12:14:04.950+08:00 DEBUG 10525 --- [licensing-service] [           main] i.g.r.s.u.AspectJOnClasspathCondition    : Aspects are not activated because AspectJ is not on the classpath.
2024-09-30T12:14:04.951+08:00 DEBUG 10525 --- [licensing-service] [           main] i.g.r.s.u.AspectJOnClasspathCondition    : Aspects are not activated because AspectJ is not on the classpath.

ok到这里原因就一目了然了。当然文档写的不沟详细也是导致出现这个问题的原因。

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

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

相关文章

Android 简单实现联系人列表+字母索引联动效果

效果如上图。 Main Ideas 左右两个列表左列表展示人员数据&#xff0c;含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表&#xff0c;点击某个item&#xff0c;展示一个气泡组件(它会自动延时关闭)&#xff0c; 左列表滚动并显示与点击的索引列表item …

Solidity智能合约调用其他合约的三种主要方式

在 Solidity 中&#xff0c;智能合约之间的交互非常重要。调用其他合约的功能可以增强合约的灵活性&#xff0c;使其能够执行跨合约操作&#xff0c;比如获取数据、转移资金或触发其他合约的功能。本文将详细介绍 Solidity 中调用其他合约的不同方式及其应用场景。 1. 合约间调…

【Unity踩坑】Unity更新Google Play结算库

一、问题描述&#xff1a; 在Google Play上提交了app bundle后&#xff0c;提示如下错误。 我使用的是Unity 2022.01.20f1&#xff0c;看来用的Play结算库版本是4.0 查了一下文档&#xff0c;Google Play结算库的维护周期是两年。现在需要更新到至少6.0。 二、更新过程 1. 下…

JAVA内存模型!=JVM内存模型

文章目录 前言JVM内存模型JAVA内存模型JAVA内存模型解释的问题可见性问题一致性问题 总结 前言 有很多JAVA开发人员&#xff0c;在被问起&#xff1a;“你知道Java内存模型吗&#xff1f;”&#xff0c;都会回答&#xff1a;“知道&#xff0c;JAVA内存模型分为方法区、堆、……

悟透自己、悟透生活、悟透人生(此文无价)

很多人都会有这样的疑问&#xff1a;“为什么听了很多道理&#xff0c;却依然没有过好这一生&#xff1f;” 古人给出了这样的回答。 王阳明曾说&#xff1a;“知行合一。” 老子则言&#xff1a;“知人者智&#xff0c;自知者明。” 可见&#xff0c;一切问题的根源都出在了我…

CSDN 的 GIt 是没东西吗

虽然说吧 CSDN 的博客也就那样&#xff0c;记得去年的时候 CSDN 出了一个 Git 代码库&#xff0c;被骂得要死&#xff0c;基本上是从外面搬了一堆代码回来。 这回 CSDN 又玩了个新东西&#xff0c;干脆你可以把你的博客文章同步到你在 CSDN 开的代码库上了。 如何同步 在 CS…

数据增强之imgaug的使用

包的导入 path = r"D:\\" # sometimes = lambda aug: iaa.Sometimes(0.5, aug) img = cv2.imread("D:\\photo\\test.jpg") img = cv2.resize(img,(128,128)) # img = cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY) cv2.imwrite(path+"img.jpg",img)随…

python并发编程实战

python并发编程有三种 多线程Thread多进程Process多协程Coroutine cpu密集型计算 cpu密集型也叫计算密集型&#xff0c;是指I/O在很短的时间就可以完成&#xff0c;cpu需要大量的计算处理&#xff0c;特点是cpu占用率相当高 例如&#xff1a;压缩解压缩、加密解密、正则表达…

【Qt】开发环境与下载

这里写目录标题 1 Qt的开发工具概述2 Qt的下载2.1 下载Qt SDK 3. 认识SDK中的重要工具 1 Qt的开发工具概述 Qt支持持多种开发工具&#xff0c;其中⽐较常⽤的开发工具有&#xff1a;Qt Creator、Visual Studio、Eclipse. (1) QtCreator Qt Creator 是⼀个轻量级的跨平台集成…

iot网关是什么?iot网关在工业领域的应用-天拓四方

一、IoT网关的定义 IoT网关&#xff0c;即物联网网关&#xff0c;是物联网&#xff08;IoT&#xff09;系统中的重要组成部分。它主要实现感知网络与通信网络&#xff0c;以及不同类型感知网络之间的协议转换&#xff0c;既能够支持广域互联&#xff0c;也能满足局域互联的需求…

windows系统下Telnet工具的安装步骤

通过控制面板启用Telnet客户端 点击“确定”按钮&#xff0c;按照系统提示完成安装。 打开cmd&#xff0c;输入telnet就可以了

APISIX 联动雷池 WAF 实现 Web 安全防护

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关&#xff0c;提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。 雷池是由长亭科技开发的 WAF 系统&#xff0c;提供对 HTTP 请求的安全请求&#xff0c;提供完整的 API 管理和…

【盘一盘】加密软件有哪些?10款电脑文件加密软件超好用推荐!让您的数据更安全!

在信息洪流中&#xff0c;数据安全如古战场上的坚固堡垒&#xff0c;至关重要。 古人云&#xff1a;"机密深藏&#xff0c;方能安身立命。" 为此&#xff0c;我特意搜罗了10款电脑文件加密软件&#xff0c;它们如同现代版的"八卦阵"&#xff0c;既能保护…

华为/海思 Hi3516CV610 4K@20,6M@30 分辨率,1T 算力 NPU

总体介绍 Hi3516CV610 是一颗应用在安防市场的 IPC SoC 。在开放操作系统、新一代视频编解码标准、 网络安全和隐私保护、人工智能方面引领行业发 展&#xff0c;主要面向室内外场景下的枪机、球机、半球 机、海螺机、枪球一体机、双目长短焦机等产品 形态&#xff0c;打…

Spring - @Import注解

文章目录 基本用法源码分析ConfigurationClassPostProcessorConfigurationClass SourceClassgetImportsprocessImports处理 ImportSelectorImportSelector 接口DeferredImportSelector 处理 ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar 接口 处理Configuratio…

全同态加密算法概览

我们前面有谈到《Paillier半同态加密算法》&#xff0c;半同态加密算法除了支持密文加法运算的 Paillier 算法&#xff0c;还有支持密文乘法计算的 RSA 算法&#xff0c;早期的PSI(隐私求交)和PIR(匿踪查询)都有使用基于RSA盲签名技术来实现。今天我们来谈谈能够有效支持任意函…

【Git原理与使用】分支管理

分支管理 1.理解分支2.创建分支2.1创建分支2.2切换分支2.3合并分支 3.删除分支4.合并冲突4.分支管理策略5.分支策略6.bug分支7.删除临时分支8.小结 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&…

美客多自养号测评的常见问题与解决方案,从零开始的技术指南

美客多(MercadoLibre)主要专注于拉丁美洲市场。涵盖了多个国家&#xff0c;包括阿根廷、巴西、墨西哥、智利、哥伦比亚等&#xff0c;在这些国家占据了重要份额。对于卖家来说&#xff0c;要充分了解平台的特点和市场需求&#xff0c;制定合理的营销策略&#xff0c;不断提升自…

vue使用高德地图,点标记+轨迹

<template><!-- 轨迹--><divv-if"visible"ref"pageTotal"v-loading"loading"class"page-total"><div><divref"pageHead"class"page-head"><div class"head-title" /&…

《最高人民法院关于审理民间借贷案件适用法律若干问题的规定》(最新)民间借贷司法解释全文

原文地址 编辑于&#xff1a; 贵格律师事务所 2024年06月11日 16:04 上海 “ 为正确审理民间借贷纠纷案件&#xff0c;根据《中华人民共和国民法典》《中华人民共和国民事诉讼法》《中华人民共和国刑事诉讼法》等相关法律之规定&#xff0c;结合审判实践&#xff0c;制定本规定…