我们在看流程前看下下面的一个类图,其中client的流程基本都在DiscoveryClient的构造方法中,而eureka-server的逻辑大部分在PeerAwareInstanceRegistryImpl和PeerEurekaNodes中。
这里再介绍下InstanceInfo和EurekClient的区别, 主要用于标示这个应用的实例信息,如应用名称、consumer(provider)等,而EurekClient就是一个客户端的信息,如地址、注册信息等
那么eureka-client启动之前,我们先理一下它应该需要做那些事情。
1、告诉eureka-server(注册)。
2、拉取eureka-server上面的注册信息缓存到本地,实现高可用。
3、同步client的状态给eureka-server(心跳等)。
一、首先介绍下client向eureka-server注册的实现:
那么我们先看eureka-client的注册是怎么实现的,并不是直接注册的,而是通过后台线程是实现的,看下代码:
//DiscoveryClient.java
@Inject
DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args,
Provider<BackupRegistry> backupRegistryProvider) {
//代码省略...
// default size of 2 - 1 each for heartbeat and cacheRefresh
scheduler = Executors.newScheduledThreadPool(2,
new ThreadFactoryBuilder()
.setNameFormat("DiscoveryClient-%d")
.setDaemon(true)
.build());
//代码省略...
// finally, init the schedule tasks (e.g. cluster resolvers, heartbeat, instanceInfo replicator, fetch
initScheduledTasks();
//代码省略...
}
private void initScheduledTasks() {
if (clientConfig.shouldFetchRegistry()) {