Sentinel笔记

1.Sentinel 是什么

Sentinel 是面向分布式服务架构的轻量级流量控制框架,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。

2.Sentinel 基本概念

  • 资源
    资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
    只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

  • 规则
    围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

3.总体的框架如下

Sentinel笔记_第1张图片
*从源码看,SystemSlot和AughorizeSlot应该是在FlowSlot之前执行的。这张图也只讲了几个slot,缺少完整的架构图
Sentinel笔记_第2张图片

4.代码示例

1)代码段限流直接调用SphU

Entry entry = null;
 
try {
    entry = SphU.entry(KEY);
    // do something
} catch (BlockException e1) {
    block.incrementAndGet();
} catch (Exception e2) {
    // biz exception
} finally {
    if (entry != null) {
        entry.exit();
    }
}

2)dubbo使用拦截器调用SphU

@Activate(group = "consumer")
public class SentinelDubboConsumerFilter extends AbstractDubboFilter implements Filter {
 
    public SentinelDubboConsumerFilter() {
        RecordLog.info("Sentinel Dubbo consumer filter initialized");
    }
 
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Entry interfaceEntry = null;
        Entry methodEntry = null;
        try {
            String resourceName = getResourceName(invoker, invocation);
            interfaceEntry = SphU.entry(invoker.getInterface().getName(), EntryType.OUT);
            methodEntry = SphU.entry(resourceName, EntryType.OUT);
 
            Result result = invoker.invoke(invocation);
            if (result.hasException()) {
                // Record common exception.
                Tracer.trace(result.getException());
            }
            return result;
        } catch (BlockException e) {
            return DubboFallbackRegistry.getConsumerFallback().handle(invoker, invocation, e);
        } catch (RpcException e) {
            Tracer.trace(e);
            throw e;
        } finally {
            if (methodEntry != null) {
                methodEntry.exit();
            }
            if (interfaceEntry != null) {
                interfaceEntry.exit();
            }
        }
    }
}

5.源码分析

  1. 入口类
  • 需要注意:
    SlotChainBuilder配置在下面这个文件中:com.alibaba.csp.sentinel.slotchain.SlotChainBuilder
    如果配置了DefaultSlotChainBuilder以外的builder,则不使用DefaultSlotChainBuilder。

  • DefaultSlotChainBuilder构建的slot chain,slot顺序:
    1.NodeSelectorSlot 2.ClusterBuilderSlot 3.LogSlot 4.StatisticSlot 5.SystemSlot 6.AuthoritySlot 7.FlowSlot 8.DegradeSlot
    其中NodeSelectorSlot必须排第一个,因为调用时node参数是null,必须由NodeSelectorSlot选择一个node

  1. 功能插槽
    Sentinel笔记_第3张图片
  • 各个插槽的作用:
    LogSlot:捕捉异常,并记录日志,类似aop
    StatisticSlot:统计线程数、请求数、阻塞的、异常的
    SystemSlot:校验total qps、total thread、maxRt、highestSystemLoad、highestCpuUsage
    AuthoritySlot:黑白名单
    FlowSlot:限流
    DegradeSlot:熔断降级

  • 需要注意fireEntry方法,slot插槽的业务执行顺序不是固定的。比如:
    先执行下一个slot,再执行自身业务:LogSlot、StatisticSlot
    先执行自身业务,再执行下一个slot:SystemSlot、AuthoritySlot、FlowSlot、DegradeSlot

  1. dubbo adapter
    Sentinel笔记_第4张图片

  2. dashboard
    Sentinel笔记_第5张图片

  3. datasource
    Sentinel笔记_第6张图片

  4. command center

  • transport模块用于dashboard和客户端之间通信,支持netty或http两种通信方式
    transport-common中定义了很多handler,作用和web开发中的controller一样

  • CommandCenter用于服务端接收客户端上报的数据
    HeartbeatSender用于客户端向服务端上报数据

  1. 心跳服务
    用于监控客户端服务器信息
  2. 拉取客户端统计数据
    Sentinel笔记_第7张图片

6.主流框架的适配

Web Servlet、dubbo、SpringCloud、Spring WebFlux、gRpc…
因为已经支持了这么多主流框架,如果开发框架发生了变化,迁移的成本低

7.未完善之处

1)开源版本规则没有持久化,都是内存操作,需要自己开发持久化。生产环境可以使用ahas sentinel控制台,效果未知:https://github.com/alibaba/Sentinel/wiki/AHAS-Sentinel-控制台
2)开源版本的dashboard没有集群,可用性不高
3)实时监控只有5分钟的数据

你可能感兴趣的:(源码)