14.Sentinel流控

Sentinel是阿里出品的Java分布式流控组件,支持限流、熔断降级等功能,保障微服务稳定性。分为核心库与控制台两部分,提供资源保护及多种流量控制策略。

简介

Sentinel 是阿里基于Java 开发的分布式流控防护组件。从限流、熔断降级、系统负载保护、热点防护等多个维度保障微服务的稳定性。微服务可以轻松整合Sentinel实现流控、服务监控。

Sentinel 分为两个部分:

1.核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

2.控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。Sentinel服务端也是基于SpringBoot 开发,下载后java -jar xxxx.java 运行即启动Sentinel服务端。

资源是Sentinel流控核心概念,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几个步骤:

1.定义资源
2.定义规则
3.检验规则是否生效

先把可能需要保护的资源定义好(埋点),之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

对于主流的框架,Sentinel提供适配,只需要按照适配中的说明配置,Sentinel 就会默认定义提供的服务,方法等为资源。

官方文档:https://github.com/alibaba/Sentinel/wiki

示例

1.下载Sentinel Dashboard并运行java -jar sentinel-dashboard-x.x.x.jar,启动后访问http://localhost:8080

在这里插入图片描述

2.Sentinel 默认用户名密码都是 sentinel,可通过jar包中的配置文件修改(springboot开发的应用)
在这里插入图片描述
注意:Sentinel 会在客户端首次调用时候进行初始化,开始向控制台发送心跳包。因此需要确保客户端有访问量,才能在控制台上看到监控数据。

3.service-consumer模块整合Sentinel,添加sentinel依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

4.service-consumer模块bootstrap.yml配置Sentinel Dashboard

server:
  port: 8020
spring:
  application:
    name: service-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
    sentinel:
      transport:
        dashboard: localhost:8080  # sentinel 服务监听端口
        #client-ip: xxx 客户端ip地址,sentinel服务端会主动调用客户端收集指标
        #port: xxx  sentinel服务端调用的客户端的端口

5.多次访问http://localhost:8020/consumer/test,并刷新Sentinel Dashboard
在这里插入图片描述

6.Sentinel Dashboard 实现了监控信息配置与业务逻辑的分离,对软件开发者更友好,其默认的资源名就是请求映射
在这里插入图片描述

流控

在这里插入图片描述

一秒内多次刷新接口即可出现流控效果
在这里插入图片描述

并发线程数控制
并发数控制用于保护业务线程池不被慢调用耗尽。例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。为应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离)。这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的 overhead 比较大,特别是对低延时的调用有比较大的影响。Sentinel 并发控制不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝,效果类似于信号量隔离。

QPS流量控制

当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制的效果包括以下几种:直接拒绝、Warm Up、匀速排队。

直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

基于调用关系的流量控制

调用关系包括调用方、被调用方;一个方法又可能会调用其它方法,形成一个调用链路的层次关系。

1.根据调用方限流
在这里插入图片描述

2.根据调用链路入口限流:链路限流

在这里插入图片描述

3.具有关系的资源流量控制:关联流量控制
在这里插入图片描述

系统规则

在这里插入图片描述
根据系统指标对应用做流量、降级限制

自定义流控降级异常返回 json

实现com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler接口即可实现自定义流控、降级、系统规则的自定义响应数据。

在这里插入图片描述

import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.fastjson.JSON;
import com.example.alibaba.common.dto.Result;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;


@Component
public class SentinelBlockHandler implements UrlBlockHandler{
    @Override
    public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException e) throws IOException {
        response.setContentType("application/json");

        response.getOutputStream().write(JSON.toJSONString(Result.error("服务忙,请稍后重试","error")).getBytes(StandardCharsets.UTF_8));
    }
}

总结

Sentinel服务主动发起请求连接客户端收集指标信息,客户端默认会监听8719端口,在停止sentinel客户端后sentinel服务端日志信息如下:
在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值