avatar

SLHAF's blog

SLHAF的个人博客

  • 首页
  • 分类
  • 标签
  • 归档
  • 友链
主页 day_2 分布式入门: Sentinel
文章

day_2 分布式入门: Sentinel

发表于 25天前 更新于 25天前
作者 slhaf
27~35 分钟 阅读

Sentinel

基础知识

功能介绍

day_2_image-20250712162520994.png

架构原理

day_2_image-20250712162656769.png

资源&规则

day_2_image-20250712162808911-17523091489281.png

工作原理

day_2_image-20250712163235345.png

部署与配置

部署

在https://github.com/alibaba/Sentinel/releases下载jar文件后启动,在127.0.0.1:8080可以访问到控制面板

配置

可按照下方进行配置:

spring:
	sentinel:
		transport:
			dashboard: 127.0.0.1:8080 # 配置面板地址
		eager: true # 配置启动时就连接面板

异常处理

day_2_image-20250712211853394.png

在为‘资源’设置规则限制之后,如果触发限制,则会抛出BlockException异常,针对这类异常可以进行一些自定义处理。

Web请求资源

对于Web请求,在触发规则限制后,抛出的BlockException可以被统一的异常处理器(默认为BlockExceptionHandler)统一处理。也可以自定义异常处理器,只需要实现BlockExceptionHandler接口并交给容器管理,如下:

@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, String resourceName, BlockException e) throws Exception {
        PrintWriter printWriter = response.getWriter();
        response.setContentType("application/json");
        printWriter.write("{\"code\":5000,\"message\":\"流控触发\"}");
        printWriter.flush();
        printWriter.close();
    }
}

但这种方式只限于Web请求这类能够被Sentinel 的 Spring WebMVC 适配器自动注册过的资源。

方法级资源

我们也可以通过@SentinelResource(value = "<valueName>", blockHandler = "<handlerMethod>")这种方式将某个方法注册为资源,但此时它们触发规则时抛出的异常不会被MVC处理,需要通过blockHandler、fallback或defaultBlockHandler等设置处理方法,比如:

@Service
public class OrderServiceImpl implements OrderService {

    @SentinelResource(value = "createOrder", blockHandler = "createOrderHandler")
    @Override
    public OrderData createOrder(String id) {
        OrderData orderData = new OrderData();
        orderData.setId(Integer.parseInt(id));
        orderData.setName("order");
        return orderData;
    }

    public OrderData createOrderHandler(String id, BlockException e) {

        OrderData orderData = new OrderData();
        orderData.setId(0);
        orderData.setName("流控触发: " + id + " 异常信息: " + e.getClass().getSimpleName());
        return orderData;
    }
}

fallback与blockHandler相比,除了能够处理规则限制触发的异常外,还能够处理业务异常,只需要调整异常处理方法中的异常参数即可。

OpenFeign

对于OpenFeign远程调用时因触发规则限制产生的BlockException,会自动调用OpenFeignClient定义的兜底方法进行异常处理。

SphU硬编码

除了上述三种外,也可以通过SphU.entry()对于方法内部的逻辑进行资源限制,在触发规则限制后,可以在catch代码块中进行处理逻辑。比如:

@Override
public OrderData createOrderAAA() {
    try {
        SphU.entry("aaa");
        OrderData orderData = new OrderData();
        orderData.setId(0);
        orderData.setName("entry normal");
        return orderData;
    } catch (BlockException e) {
        OrderData orderData = new OrderData();
        orderData.setId(0);
        orderData.setName("entry block");
        return orderData;
    }
}

流控规则

day_2_image-20250712214221510.png

链路模式需关闭context合并:

spring.cloud.sentinel.web-context-unify=false

流控效果

day_2_image-20250712215155560.png

排队等待、Warm up流控效果不支持关联、链路两个流控模式。

熔断规则

day_2_image-20250712222112457.png

断路器原理

day_2_image-20250712225003696.png

热点规则

day_2_image-20250712230933567-17523329748861.png

Web请求默认不支持热点规则,使用时需要先通过@SentinelResource注解定义资源

后端, Sentinel
学习 Java 分布式
许可协议:  CC BY 4.0
分享

相关文章

7月 13, 2025

day_3 分布式入门: Gateway

文章介绍了Spring Cloud Gateway的功能、依赖导入与基础原理,包括路由规则配置、断言规则实现及自定义过滤器开发。通过YAML配置示例展示了路由匹配、负载均衡及路径重写功能,并演示了如何自定义断言和过滤器。还提及全局跨域配置方法,适用于Java分布式系统开发中的API网关实现。

7月 12, 2025

day_2 分布式入门: Sentinel

Sentinel是阿里巴巴开源的分布式系统流量控制组件,提供流控、熔断、热点参数防护等功能。文章介绍了Sentinel的基础架构、资源规则及工作原理,包括部署方式与控制面板配置。重点讲解了异常处理机制,针对Web请求、方法级资源、OpenFeign调用和硬编码四种场景分别提供了BlockException处理方案。详细解析了流控规则(直接/关联/链路模式)和三种流控效果(快速失败/排队等待/Warm up),以及熔断规则和断路器原理。最后说明热点参数规则需配合@SentinelResource注解使用,并需关闭Web上下文合并才能支持链路模式。

7月 10, 2025

day_1 分布式入门: OpenFeign

OpenFeign是Spring Cloud中的声明式HTTP客户端,通过@EnableFeignClients启用并配合@FeignClient注解实现远程服务调用。文章介绍了其依赖配置、超时控制(默认连接10s/读取60s)、重试机制(通过配置文件或Retryer Bean)、请求拦截器实现以及Fallback熔断机制(需结合Sentinel)。OpenFeign提供了集中式的异常处理方案,相比try-catch更优雅,支持通过接口实现兜底逻辑。这些特性使其成为分布式系统中服务调用的重要工具。

下一篇

day_1 分布式入门: OpenFeign

上一篇

day_3 分布式入门: Gateway

最近更新

  • 为无头服务器配置带 GUI 的 Clash 客户端:基于 Xvfb + VNC 的解决方案
  • Manjaro/X11 环境下通过 bbswitch 关闭 NVIDIA 显卡以延长续航
  • 关于Bottles中同一容器内不同应用需要配置不同显卡方案的解决办法
  • day_3 分布式入门: Gateway
  • day_2 分布式入门: Sentinel

热门标签

Java 日常 分布式 Linux 学习 脚本 智能体 香橙派

目录

©2025 SLHAF's blog. 保留部分权利。

使用 Halo 主题 Chirpy