源码分析publicclassEnv{publicstaticfinalSphsph=newCtSph();static{//在Env类的静态代码块中,//触发一系列初始化操作,//包括发送心跳包初始化。//如果未使用Env类,//则不会触发初始操作。//这也印证了官方所说的“确保客户端有流量之前//向控制台发送心跳包”,//因为如果有流量就会使用Env类。InitExecutor.doInit();}}InitExecutor.doInit方法核心源码://通过SPI获取实现InitFunc接口的实现类,//初始化发送心跳包的类为HeartbeatSenderInitFunc。ServiceLoaderloader=ServiceLoaderUtil.getServiceLoader(InitFunc.class);ListinitList=newArrayList();//根据InitOrder注解的值对实现类进行排序for(InitFuncinitFunc:loader){RecordLog.info("找到初始化函数:"+initFunc.getClass().getCanonicalName());insertSorted(initList,initFunc);}//依次调用各个实现类的init方法,//包括HeartbeatSenderInitFunc实现类。for(OrderWrapperw:initList){w.func.init();RecordLog.info(String.format("Executing%swithorder%d",w.func.getClass().getCanonicalName(),w.order));}HeartbeatSenderInitFunc.init方法源码://获取实现类ofHeartbeatSenderthroughSPI,//默认实现类是SimpleHttpHeatbeatSender。HeartbeatSendersender=HeartbeatSenderProvider.getHeartbeatSender();if(sender==null){RecordLog.warn("WARN:NoHeartbeatSenderloaded");return;}//初始化一个支持定时和周期性任务执行的线程池initSchedulerIfNeeded();//获取发送心跳包的时间间隔,如果没有配置//则调用HeartbeatSender.intervalMs方法获取。//在SimpleHttpHeatbeatSender类中,//intervalMs返回的值为10000,也就是10秒。longinterval=retrieveInterval(sender);setIntervalIfNotExists(interval);//设置周期任务scheduleHeartbeatTask(sender,interval);HeartbeatSenderInitFunc.scheduleHeartbeatTask方法核心源码:pool.scheduleAtFixedRate(newRunnable(){@Overridepublicvoidrun(){try{//每interval毫秒,//执行发送者的sendHeartbeat方法sender.sendHeartbeat();}catch(Throwablee){RecordLog.warn("发送心跳错误",e);}}},5000,interval,TimeUnit.毫秒);SimpleHttpHeatbeatSender.sendHeartbeat方法核心源码://通过csp.sentinel.dashboard.server配置,//获取第一个服务器的IP和端口InetSocketAddressaddr=getAvailableAddress();if(addr==null){returnfalse;}SimpleHttpRequestrequest=newSimpleHttpRequest(addr,HEARTBEAT_PATH);//构建心跳包的参数,//包括客户端IP、端口、应用名称等信息。request.setParams(heartBeat.generateCurrentMessage());try{//向服务器发送POST请求SimpleHttpResponseresponse=httpClient.post(request);//当状态码为200时,返回true。如果(response.getStatusCode()==OK_STATUS){返回真;}}catch(Exceptione){RecordLog.warn("发送心跳失败到"+addr+":",e);}returnfalse;callprocess客户端第一次调用分析结果后,默认每10秒向控制台发送一个心跳包。您可以通过SentinelConfig.setConfig方法修改时间间隔配置。例如将发送心跳包的时间间隔改为30秒:SentinelConfig.setConfig(TransportConfig.HEARTBEAT_INTERVAL_MS,"30000");另外还可以热更新控制台的IP和端口。例如:先修改csp.sentinel.dashboard.server的配置值,然后调用SimpleHttpHearbeatSender的getDefaultConsoleIps方法。