Eureka源码(二)— eureka client启动、eureka注册
2021-11-24 10:54:35 2 举报
Eureka源码
作者其他创作
大纲/内容
创建新的租约保存租约
将这个注册请求转发给ApplicationResource的addInstance方法
InstanceRegistry
访问eureka server控制台status.jsp 可以从map中获取到所有服务的信息,显示到页面上
EurekaTransport,在构造DiscoveryClient的时候,调用了scheduleServerEndpointTask()方法,里就初始化了专门用于注册的RegistrationClient。
访问Eureka-Server的apps/${APP_NAME}接口
结束
eureka-client服务注册代码入口
eureka 服务注册
invalidateCache()
LeaseManager
初始化调度任务(启动调度任务)1、定时抓取注册表的调度任务2、给eureka server定时发送心跳的调度任务3、进行复制实例信息定时服务的调度任务4、注册一个状态变更的监听器
discoveryClient.register()
registry 为 PeerAwareInstanceRegistry,PeerAwareInstanceRegistry类图在左侧
I
LookupService
开始
1、leaseDuration 表示租约过期时间,默认是90s,当服务端超过90s没有收到客户端的心跳,则主动剔除该节点2、调用super.register发起节点注册3、把服务实例信息同步到其他eureka server上,就是获得集群中的所有节点,然后逐个发起注册
读取eureka-client.properties中eureka client配置构造EurekaClientConfig、基于ApplicationInfoManager和EurekaClientConfig构造EurekaClient(DiscoveryClient)
C
初始化调度线程池、心跳线程池和缓存刷新线程池
保存InstanceInfo(服务实例)、ApplicationInfoManager(服务实例管理器)、EurekaClientConfig(eureka client配置)、EurekaTransportConfig(网络通信配置)
最近注册的队列recentRegisteredQueue保存注册服务的队列用来做debug或者统计
EurekaClient初始化(构造DiscoveryClient)初始化调度任务方法【initScheduledTasks()】复制实例信息的调度任务instanceInfoReplicator
eureke-client启动与eureka-server启动类似,创建EurekaClient(DiscoveryClient)对象的过程在eureka-examples项目中,ExampleEurekaClient例子可以看到启动流程服务实例启动的时候,会启动eureka client,eureka client去向eureka server去服务注册
调用的是 PeerAwareInstanceRegistryImpl.register 方法LookupService定义了最基本的发现示例的行为LeaseManager定义了处理客户端注册,续约,注销等操作
调用的是底层的TransportClient的RegistrationClient,执行了register()方法,将InstanceInfo服务实例的信息,通过http请求,调用eureka server对外暴露的restful接口,发送InstanceInfo参数。
从gMap中获取服务实例对应的租约进行相应逻辑处理
appinfo.replicate.interval:当前实例多久同步一次实例信息,单位秒。默认30sappinfo.initial.replicate.time:注册时会开启注册任务线程并延迟启动,默认延迟时长40s
尝试去抓取注册表,如果抓取不成功,会从备用的注册表地址抓取
AbstractInstanceRegistry
读取eureka-client.properties中服务实例配置构造EurekaInstanceConfig、构造服务实例信息InstanceInfo、构造服务实例信息管理器ApplicationInfoManager
服务注册
eureka client启动
表示eureka client服务注册
表示eureka server服务注册
EurekaClient.refreshInstanceInfo():调用ApplicationInfoManager的一些方法刷新了一下服务实例的配置用健康检查器检查状态,将状态设置到了ApplicationInfoManager中去,更新服务实例的状态上一步时调用了setIsDirty()方法,所以会执行进行服务注册方法discoveryClient.register();
如果某个服务是第一次来注册,通过AppName是获取不到map的,是null此时就会创建一个新的map,给放到registry中
添加最近租约变更记录队列recentlyChangedQueue用于Eureka Client增量式获取注册表信息
eureka core的resources包下,有一堆resources,这些resource相当于是spring web mvc的controller,用来接收这个http请求的。resources相当于是jersey里面的controller例如:http://localhost:8080/v2/apps/ServiceAServiceA可以认为是一个app name,也可以是app id,标志了一个服务,就是服务名称
AbstractJersey2EurekaHttpClient发送http请求,调用eureka server的restful接口
调用addInstance()中的下面代码
清除读写缓存所有数据服务实例注册信息变化的时候,同时更新缓存(可参考eureka多级缓存机制)
PeerAwareInstanceRegistry
将InstanceInfo封装为一个Lease对象将Lease对象放到gMap里面去,key就是服务实例id{ \"服务\": { \"服务实例1\": Lease<InstanceInfo> }}
PeerAwareInstanceRegistryImpl
span style=\"font-size: inherit;\
根据AppName获取gMap
执行线程的时候,run方法执行服务注册逻辑
设置isInstanceInfoDirty和lastDirtyTimestamp参数isInstanceInfoDirty:标注实例数据是否是脏的(client和server端对比)
eureka server web.xml里面配置的jersey servlet拦截所有的请求,将注册请求分发给ApplicationsResources
给自己注册一个监控
通过instanceId,从gMap中获取服务实例对应的租约如果这个服务的这个服务实例,是第一次来注册,那么这里获取到的Lease一定是null如果该实例的租约已经存在,比较最后更新的时间戳,取最大值的注册信息为有效信息如果租约不存在,创建新的注册实例
0 条评论
回复 删除
下一页