eureka client进行注册的关键类在DiscoveryClient,初始化了定时调度线程池、心跳检查线程池、缓存刷新线程池,还初始化了进行和eureka server通信的相关组件
在initScheduledTasks()方法中,执行定时调度任务(CacheRefreshThread),每隔30S会刷新注册表;执行定时调度任务(HeartbeatThread),每隔30S发送一次心跳;
真正进行发起注册的逻辑在实例化InstanceInfoReplication,在构造方法中并没发现什么蛛丝马迹,直到看到instanceInfoReplication.start()方法,它自己本身就实现Runable接口,是一个可执行的线程类,通过定时任务进行调用,我们发现首次调用是延迟40S后才会执行线程的run()方法,此后每30S进行一次调用,在run()方法终于看到了注册的方法,discoveryClient.register()方法,这个方法里面看到了所谓的http调用,所以才真正从源码角度知道eureka client发起注册是基于http协议。不过eureka并没有采用国内spring mvc框架,最终会进入ApplicationResource.addInstance()方法,跟着核心调用路径走到AbstractInstanceRegistry.reginster()方法,看到了注册表的存储结构为Map<String,Map<String,Least<InstanceInfo>>
每注册一个服务实例,期望每分钟发送心跳次数的应该加2(因为每30S发送一次心跳),默认服务续约时间为90S
这次需要注册的服务会加入recentRegisteredQueue和recentlyChangeQuene队列
小结:这里可能有个疑问,40S后才发起注册,不是立刻就注册吗,因为我们平时使用的是Spring Cloud Eureka框架,对原生eureka框架进行了改造