sentinel熔断报java.lang.reflect.UndeclaredThrowableException
Sentinel
alibaba/Sentinel: Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量控制、熔断降级组件,提供实时监控、限流、降级和系统保护功能,适用于微服务治理场景。
项目地址:https://gitcode.com/gh_mirrors/sentine/Sentinel
·
背景:内部要进行应用jdk&springboot升级,因此也需要将Spring Cloud Hystrix 替换成alibaba sentinel。
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2022.0.0.0-RC2</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.6</version>
</dependency>
开启Feign对Sentinel的支持

出现错误日志时的代码
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @Author: WeiXiang
* @Desc:
* @Date: Create in 5:09 PM on 2020/6/23.
*/
@FeignClient(value = "messageCenter", path = "/messageCenter/cloudService")
public interface JobApplyRest {
/**
* 获取用户最近的报名兼职list
*
* @desc:
* @author: WeiXiang
* @date: 9:04 PM 2020/6/23
*/
@PostMapping("/userLastMonthApplyPartJob")
String userLastMonthApplyPartJob(@RequestParam("userId") Long userId, @RequestParam("size") Integer size);
}
当达到熔断条件时,则抛出以下错误信息

错误被解决后的代码
解决方案:在FeignClient上,配置自定义fallback熔断降级处理方法
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @Author: WeiXiang
* @Desc:
* @Date: Create in 5:09 PM on 2020/6/23.
*/
@FeignClient(value = "messageCenter", path = "/messageCenter/cloudService", fallback = JobApplyRestFallback.class)
public interface JobApplyRest {
/**
* 获取用户最近的报名兼职list
*
* @desc:
* @author: WeiXiang
* @date: 9:04 PM 2020/6/23
*/
@PostMapping("/userLastMonthApplyPartJob")
String userLastMonthApplyPartJob(@RequestParam("userId") Long userId, @RequestParam("size") Integer size);
}
JobApplyRestFallback类
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @description: 报名单服务容错类
* @author: jiusi
* @create: 2023-09-01 10:23:47
*/
@Service
@Slf4j
public class JobApplyRestFallback implements JobApplyRest{
@Override
public String userLastMonthApplyPartJob(Long userId, Integer size) {
log.warn("熔断降级开启JobApplyRest#userLastMonthApplyPartJob:userId:{}", userId);
return null;
}
}
至此,java.lang.reflect.UndeclaredThrowableException 错误被解决。
问题原因:
sentinel通过代理实现熔断降级,当达到设置的阈值条件时,内部就抛出的自定义受检异常。但该受检异常并未在被代理对象接口定义中进行声明(即:Rest feignClient为被代理对象),那么这个异常就会被JVM包装成UndeclaredThrowableException进行抛出。
alibaba/Sentinel: Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量控制、熔断降级组件,提供实时监控、限流、降级和系统保护功能,适用于微服务治理场景。
最近提交(Master分支:4 个月前 )
222670e6
* fix: Endpoint#toString host formatting; add Endpoint unit test
* test: remove empty EndpointTest.java (fix accidental PR changes)
---------
Signed-off-by: 赖尧 <yujitang_2006@qq.com> 28 天前
e7a9c560
* chore: remove node_modules from git & add to .gitignore
* fix(docs): normalize README table style (MD060) across adapters and cluster modules
* docs: fix compact table style in parameter flow README
* docs: fix markdownlint MD009 and MD060 in README files
* docs: fix table format in parameter-flow-control README (MD060/MD009)
* docs: fix table format in spring-webmvc README files (MD060/MD009)
* fix: restore UTF-8 encoding and fix markdownlint errors
* fix: wrap remaining bare URLs with angle brackets (MD034)
* fix: remove trailing spaces from table rows (MD009)
---------
Signed-off-by: 赖尧 <yujitang_2006@qq.com> 1 个月前
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)