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请求通知客户端进行更新

 

posted @ 2020-11-10 17:18  十块腹肌的SuperMan  阅读(817)  评论(0编辑  收藏  举报