首页 科技正文

欧博亚洲网址:通俗易懂的阿里Sentinel源码剖析:若何向控制台发送心跳包?

admin 科技 2020-06-30 36 0

源码剖析

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);

迎接关注微信民众号:万猫学社,每周一分享Java手艺干货。

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;

挪用流程

迎接关注微信民众号:万猫学社,每周一分享Java手艺干货。

剖析效果

在客户端首次挪用后,默以为每隔10秒向控制台发送心跳包。
可以通过SentinelConfig.setConfig方式修改距离设置,好比,把心跳包发送时间距离改为30秒:

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

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

微信民众号:万猫学社

微信扫描二维码

获得更多Java手艺干货

,

欧博亚洲客户端

欢迎进入欧博亚洲客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

版权声明

本文仅代表作者观点,
不代表本站申博官网的立场。
本文系作者授权发表,未经许可,不得转载。

评论