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

简介: // 在Env类的静态代码块中, // 触发了一系列初始化操作, // 其中就包括发送心跳包的初始化。 // 如果Env类一直没有被用到, // 那么不会触发该初始操作。 // 这也印证了官方的“确保客户端有访问量, // 才开始向控制台发送心跳包”的说法, // 因为有访问量就会用到Env类。

源码分析

public class Env {
    public static final Sph sph = new CtSph();
    static {
        // 在Env类的静态代码块中,
        // 触发了一系列初始化操作,
        // 其中就包括发送心跳包的初始化。
        // 如果Env类一直没有被用到,
        // 那么不会触发该初始操作。
        // 这也印证了官方的“确保客户端有访问量,
        // 才开始向控制台发送心跳包”的说法,
        // 因为有访问量就会用到Env类。
        InitExecutor.doInit();
    }
}

InitExecutor.doInit方法的核心源码:

// 通过SPI获取实现了InitFunc接口的实现类,
// 其中初始化发送心跳包的类是HeartbeatSenderInitFunc。
ServiceLoader<InitFunc> loader = ServiceLoaderUtil.getServiceLoader(InitFunc.class);
List<OrderWrapper> initList = new ArrayList<OrderWrapper>();
// 按照InitOrder注解的值对实现类进行排序
for (InitFunc initFunc : loader) {
    RecordLog.info("Found init func: " + initFunc.getClass().getCanonicalName());
    insertSorted(initList, initFunc);
}
// 按照顺序调用每一个实现类的init方法,
// 其中也包括HeartbeatSenderInitFunc实现类。
for (OrderWrapper w : initList) {
    w.func.init();
    RecordLog.info(String.format("Executing %s with order %d",
        w.func.getClass().getCanonicalName(), w.order));
}

HeartbeatSenderInitFunc.init方法的源码:

// 通过SPI获取HeartbeatSender的实现类,
// 默认的实现类是SimpleHttpHeartbeatSender。
HeartbeatSender sender = HeartbeatSenderProvider.getHeartbeatSender();
if (sender == null) {
    RecordLog.warn("WARN: No HeartbeatSender loaded");
    return;
}
// 初始化一个支持定时及周期性任务执行的线程池
initSchedulerIfNeeded();
// 获取发送心跳包的时间间隔,如果没有配置
//则调用HeartbeatSender.intervalMs方法获取。
// 在SimpleHttpHeartbeatSender类中,
// intervalMs返回的数值是10000,也就是10秒。
long interval = retrieveInterval(sender);
setIntervalIfNotExists(interval);
// 设置周期性任务
scheduleHeartbeatTask(sender, interval);

HeartbeatSenderInitFunc.scheduleHeartbeatTask方法的核心源码:

pool.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        try {             
            // 每隔interval毫秒,
            // 执行一次sender的sendHeartbeat方法。
            sender.sendHeartbeat();
        } catch (Throwable e) {
            RecordLog.warn("Send heartbeat error", e);
        }
    }
}, 5000, interval, TimeUnit.MILLISECONDS);

SimpleHttpHeartbeatSender.sendHeartbeat方法的核心源码:

// 通过csp.sentinel.dashboard.server配置,
// 获取第一个服务端的IP和端口
InetSocketAddress addr = getAvailableAddress();
if (addr == null) {
    return false;
}

SimpleHttpRequest request = new SimpleHttpRequest(addr, HEARTBEAT_PATH);
// 构建心跳包的参数,
// 包括客户端IP、端口、应用名称等信息。
request.setParams(heartBeat.generateCurrentMessage());
try {
    // 向服务端发送POST请求
    SimpleHttpResponse response = httpClient.post(request);
    // 状态码为200时,返回true。
    if (response.getStatusCode() == OK_STATUS) {
        return true;
    }
} catch (Exception e) {
    RecordLog.warn("Failed to send heartbeat to " + addr + " : ", e);
}
return false;

调用流程

分析结果

在客户端首次调用后,默认为每隔10秒向控制台发送心跳包。
可以通过SentinelConfig.setConfig方法修改间隔配置,比如,把心跳包发送时间间隔改为30秒:

SentinelConfig.setConfig(TransportConfig.HEARTBEAT_INTERVAL_MS, "30000");

另外,热更新控制台的IP和端口也有可能实现,比如:先修改csp.sentinel.dashboard.server的配置值,然后再调用SimpleHttpHeartbeatSender的getDefaultConsoleIps方法。

最后,谢谢你这么帅,还给我 点赞关注
相关文章
|
4天前
|
存储 运维 Serverless
Serverless 应用引擎产品使用之阿里函数计算中返回函数计算2.0控制台如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
23 1
|
4天前
希望阿里的小伙伴在控制台的易用性多上点心,每次问客服好像都是外包人员,啥也不会
希望阿里的小伙伴在控制台的易用性多上点心,每次问客服好像都是外包人员,啥也不会
9 2
|
4天前
|
存储 监控 测试技术
深入理解Sentinel系列-2.Sentinel原理及核心源码分析(上)
深入理解Sentinel系列-2.Sentinel原理及核心源码分析
97 0
|
7月前
|
监控 Java API
sentinel 控制台用法
sentinel 控制台用法
65 0
|
JSON 监控 安全
Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!
Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!
|
JSON 监控 算法
阿里限流神器Sentinel夺命连环 17 问?
阿里限流神器Sentinel夺命连环 17 问?
|
算法 Nacos Sentinel
Sentinel源码分析总结
写作目的 最近在看Sentinel源码,遇到了几个问题,想再此记录和分享一下遇到的几个问题,方便读者看到我的文章后就不用在继续搜索了。
106 0
Sentinel源码分析总结
|
存储 监控 前端开发
【深入浅出Sentinel原理及实战】「基础实战专题」零基础探索分析Sentinel控制台开发指南(3)
【深入浅出Sentinel原理及实战】「基础实战专题」零基础探索分析Sentinel控制台开发指南(3)
188 0
【深入浅出Sentinel原理及实战】「基础实战专题」零基础探索分析Sentinel控制台开发指南(3)
阿里限流神器Sentinel夺命连环 17 问?
什么是sentinel? sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集
|
SQL 移动开发 监控
Sentinel控制台规则配置
Sentinel控制台规则配置
Sentinel控制台规则配置