首页 > 其他分享 >sentinel-transport-SPI-HeartbeatSenderInitFunc

sentinel-transport-SPI-HeartbeatSenderInitFunc

时间:2024-09-29 10:33:49浏览次数:1  
标签:sender RecordLog SPI init sentinel HeartbeatSender csp transport

说明

我们引入以下依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
     <version>1.8.6</version>
</dependency>

配置环境变量

-Dcsp.sentinel.dashboard.server=localhost:8080

则会上报到dashboard,如果关闭服务,一段时间时候就会自动剔除,判断是否失联则是根据HeartbeatSenderInitFunc在定期发送心跳的

 

通过初始化com.alibaba.csp.sentinel.init.InitExecutor#doInit 之后,

<1>

com.alibaba.csp.sentinel.init.InitExecutor#doInit

 public static void doInit() {
        //原子性set和判断是否已经初始化
        if (!initialized.compareAndSet(false, true)) {
            return;
        }
        try {
            //SPI获取InitFunc
            ServiceLoader<InitFunc> loader = ServiceLoaderUtil.getServiceLoader(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) {
                //<1-2>com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc#init
                w.func.init();
                RecordLog.info(String.format("[InitExecutor] Executing %s with order %d",
                    w.func.getClass().getCanonicalName(), w.order));
            }
        } catch (Exception ex) {
            RecordLog.warn("[InitExecutor] WARN: Initialization failed", ex);
            ex.printStackTrace();
        } catch (Error error) {
            RecordLog.warn("[InitExecutor] ERROR: Initialization failed with fatal error", error);
            error.printStackTrace();
        }
    }

<1-2>

com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc#init

    @Override
    public void init() {
        //这里也是通过SPI获取HeartbeatSender 我们可以自定义
        HeartbeatSender sender = HeartbeatSenderProvider.getHeartbeatSender();
        if (sender == null) {
            RecordLog.warn("[HeartbeatSenderInitFunc] WARN: No HeartbeatSender loaded");
            return;
        }

        //初始化ScheduledThreadPoolExecutor 通过他来完成定时心跳发送
        initSchedulerIfNeeded();
        //获取心跳间隔时间 我们可以通过环境变量csp.sentinel.heartbeat.interval.ms 
        long interval = retrieveInterval(sender);
        //设置到config 后去使用
        setIntervalIfNotExists(interval);
        //<1-2-1>开启心跳定时发送任务
        scheduleHeartbeatTask(sender, interval);
    }

<1-2-1->

com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc#scheduleHeartbeatTask

 private void scheduleHeartbeatTask(/*@NonNull*/ final HeartbeatSender sender, /*@Valid*/ long interval) {
        pool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    //<1-2-1-1>发送心跳
                    sender.sendHeartbeat();
                } catch (Throwable e) {
                    RecordLog.warn("[HeartbeatSender] Send heartbeat error", e);
                }
            }
        }, 5000, interval, TimeUnit.MILLISECONDS);
        RecordLog.info("[HeartbeatSenderInit] HeartbeatSender started: "
            + sender.getClass().getCanonicalName());
    }

<1-2-1-1>

 public boolean sendHeartbeat() throws Exception {
        if (TransportConfig.getRuntimePort() <= 0) {
            RecordLog.info("[SimpleHttpHeartbeatSender] Command server port not initialized, won't send heartbeat", new Object[0]);
            return false;
        } else {
            //获取dashboard地址 key=ip value=端口
            Tuple2<String, Integer> addrInfo = this.getAvailableAddress();
            if (addrInfo == null) {
                return false;
            } else {
                InetSocketAddress addr = new InetSocketAddress((String)addrInfo.r1, (Integer)addrInfo.r2);
                //获取心跳地址可以通过csp.sentinel.heartbeat.api.path指定 默认是 /registry/machine
                SimpleHttpRequest request = new SimpleHttpRequest(addr, TransportConfig.getHeartbeatApiPath());
                request.setParams(this.heartBeat.generateCurrentMessage());

                try {
                    //http请求发送心跳
                    SimpleHttpResponse response = this.httpClient.post(request);
                    if (response.getStatusCode() == 200) {
                        return true;
                    }

                    if (this.clientErrorCode(response.getStatusCode()) || this.serverErrorCode(response.getStatusCode())) {
                        RecordLog.warn("[SimpleHttpHeartbeatSender] Failed to send heartbeat to " + addr + ", http status code: " + response.getStatusCode(), new Object[0]);
                    }
                } catch (Exception var5) {
                    RecordLog.warn("[SimpleHttpHeartbeatSender] Failed to send heartbeat to " + addr, var5);
                }

                return false;
            }
        }
    }

 

标签:sender,RecordLog,SPI,init,sentinel,HeartbeatSender,csp,transport
From: https://www.cnblogs.com/LQBlog/p/18439097

相关文章

  • sentinel-tansport-SPI-CommandSPI
    说明我们引入以下<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.6</version></dependency>通过初始化com.alibaba.csp.sentinel.init.Ini......
  • 【计算机领域|SPIE独立出版,往届均已被EI&Scopus检索,最快会后三个月EI检索|河南工程学
    第四届计算机、信息工程与电子材料国际学术会议(CTIEEM2024)将于11月15-17日在中国郑州举办,主要围绕“计算机技术”、“信息工程”、“电子材料”、“电气工程”与“控制与自动化”等研究领域展开讨论。老牌会议|涵盖计算机学科 |往届均完成稳定检索大会网站:https://ai......
  • 基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索
    一、Sentinel简介Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel具有以下特征:•丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷......
  • 基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索
    一、Sentinel简介Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel具有以下特征:•丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集......
  • 【LTSpice】【LTM4630】【2. 电压调节仿真】
    文章目录前言一、搭建电路二、开始仿真三.读取直流电压总结前言本篇学习使用LTSpice仿真观察LTM4630的电路,通过阅读手册,自己搭建电路,并配置参数,观察电压输出的变化。一、搭建电路打开LTSpice软件后,Ctrl+N新建一个图纸。按快捷键P,进入器件选择界面,输入LTM4630,单击......
  • sentinel常见运维
    查看规则是否加载成功规则类型URL1系统规则http://{serverip}:{port}/getRules?getParamFlowRules2获取授权规则http://{serverip}:{port}/getRules?type=authority3获取熔断规则http://{serverip}:{port}/getRules?type=degrade4获取限流规......
  • springcloud整合sentinel
    此处只做个简单的springcloud中添加sentinel的demo1、下载sentinel的jar,访问网址:https://github.com/alibaba/Sentinel/releases 2、找到本地jar文件夹,使用cmd或者终端中打开,执行java-jar sentinel-dashboard-1.8.0.jar 启动完成 访问可视化页面,默认账号密码都是sent......
  • STM32 通过 SPI 驱动 W25Q128
    目录一、STM32SPI框图1、通讯引脚2、时钟控制3、数据控制逻辑4、整体控制逻辑5、主模式收发流程及事件说明如下:二、程序编写1、SPI初始化2、W25Q128驱动代码2.1读写厂商ID和设备ID2.2读数据2.3写使能/写禁止2.4读/写状态寄存器2.5擦除扇区2.6擦除整个芯片2......
  • py每日spider案例之网站视频接口
    importrequestscookies={'auth_id':'eyJpdiI6IlUzOEVzajFocW1ydGh4TGE0R00yaXc9PSIsInZhbHVlIjoidmw2UWF0cFJBMGF0TStBM0dBWVFNN09lMFpMV2xlMHdJSG1Ma1g4TUtSV0loKzJEY1psKzVML0ZjeVJUK1BTbk1obkFpYWNMUXdLSTJXWjdOK2lZSFluL3A4WmxkVDNoUElHbGx5UG9......
  • Redis Sentinel:秒杀系统背后的可靠性保障神器!
    哈喽,大家好呀!我是小米,今天我想和大家聊聊如何在个人项目中保证系统的可靠性,尤其是用Redis哨兵模式来保障高可用性。相信很多小伙伴在开发中遇到过Redis挂掉的情况,特别是在高并发场景下,一旦主服务器下线,整个系统可能会因此瘫痪。那我们该如何应对这个问题呢?今天就带大家深入了解......