Sentinel相关记录

系列文章目录

draft

复制代码
Sentinel 是阿里巴巴开源的 轻量级服务防护组件,主要用于实现以下功能:

流量控制FlowRule(Rate Limiting):限制单位时间内的请求量,防止系统过载。
熔断降级DegradeRule(Circuit Breaker):当某个服务异常时,自动熔断,避免雪崩效应。
系统自适应保护SystemRule:根据系统的负载情况动态调整资源分配。
热点参数限流ParamFlowRule:对某些高频访问的参数进行限流。
集群流控:支持分布式系统的统一限流策略。
Sentinel 的设计目标是 低侵入性、高扩展性、易于集成,常用于微服务架构中。

文章目录


一、Sentinel DashBoard搭建

网上很多教程,省略

二、web接口资源

1、web资源正常和异常请求--preHandle()

返回true, 表述放行,返回false,表示违背设置规则,报错

c 复制代码
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String resourceName = "";

        try {
            resourceName = this.getResourceName(request);
            if (StringUtil.isEmpty(resourceName)) {
                return true;
            } else if (this.increaseReference(request, this.baseWebMvcConfig.getRequestRefName(), 1) != 1) {
                return true;
            } else {
                String origin = this.parseOrigin(request);
                String contextName = this.getContextName(request);
                ContextUtil.enter(contextName, origin);
                Entry entry = SphU.entry(resourceName, 1, EntryType.IN);
                request.setAttribute(this.baseWebMvcConfig.getRequestAttributeName(), entry);
                return true;
            }
        } catch (BlockException var12) {
            BlockException e = var12;

            try {
                this.handleBlockException(request, response, resourceName, e);
            } finally {
                ContextUtil.exit();
            }

            return false;
        }
    }

2、流控规则设置-QPS=1

如果多次请求

c 复制代码
public class DefaultBlockExceptionHandler implements BlockExceptionHandler {
    public DefaultBlockExceptionHandler() {
    }

    public void handle(HttpServletRequest request, HttpServletResponse response, String resourceName, BlockException ex) throws Exception {
        response.setStatus(429);
        PrintWriter out = response.getWriter();
        out.print("Blocked by Sentinel (flow limiting)");
        out.flush();
        out.close();
    }
}

3、自定义异常处理

显示结果:

c 复制代码
在这里插入代码片
c 复制代码
@Component
public class MyBlockException implements BlockExceptionHandler {
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String s, BlockException e) throws Exception {
        httpServletResponse.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = httpServletResponse.getWriter();

        R error = R.error(500, "服务不可用,请稍后再试!" + e.getClass());

        String s1 = objectMapper.writeValueAsString(error);
        writer.write(s1);
        writer.flush();
        writer.close();
    }
}

二、@SentinelResource资源

给 @SentinelResource(value = "createOrder")添加流控规则,违反规则以后

异常, 这是springboot 异常情况默认返回

1、自定义异常处理

c 复制代码
 @SentinelResource(value = "createOrder",blockHandler = "createOrderFallback")
public  public Order createOrder(Long id, Long userId) {}
自定义createOrderFallback
//设置兜底回调
    public Order createOrderFallback(Long id, Long userId, BlockException blockException) {

        Order order = new Order();
        order.setId(id);
        order.setUserId(userId);
        order.setTotalPrice(BigDecimal.ZERO);
        order.setUserName("Fallback User");
        order.setProducts(Arrays.asList()); // 返回空产品列表
        return order;
    }

三、流量控制-流控模式-链路策略



异常情况

/create 不管执行多少次,都是正常的

四、熔断降级

复制代码
切断不稳定调用
快速返回不积压
避免雪崩效应
熔断降级作为保护自身的手段,通常在客户端进行配置


复制代码
在 5 秒的时间窗口内,如果有 5 个请求,并且其中 80% 的请求超时(例如超过 1 秒),则触发熔断。此时如果系统有兜底数据,会返回兜底数据,避免直接报错。
熔断窗口结束后,断路器进入半开状态。此时会尝试发送一个探测请求。如果探测调用成功,断路器将切换为关闭状态,后续请求可以正常调用;如果探测调用失败或依然很慢,断路器保持打开状态,继续拒绝请求,直到下一次熔断条件再次被触发。
相关推荐
老蒋新思维19 小时前
创客匠人洞察:从“个人品牌”到“系统物种”——知识IP的终极进化之路
网络·人工智能·网络协议·tcp/ip·重构·创客匠人·知识变现
lin张19 小时前
Ansible学习总结:从基础命令到Playbook实战
网络·学习·ansible
我是小邵19 小时前
“域名托管”和“SSL 证书缺失”是什么关系?
网络·网络协议·ssl
Henry Zhu12319 小时前
VPP中ACL源码详解第六篇:多核和性能优化实现以及调试与观测
运维·网络·网络协议·计算机网络·性能优化
qq_1508419919 小时前
搭建一个基于星空组网的免费虚拟局域网
网络
不染尘.20 小时前
虚拟网络环境及socket概述
linux·c语言·网络·windows·计算机网络
♛识尔如昼♛20 小时前
计算机组成原理(23) 第五章 - 总线的操作和定时
网络·总线·总线传输和定时
天若有情67320 小时前
我发明的PROTO_V4协议:一个让数据“穿上迷彩服”的发明(整数传输协议)
网络·c++·后端·安全·密码学·密码·数据
春日见20 小时前
虚拟机上由于网络问题无法正常git clone
linux·服务器·网络·人工智能·git·ubuntu·debug
一往无前fgs20 小时前
【国产信创】openEuler 22.03 安全加固:SSH 端口修改完整指南(含防火墙/SELinux 配置)
网络·安全·ssh·openeuler