sentinel-transport-SPI-HeartbeatSenderInitFunc

news/2024/9/29 10:46:45

说明

我们引入以下依赖

<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获取InitFuncServiceLoader<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

    @Overridepublic 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() {@Overridepublic 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/machineSimpleHttpRequest 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;}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66085.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

这些年出版的书籍——归档整理

随着出版的书籍越来越多,收到的各种邮件也越来越频繁,遂于百忙之中,抽空整理一下书籍相关的资料和信息。《ASP.NET MVC企业级实战》出版日期:2017年3月目录:https://www.cnblogs.com/jiekzou/p/5625762.html随书源码:因某些原因,原百度云盘下载地址已被封,qq群文件里面…

黑马PM-内容项目-内容产品模型

内容产品概述内容产品设计模型

妙用编辑器:使用Notepad--宏功能提高维护指令生成生成效率

应用场景 日常维护工作中,需要快速生成一批指令来完成某些操作,比如:快速添加一批节点。 目标指令列表如下: ADD NODE: ID=1, NAME="NODE_1"; ADD NODE: ID=2, NAME="NODE_2"; ADD NODE: ID=3, NAME="NODE_3"; ADD NODE: ID=4, NAME="N…

网站源码安装后访问首页,页面错乱的处理方法

检查资源文件:确保 CSS、字体、图片和 JavaScript 文件都存在于正确的路径中,并且链接路径正确。 清除缓存:清除浏览器缓存,重新加载页面。 检查编码声明:确保 HTML 文件中有正确的编码声明。 检查模板文件:确保模板文件没有语法错误或其他问题。通过以上步骤,你应该能够…

PBOOTCMS中新增并开启手机端模板,以便为用户提供更好的移动设备浏览体验

在PBOOTCMS中新增并开启手机端模板,以便为用户提供更好的移动设备浏览体验,您可以按照以下步骤操作: 开启手机版开关登录后台:首先,您需要以管理员身份登录PBOOTCMS的后台管理系统。 进入全局配置:在后台菜单中找到“全局配置”或类似命名的选项并点击进入。 找到移动设备…

pbootcms提示:“未检测到您服务器环境的sqlite3数据库扩展…”

当PBootCMS提示“未检测到您服务器环境的sqlite3数据库扩展”时,可以通过以下两种方法来解决: 方法一:修改数据库配置连接驱动为 pdo_sqlite打开数据库配置文件:打开数据库配置文件 /config/database.php。修改数据库类型:找到 type 这一行,将 sqlite 改为 pdo_sqlite。方…

PBOOTCMS如何新增并且开启手机端模板

1. 在后台配置中开启手机版开关登录后台:使用管理员账号登录PBootCMS后台。进入全局配置:在后台菜单中找到并点击 全局配置。进入配置参数:在全局配置页面中找到并点击 配置参数。进入设备适配配置:在配置参数页面中找到并点击 设备适配配置。开启手机版开关:在设备适配配…

JMeter调用python脚本

JMeter调用python脚本 前提具备python环境 具备jdk环境一、编写python脚本 python脚本如下: import random# 随机一个 1~100 的随机数 print(random.randint(1,100))二、使用BeanShell取样器调用python脚本 String command = "python D:\\apache-jmeter-5.5\\bin\\test.p…