跳到主要内容

Eureka(4)-- Eureka Client 注册源码分析(Eureka Server部分)

1.EurekaClient 发送Rest请求到EurekaSever

Jersey HTTP POST http://localhost:8761/eureka//apps/SPRING-CLOUD-USER with instance BR-IT-A00966.bairong.ad.com:spring-cloud-user:8082; statusCode=204

2.EureakServer启动的时候会启动一些JettyRest接口,ApplicationResource用来处理注册请求

@POST
@Consumes({

"application/json", "application/xml"})
public Response addInstance(InstanceInfo info,
@HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication) {


logger.debug("Registering instance {} (replication={})", info.getId(), isReplication);
// validate that the instanceinfo contains all the necessary required fields
//注册需要有id、hostName、appName、并且hostName和appName相等
if (isBlank(info.getId())) {


return Response.status(400).entity("Missing instanceId").build();
} else if (isBlank(info.getHostName())) {


return Response.status(400).entity("Missing hostname").build();
} else if (isBlank(info.getAppName())) {


return Response.status(400).entity("Missing appName").build();
} else if (!appName.equals(info.getAppName())) {


return Response.status(400).entity("Mismatched appName, expecting " + appName + " but was " + info.getAppName()).build();
}

// handle cases where clients may be registering with bad DataCenterInfo with missing data
DataCenterInfo dataCenterInfo = info.getDataCenterInfo();
if (dataCenterInfo instanceof UniqueIdentifier) {


String dataCenterInfoId = ((UniqueIdentifier) dataCenterInfo).getId();
if (isBlank(dataCenterInfoId)) {


boolean experimental = "true".equalsIgnoreCase(serverConfig.getExperimental("registration.validation.dataCenterInfoId"));
if (experimental) {


String entity = "DataCenterInfo of type " + dataCenterInfo.getClass() + " must contain a valid id";
return Response.status(400).entity(entity).build();
} else if (dataCenterInfo instanceof AmazonInfo) {


AmazonInfo amazonInfo = (AmazonInfo) dataCenterInfo;
String effectiveId = amazonInfo.get(AmazonInfo.MetaDataKey.instanceId);
if (effectiveId == null) {


amazonInfo.getMetadata().put(AmazonInfo.MetaDataKey.instanceId.getName(), info.getId());
}
} else {


logger.warn("Registering DataCenterInfo of type {} without an appropriate id", dataCenterInfo.getClass());
}
}
}
//调用PeerAwareInstanceRegistry、PeerAwareInstanceRegistryImpl的register方法
registry.register(info, "true".equals(isReplication));
return Response.status(204).build(); // 204 to be backwards compatible
}