• SpringCloudAlibaba之Sentinel Dashboard服务端源码剖析


    我们先进入启动类:com.alibaba.csp.sentinel.dashboard.DashboardApplication

     看到这里主要就是创建一个线程,然后调用了com.alibaba.csp.sentinel.init.InitExecutor#doInit方法,最后调用启动线程

    我们进入com.alibaba.csp.sentinel.init.InitExecutor#doInit方法中

     可以看到这里主要做三件事1、使用spi加载com.alibaba.csp.sentinel.init.InitFunc的一些实现类;2、将加载后的实现类进行排序;3、调用这些实现类的初始化方法

    我们可以先看看他这里加载的四个实现类分别都是做什么的

    com.alibaba.csp.sentinel.metric.extension.MetricCallbackInit

     我们进这个实现类里去看看里面都做了啥

    进入com.alibaba.csp.sentinel.metric.extension.MetricCallbackInit

     我们可以看到这里主要是注册扩展的入口和出口回调类

    com.alibaba.csp.sentinel.slots.statistic.StatisticSlotCallbackRegistry中是一个map,存放了一些资源对应的回调信息

    进入com.alibaba.csp.sentinel.metric.extension.callback.MetricEntryCallback

     我们可以看到这里主要就是两个方法,一个是通过另一个是阻塞处理方案

    我们再来看看出口回调中做了啥

    进入com.alibaba.csp.sentinel.metric.extension.callback.MetricExitCallback

     可以看到这里主要就是做一些统计信息记录

     这里不经意发现了一个com.alibaba.csp.sentinel.slotchain.SlotChainBuilder

    我们都知道sentinel中的slot是一个比较核心的类,所以我们不妨点进去看看这里干啥了

     我们可以看到这里就是往com.alibaba.csp.sentinel.slotchain.ProcessorSlotChain中添加了一堆slot来构建一个chain

    我们继续往下

    接下来我们看看com.alibaba.csp.sentinel.transport.init.CommandCenterInitFunc里做了啥

     我们可以看到这里主要做三件事1、获取命令中心;2、调用beforeStart方法做一些准备工作;3、调用start方法,这里我们重点关注2和3

    进入com.alibaba.csp.sentinel.transport.CommandCenter#beforeStart方法

     

    可以看到这里主要就是获取dashboard中的提供的接口然后获取对应的处理器分别放入map中,当在dashboard中调用了对一个的接口之后都会触发这些处理器进行处理

    接下来我们看看com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter#start方法里又做了啥

     可以看到这里主要就是创建一个socket然后取监听8719端口,而这个端口我们都知道这是sentinel与客户端通信的端口号

    接下来我们再看看com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc中又做了啥

    可以看到这里主要就是做一些心跳相关的任务初始化

    ok到这里我们基本知道了启动过程主要就是初始化一些接口的处理器、资源出入口回调以及心跳等信息的初始化,接下来我们具体操作配置一下流控规则看看是不是是怎么处理的

     可以看到这里主要做两件事:1、创建一个实体并保存;2、通知客户端

    接下来我们重点关注通知客户端的逻辑

    可以看到这里主要就是获取到选择的客户端的机器列表对应的规则,然后调用com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient#setFlowRuleOfMachine方法

     一路追寻,我们发现最后做走到了com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient#executeCommand方法中而且我们发现这是一个执行命令的方法,而且api名称我们也知道了

    命令?之前启动 的时候我们是不是看到他的命令相关的那个spi扩展?那里好像初始化了命令处理器吧?我们重新走一下流程看看

     果然,这里给定了处理器,那我们想这是不是在客户端需要使用这个处理器进行事件处理呢?

     我们在客户端的com.alibaba.csp.sentinel.command.handler.ModifyRulesCommandHandler中打断点请求果然进来了

    继续跟进com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager#loadRules方法

     继续跟进com.alibaba.csp.sentinel.property.DynamicSentinelProperty#updateValue方法

     这里主要就是对监听器对新值的监听

    所以我们就知道了咱们再dashboard中定义规则,他会发送http请求通知客户端进行更新

  • 相关阅读:
    Static Fields and Methods
    usermod
    理解Java的Class类、"this."关键字、Constructor构造器(一)
    [REPRINT] Java 101: Classes and objects in Java
    第六章 Java并发容器和框架
    第五章 Java中锁
    第四章 Java并发编程基础
    第三章 Java内存模型(下)
    第三章 Java内存模型(上)
    第二章 并发机制的底层实现原理
  • 原文地址:https://www.cnblogs.com/qsky/p/13954904.html
Copyright © 2020-2023  润新知