Sentinel源码分析----Node分析

Sentinel中有很多类型的Node,例如DefaultNode、StatisticNode、ClusterNode、还有个EntranceNode总共四种类型的Node,第一次看的时候非常懵逼,Node是啥?四个Node有什么不同?

上篇文章中,我们看到StatisticSlot中使用了Node去统计了请求信息,那么Node应该就是做请求统计用的,看下Node接口里定义

public interface Node {
   
    long totalRequest();
    long totalSuccess();
    long blockRequest();
    long totalException();
    long passQps();
    long blockQps();
    long totalQps();
    long successQps();
    long maxSuccessQps();
    long exceptionQps();
    long avgRt();
    long minRt();
    int curThreadNum();
    long previousBlockQps();
    long previousPassQps();
    Map<Long, MetricNode> metrics();
    void addPassRequest(int count);
    void addRtAndSuccess(long rt, int success);
    void increaseBlockQps(int count);
    void increaseExceptionQps(int count);
    void increaseThreadNum();
    void decreaseThreadNum();
    void reset();
    void debug();
}

方法比较多,但是方法名字很清晰,那么可以得出结论:

  • 内部实现可以不说,但是对外部来说Node是做为一个请求数据统计和获取的载体

另外再看下四个Node的关系:
image.png

那么这四个Node中,哪个去实现了Node接口的方法呢? 通过代码看到是StatisticNode实现了Node接口的所有方法,也就是说,另外三个Node有两种可能的作用:

  1. DefaultNode、ClusterNode、EntranceNode继承于StatisticNode,基于其提供的数据统计和获取方法,实现自身一些特殊逻辑
  2. StatisticNode提供了默认的方法,DefaultNode、ClusterNode、DntranceNode有自身的计算逻辑,需要重写这些方法

接下来通过具体代码分析,来看下到底是哪种情况。

EntranceNode

首先在上一篇文章中,我们从入口开始分析了整个调用链路流程,最先遇到和Node相关的代码的时候,是在ContextUtil#trueEnter

    //#com.alibaba.csp.sentinel.Constants
    public final static DefaultNode ROOT = new EntranceNode(new StringResourceWrapper(ROOT_ID, EntryType.IN),
        Env.nodeBuilder.buildClusterNode());
    //ContextUtil#trueEnter
    protected static Context trueEnter(String name, String origin) {
   
        Context context = contextHolder.get();
        if (context == null) {
   
            Map<String, DefaultNode> localCacheNameMap = contextNameNodeMap;
            DefaultNode node = localCacheNameMap.get(name);
            if (node == null) {
   
                if (contextNameNodeMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) {
   
                            //....
                } else {
   
                    node = new EntranceNode(new StringResourceWrapper(name, EntryType.IN), null);
                    // Add entrance node.
                    Constants.ROOT.addChild(node);

                    Map<String, DefaultNode> newMap = new HashMap<String, DefaultNode>(
                    contextNameNodeMap.size() + 1);
                    newMap.putAll(contextNameNodeMap);
                    newMap
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
sentinel-dashboard-1.8.2是一个开源的项目,用于监控和管理Sentinel的规则、实时流量、集群节点等信息。它是一个基于Java开发的Web应用程序,采用了Spring Boot框架和Vue.js前端框架。 首先,sentinel-dashboard-1.8.2源码的结构非常清晰和模块化。它分为后端和前端两部分,后端代码位于sentinel-dashboard模块,前端代码位于sentinel-dashboard-frontend模块。这种结构使得代码的维护和扩展变得更加容易。 在后端部分,sentinel-dashboard-1.8.2源码中包含了一系列的Java类,用于实现Sentinel的规则管理、实时数据统计和集群节点的管理等功能。它提供了RESTful的接口用于前端页面的数据获取和交互。这些Java类使用了Spring框架提供的注解和特性,使得代码简洁、易读和易于维护。 在前端部分,sentinel-dashboard-1.8.2源码中的前端代码采用了Vue.js框架进行开发。它使用了一系列的组件来实现不同的功能模块,如规则管理、流量统计、集群节点管理等。前端页面具有良好的交互性和可视化效果,可以方便地进行规则的配置和流量的监控。 另外,sentinel-dashboard-1.8.2源码还使用了一些开源的技术和库,如Redis、MyBatis等,以提供更好的性能和扩展性。 总结来说,sentinel-dashboard-1.8.2源码是一个功能丰富、结构清晰和易于维护的开源项目。通过深入研究和理解源码,开发人员可以对Sentinel的规则管理和流量监控等核心功能有更深入的了解,并根据自己的需求进行二次开发和定制化操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值