背景:内部要进行应用jdk&springboot升级,因此也需要将Spring Cloud Hystrix 替换成alibaba sentinel。
依赖
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
- <version>2022.0.0.0-RC2version>
- dependency>
-
- <dependency>
- <groupId>com.alibaba.cspgroupId>
- <artifactId>sentinel-datasource-nacosartifactId>
- <version>1.8.6version>
- 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进行抛出。