Sentinel初始化之InitFunc实现类加载

Alibaba Sentinel - 集群流量控制 集群流控可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有10台机器,我们给每台机器设置单机限流阈值为10QPS,理想情况下整个集群的限流阈值就为100QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。集群流控客户端,用于向所属TokenServer通信请求token。... 阅读详情

  这里简单记录一下Sentinel在接收第一次请求来临是做的初始化准备工作.此工作是利用JDK的ServiceLoader(A simple service-provider loading facility)加载实现的.Sentinel的所有准备工作都是从加载InitFunc开始,然后InitFunc的实现类又使用ServiceLoader去加载其它需要加载资源.
第一次请求来临时,也就是调用entry();方法的时候

  /**
    * Checking all {@link Rule}s about the resource.
    *
    * @param name the unique name of the protected resource
    * @throws BlockException if the block criteria is met, eg. when any rule's threshold is exceeded.
    */
   public static Entry entry(String name) throws BlockException {
       return Env.sph.entry(name, EntryType.OUT, 1, OBJECTS0);
   }

进入这个方法的时候就Env.class中的静态代码块开始了初始化工作.

public class Env {
  public static final NodeBuilder nodeBuilder = new DefaultNodeBuilder();
  public static final Sph sph = new CtSph();
  static {
      // 如果初始化失败,进程将会退出
      InitExecutor.doInit();
  }
}

进入InitExecutor阅读:

/**
* 加载已经注册的功能模块,并按照注册的顺序执行
*/
public final class InitExecutor {
  private static AtomicBoolean initialized = new AtomicBoolean(false);
  /**
   *如果在加载某一个{@link InitFunc}出现异常,初始化进程将立即中断,应用将退出.
   * 初始化动作只执行一次.
   */
  public static void doInit() {
  	//判断是否是第一次初始化,不是则直接返回
      if (!initialized.compareAndSet(false, true)) {
          return;
      }
      try {
      //此处去加载"META-INF/services/"目录下所配置的所有实现了InitFunc接口的类
          ServiceLoader<InitFunc> loader = ServiceLoader.load(InitFunc.class);
          List<OrderWrapper> initList = new ArrayList<OrderWrapper>();
          for (InitFunc initFunc : loader) {
              RecordLog.info("[InitExecutor] Found init func: " + initFunc.getClass().getCanonicalName());
              //将加载完的所有实现类排序
              insertSorted(initList, initFunc);
          }
          for (OrderWrapper w : initList) {
          //挨个执行每个InitFunc实现类的init()方法,init()方法又会去加载其它所需资源
              w.func.init();
              RecordLog.info(String.format("[InitExecutor] Initialized: %s with order %d",
                  w.func.getClass().getCanonicalName(), w.order));
          }
      } catch (Exception ex) {
          RecordLog.warn("[InitExecutor] Init failed", ex);
          ex.printStackTrace();
      } catch (Error error) {
          RecordLog.warn("[InitExecutor] Init failed with fatal error", error);
          error.printStackTrace();
          throw error;
      }
  }
  private static void insertSorted(List<OrderWrapper> list, InitFunc func) {
  //获取func的执行顺序
      int order = resolveOrder(func);
      int idx = 0;
      for (; idx < list.size(); idx++) {
          if (list.get(idx).getOrder() > order) {
              break;
          }
      }
      //按照执行顺序的先后加到list中
      list.add(idx, new OrderWrapper(order, func));
  }
  private static int resolveOrder(InitFunc func) {
  //获取实现类的执行顺序,如果没有指定InitOrder则是最大执行顺序Integer.MAX_VALUE
      if (!func.getClass().isAnnotationPresent(InitOrder.class)) {
          return InitOrder.LOWEST_PRECEDENCE;
      } else {
          return func.getClass().getAnnotation(InitOrder.class).value();
      }
  }
  private InitExecutor() {}
  //将InitFunc 实现类和自己的执行顺序包装在OrderWrapper 中
  private static class OrderWrapper {
      private final int order;
      private final InitFunc func;
      OrderWrapper(int order, InitFunc func) {
          this.order = order;
          this.func = func;
      }
      int getOrder() {
          return order;
      }
      InitFunc getFunc() {
          return func;
      }
  }
}

InitFunc.class

public interface InitFunc {
    void init() throws Exception;
}

InitFunc的实现类大约有如下几个(其中也包括一些测试用例中的):

  1. CommandCenterInitFunc:用与初始化所有CommandCenter;
  2. DefaultClusterClientInitFunc:用与初始化集群限流客户端的所需资源;
  3. DefaultClusterServerInitFunc:用与初始化集群限流服务端的所需资源;
  4. FileDataSourceInit:用于初始化文件数据源,在实际生产中我们可以用MySQL或Nacos等作为数据源;
  5. HeartbeatSenderInitFunc:用于初始化心跳发送者,此处有两个选择HttpHeartbeatSender,SimpleHttpHeartbeatSender;
  6. ParamFlowStatisticSlotCallbackInit:用于初始化参数流控回调.

此处InitFunc就加载完了,至于init()方法去加载其它的资源我将会在其它文章中分享.

Sentinel网关规则持久化:Nacos配置中心推模式解决重启丢失 微服务架构中,网关限流是保障系统稳定性的第一道防线。Sentinel作为主流流量控制组件,默认将网关流控规则与API分组存储在JVM内存中,导致服务重启后规则全部丢失,生产环境频繁出现“限流失效”问题。规则持久化改造的关键在于理解GatewayRuleManager与ApiDefinitionManager的独立存储机制,并借助Nacos配置中心的推模式,实现规则文本统一管理、变更实时推送、秒级生效。通过InitFunc扩展点与NacosDataSource,将网关规则与API分组动态加载进内存,即可在不修 阅读详情

相关推荐

ali sentinel应用与dashboard连接的初始化过程

总体来说,是通过 static 代码 java.util.ServiceLoader 装载实现类,ServiceLoader用途可以参看https://blog.youkuaiyun.com/qq_30739519/article/details/51164954 优先级判断 来实现,具体过程 sphU/O类调用 com.alibaba.csp.sentinel.Env,ENV 类通过static co...

weixin_40455124的博客 737

入门篇-sentinel初始化之InitFunc(一)

入门篇-sentinel初始化之InitFunc(一)

sharedCode源码交流 1605

流量防卫兵的内功心法:Sentinel 滑动窗口、插槽链、流控整形、熔断状态机与集群令牌的源码推演

本文以阿里开源的流量治理组件Sentinel为解剖对象,从一次大促雪崩复盘出发,沿统计、编排、判定、下发、协同五层主线拆解其实现:环形数组滑动窗口如何以极低成本统计实时指标,插槽链与SPI如何编排建节点、记统计、查规则,快速失败、匀速排队、冷启动预热三种整形的源码推导,熔断三态状态机与借鉴BBR的系统自适应保护,热点参数令牌桶与来源控制,推模式动态规则闭环,以及集群令牌服务的阈值类型与失效退回。文中数字均来自随附六个可运行程序,并给出十条生产落地经验,帮助读者看懂阈值的来历与熔断恢复的快慢。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 87万+

spring cloud alibaba 学习(十四)Sentinel初始化InitFunc

目录一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('igno..

码易的博客 1755

手把手教你用Github提交CVE漏洞(附完整截图流程)

本文提供了在GitHub平台提交CVE漏洞的完整实战指南。从前期准备、目标搜寻与漏洞验证,到撰写规范的GitHub Issue进行披露,最后通过官方渠道完成CVE提交,手把手教你如何将安全研究成果转化为获得国际认可的CVE编号。

weixin_28309571的博客 323

AS7341光谱传感器实战:如何用STM32F103精准测量环境色温(附完整代码)

本文详细介绍了如何使用STM32F103驱动AS7341光谱传感器实现环境色温的精准测量。从硬件连接到驱动开发,再到色温计算算法的实现,提供了完整的代码示例和优化建议,帮助开发者在智能照明、农业监测等领域快速应用AS7341进行高精度色温检测。

weixin_30352645的博客 477

SpringCloud Alibaba - Sentinel初始化InitFunc

在Spring Cloud Alibaba项目中,Sentinel 的初始化过程主要通过一系列的InitFunc实现。InitFunc是 Sentinel 提供的一种初始化扩展点,允许开发者在 Sentinel 启动时执行一些自定义的初始化逻辑。Sentinel 为 Spring Cloud Alibaba 提供了多个内置的InitFunc,以支持自动集成和配置初始化。

qq_33240556的博客 566

单机多环境部署apollo 2.3.0

理解apollo的整体架构后,对比nacos配置中心功能点,其设计的复杂度以及完整度相较nacos而言更为丰富 对于不同的环境,例如 FAT, PRO 在部署时进程已经完全物理隔离,并且每个环境config/adminservice依赖的数据也完全物理隔离(连接不同的db),在数据隔离与安全方面做的很完善,但同时也提升了架构的复杂度 而 portal 可以管理多个环境,单节点部署虽然有单点问题,但并不会影响业务从configservice读取配置, 挂掉只要重启就可以,只是在

Life is a starting point everywhere 1299

sentinel执行流程

一,规则的创建 FlowRuleManager.loadRules(rules) 流控 DegradeRuleManager.loadRules(rules);降级 AuthorityRuleManager.loadRules(rules);校验 二,核心业务的入口 entry = SphU.entry(KEY);key 为资源名称 三,加载spi扩展接口,进行环境初始化逻辑 List<InitFunc> initFuncs = SpiLoader.of(InitFunc.class)./

qq_43440134的博客 421

osgEarth shapefile矢量生成三维模型案例 2.boston.earth

osgEarth shapefile矢量生成三维模型案例 2.boston.earth 波士顿城市建筑、路灯、公园、道路shp矢量生成三维模型案例。

qq_24934183的博客 3543

VASPKIT绘制平面平均电荷差分密度

平面平均密度差(planar-averaged electron density difference)是密度差的衍生。密度差是个三维空间函数,经常通过绘制平面图、等值面图方式图形化考察。虽然这两种图很直观,但平面图会受到截面选取的影响,而等值面图会受到等值面数值(isovalue)选取的影响,因此都有一定任意性,也不容易定量讨论。对于电子转移有比较明确方向的情况,可以绘制平面平均密度差曲线,由此可以清楚地考察垂直于选取的方向上每个截面上的密度差积分值,在定量讨论、对比上比较便利。

weixin_43948934的博客 1万+

Sentinel源码剖析之执行流程

上述讲了SCG Sentinel执行流程,这里给一个SpringBoot集成Sentinel的执行流程,两则本质上执行流程一致StatisticSlot计数,底层通过LongAdder实现,why?1、LongAdder底层通过cas保证高并发情况下的线程安全2、LongAdder底层通过add,decrement,sum这些现成的API可以使用熔断器在哪计数?下篇写为什么要用滑动窗口算法?原理是什么?怎么实现?下篇写。

白鸽 1231

实测iOS和安卓大不同!用NFC触发小程序跳转的完整避坑指南(含NFC Tools配置)

本文深入解析iOS与安卓在NFC触发小程序跳转时的核心差异,提供微信与支付宝小程序的NFC实现方案及优化技巧。涵盖跨平台兼容性测试方法论、性能优化策略及异常处理方案,帮助开发者避开常见陷阱,提升跳转成功率。特别针对NFC Tools配置和微信Universal Link使用进行详细指导。

asdfghjkl978564的博客 434

Sentinel源码解析之初始化过程

原创不易,转载请注明出处 文章目录前言1.关于spi技术2.初始化过程介绍3.源码解析总结 前言 我们这篇文章要介绍下sentinel初始化的这么一个过程,在上一篇《Sentinel源码解析之一次请求走进Sentinel》我们也介绍过,你项目启动sentinel是不会初始化的,只有你发起请求经过sentinel(就是需要sentinel进行流控的时候,才会触发它的初始化工作),本文准备以sentinel与servlet适配的那个CommonFilter 为切入点,看看sentinel初始化都干些什么事.

猿上生活 1159

9、自动定理证明的发展历程与关键技术

本文全面介绍了自动定理证明的发展历程、关键技术及其实际应用,包括消解原理、参数化、支撑集策略等核心方法,并探讨了算法优化、数据结构优化及并行计算等提升效率的手段。同时,文章展望了未来发展方向,如深度学习在定理证明中的应用、交互式定理证明以及高阶逻辑的研究前景。

ll5678的博客 505

1、掌握 Microsoft Dynamics 365 Business Central 开发全解析

本文全面解析了Microsoft Dynamics 365 Business Central的开发全流程,涵盖开发环境搭建、AL语言扩展开发、定制解决方案实现、高级开发技术、文件与报表处理、打印功能、调试与性能优化、API使用、Azure和Power Platform集成、DevOps实践以及生成式AI应用。同时探讨了开发工具技巧、常见问题解决、开发流程优化、团队协作要点及未来技术趋势,帮助开发者系统掌握Business Central开发核心技能,提升企业级应用开发效率与质量。

food6的博客 110

sentinel 不显示项目_Sentinel之从启动来分析加载过程

之前介绍过dashboard模块也引入的sentinel的核心模块sentinel-core,所以这里通过启动dashboard来分析sentinel在系统初次加载过程中做了什么?本文基于:1.3.0-GA版本一、启动dashboard项目dashboard项目通过CommonFilter过滤器实现对资源的保护的。image.png启动项目后,访问首页,默认localhost:8080在过滤器Co...

weixin_32926649的博客 1155

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringCoudAlibaba之Sentinel下-底层篇

Sentinel 1.8.1 底层原理篇 ---楼兰 文章目录一、Sentinel整体流程1、初始化加载2、构建责任链3、处理限流请求二、动态规则扩展1、通过API直接修改三、Sentinel的扩展点1、初始化函数InitFunc2、流程处理逻辑ProcessorSlot ​ Sentinel的底层其实相对来说,流程还是比较简单明了的,他的很多精彩之处是在他的算法当中。其实站在Sentinel的角度,这也很容易理解。他的业务目的就是限流,那要做的就是针对特定的指标,对数据进行分析收集,再计算。然后,对于Se

roykingw的专栏 1624

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

sentinel框架基于SPI机制的二次开发

概述 sentinel框架是一个优秀的开源流控应用。基于sentinel框架可以实现流控降级等一系列的系统保护机制。sentinel的使用,可以参照网上的一系列教程。今天讲讲,如何基于SPI机制,扩展sentinel的功能。 sentinel虽然提供了丰富的降级限流功能,但是有时候,依旧不能满足实际的开发需要,这个时候就需要扩展sentinel框架的功能。前端页面的扩展,此处就不做过多讲解。通过实现sentinel提供的接口,可以实现规则的不同方式的持久化。 此处主要讲解server管控端扩展了新的规则后,

猫舍 1791

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Sentinel-客户端集成Apollo配置中心

文章目录JDK SPI机制Sentinel中的InitFunc 对于Java主流框架SpringBoot,客户端可以通过spring-cloud-starter-alibaba-sentinel来快速接入Sentinel控制台,具体接入方法见下面链接,本文不做具体介绍 https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel 继...

hosaos的博客 2211

sentinel源码解析之-sentinel dashboard与客户端连接建立过程

sentinel 源码解析之sentinel dashboard与sentinel客户端连接过程

水中加点糖 3883

通俗易懂的阿里Sentinel源码分析:如何向控制台发送心跳包?

HeartbeatSender sender = HeartbeatSenderProvider.getHeartbeatSender();

万猫学社 1万+

apollo持久化sentinel_Sentinel 原理-如何为系统设置扩展点

Sentinel 系列教程,现已上传到 github 和 gitee 中,并会长期更新 Sentinel 中的知识点和实践经验,我希望用更简单的demo和更易懂的图文描述慢慢揭开 Sentinel 的面纱,欢迎大家加入一起学习,为 Sentinel 的发展做出一点贡献:GitHub:https://github.com/all4you/sentinel-tutorialGitee:https://...

weixin_42347731的博客 116

sentinel 阿里 原理_阿里限流中间件Sentinel 原理-如何为系统设置扩展点

作者 逅弈来源:公众号:逅弈逐码Sentinel 系列教程,现已上传到 github 和 gitee 中,并会长期更新 Sentinel 中的知识点和实践经验,我希望用更简单的demo和更易懂的图文描述慢慢揭开 Sentinel 的面纱,欢迎大家加入一起学习,为 Sentinel 的发展做出一点贡献:GitHub:https://github.com/all4you/sentinel-tutori...

weixin_39968410的博客 233

Sentinel 指标导出指南:用 sentinel-metric-exporter 将流控指标接入 JMX 与 Prometheus 等监控系统

本篇技术指南围绕 Sentinel 仓库中的 `sentinel-metric-exporter` 扩展模块展开,讲解如何在不改动业务代码的前提下,把 Sentinel 采集到的 QPS、Block、RT、并发数等实时指标通过 JMX MBean 暴露出来,进而接入 Prometheus 等监控系统。读完本文,你将掌握该模块的引入方式、MBean 结构、底层运行机制(定时采集、注册/更新/清理的生

gitblog_00489的博客 472

第三篇:Sentinel控制台使用与客户端自动连接原理分析

sentinel控制台使用和客户端自动连接

gb4215287的博客 1393
上一篇: 用栈实现队列
下一篇: ETL工具kettle之循环job
涛濤
博客等级 码龄12年 136粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值