背景
从昨日的两篇文章:SpringCloud源码:客户端分析(一)- SpringBootApplication注解类加载流程、SpringCloud源码:客户端分析(二)- 客户端源码分析。
我们理解了客户端的初始化,其实跟SpringBootApplication初始化机制息息相关,也和自动化配置类有关。
同时我们也留意到了,客户端的四个动作:注册服务、续约服务、拉取注册列表、取消注册;这4个操作其实是通过定时任务池和异步线程池来协同任务的。
下面我切换一个角度,从Eureka服务端出发,看一下这四个操作的源码。
EurekaServer:各类REST请求处理
相关源码都放到了eureka-core包下面。
/com/netflix/eureka/eureka-core/1.10.7/eureka-core-1.10.7.jar!/com/netflix/eureka/resources
源码:PeerReplicationResource
从dispatch客户端请求开始分析,即:
com.netflix.eureka.resources.PeerReplicationResource#dispatch
private ReplicationInstanceResponse dispatch(ReplicationInstance instanceInfo) {
ApplicationResource applicationResource = this.createApplicationResource(instanceInfo);
InstanceResource resource = this.createInstanceResource(instanceInfo, applicationResource);
String lastDirtyTimestamp = toString(instanceInfo.getLastDirtyTimestamp());
String overriddenStatus = toString(instanceInfo.getOverriddenStatus());
String instanceStatus = toString(instanceInfo.getStatus());
Builder singleResponseBuilder = new Builder();
switch(instanceInfo.getAction()) {
case Register:
singleResponseBuilder = handleRegister(instanceInfo, applicationResource);
break;
case Heartbeat:
singleResponseBuilder = handleHeartbeat(this.serverConfig, resource, lastDirtyTimestamp, overriddenStatus, instanceStatus);
break;
case Cancel:
singleResponseBuilder = handleCancel(resource);
break;
case StatusUpdate:
singleResponseBuilder = handleStatusUpdate(instanceInfo, resource);
break;
case DeleteStatusOverride:
singleResponseBuilder = handleDeleteStatusOverride(instanceInfo, resource);
}
return singleResponseBuilder.build();
}
分析代码:
该函数根据instanceInfo的动作类型执行不同的操作,并构建响应:
创建应用和实例资源。
根据动作类型调用不同处理方法:
客户端注册:Register
客户端心跳续约:Heartbeat
客户端取消注册:Cancel
客户端更新状态:StatusUpdate
客户端删除状态:DeleteStatusOverride
使用Builder构建并返回最终的ReplicationInstanceResponse对象。
其他文章
SpringCloud源码:客户端分析(一)- SpringBootApplication注解类加载流程
SpringCloud源码:客户端分析(二)- 客户端源码分析