sentinel @SentinelResource 异常处理
1、过程
若SentinelRescourse中有 blockHandler,则调用blockHandler指定的方法进行兜底回调
否则进行全局异常处理
2、blockHandler 指定兜底回调方法
@SentinelResource(value = "createOrder", blockHandler = "createOrderFallBack")
createOrderFallBack 兜底回调方法
3、兜底回调方法
注意
a、兜底方法必须createOrderFallBack与原方法createOrder参数列表完全一致
b、兜底方法必须返回相同类型或兼容类型
c、兜底方法必须位于同一个类中(除非使用 blockHandlerClass
指定)
// 兜底回调 public Order createOrderFallBack(Long userId, Long productId, BlockException e){ Order order = new Order(); order.setId(0L); order.setTotalAmount(new BigDecimal("0")); order.setUserId(userId); order.setNickName("未知的"); order.setAddress("异常信息:"+e.getClass()); order.setProductList(null); return order; }
4、整体
package com.wt.order.service.impl; import com.alibaba.csp.sentinel.slots.block.BlockException; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.wt.order.bean.Order; import com.wt.order.feign.ProductFeignClient; import com.wt.order.service.OrderService; import com.wt.product.bean.Product; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; /** * @Description: TODO * @Author: 1872428 * @Date: 2025/6/7 8:51 * @Version: 1.0 **/ @Service @Slf4j public class OrderServiceImpl implements OrderService { @Autowired private ProductFeignClient productFeignClient; @SentinelResource(value = "createOrder", blockHandler = "createOrderFallBack") @Override public Order createOrder(Long userId, Long productId) { //Product product = getProductRemoteAnno(productId); Product product = productFeignClient.getProductById(productId); Order order = new Order(); order.setId(1L); // 价格 order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum()))); order.setUserId(userId); order.setNickName("lisi"); order.setAddress("徐州"); // 商品列表 order.setProductList(Arrays.asList(product)); return order; } // 兜底回调 public Order createOrderFallBack(Long userId, Long productId, BlockException e){ Order order = new Order(); order.setId(0L); order.setTotalAmount(new BigDecimal("0")); order.setUserId(userId); order.setNickName("未知的"); order.setAddress("异常信息:"+e.getClass()); order.setProductList(null); return order; } }