版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/A_Story_Donkey/article/details/82884703
eureka client完成自身的注册之后,我们肯定要来看抓取注册表的逻辑
先来看看eureka client端的抓取注册表的逻辑,抓取注册的逻辑,真正复杂的地方是在eureka server端,那边有一套较为复杂和优秀的缓存机制
全量抓取注册表,eureka client第一次启动的时候,必须从eureka server端一次性抓取全量的注册表的信息过来,在本地进行缓存,后面的话呢,每隔30秒从eureka server抓取增量的注册表信息,跟本地缓存进行合并
如果你配置了应该要抓取注册表的信息,那么 eureka client 就会在启动的时候来一次全量的注册表的抓取过程:
(1)EurekaClient初始化的时候,就会自动全量抓取注册表
(2)先获取本地的Applications缓存,Applications是什么东西?就是所有的服务,Applicaiton是一个服务,Applications是所有的服务,Application中包含了他自己的所有的InstanceInfo,就是一个服务包含了自己的所有的服务实例
(3)调用jersey client,发送http请求(http://localhost:8080/v2/apps),GET请求,调用eureka server的getApplications restful接口,获取全量注册表,缓存在自己的本地
/**
* @author Tomasz Bak
*/
public abstract class AbstractJersey2EurekaHttpClient implements EurekaHttpClient {
@Override
public EurekaHttpResponse<Applications> getApplications(String... regions) {
return getApplicationsInternal("apps/", regions);
}
private EurekaHttpResponse<Applications> getApplicationsInternal(String urlPath, String[] regions) {
Response response = null;
try {
WebTarget webTarget = jerseyClient.target(serviceUrl).path(urlPath);
if (regions != null && regions.length > 0) {
webTarget = webTarget.queryParam("regions", StringUtil.join(regions));
}
Builder requestBuilder = webTarget.request();
addExtraProperties(requestBuilder);
addExtraHeaders(requestBuilder);
response = requestBuilder.accept(MediaType.APPLICATION_JSON_TYPE).get();
Applications applications = null;
if (response.getStatus() == Status.OK.getStatusCode() && response.hasEntity()) {
applications = response.readEntity(Applications.class);
}
return anEurekaHttpResponse(response.getStatus(), applications).headers(headersOf(response)).build();
} finally {
if (logger.isDebugEnabled()) {
logger.debug("Jersey2 HTTP GET {}/{}; statusCode={}", serviceUrl, urlPath, response == null ? "N/A" : response.getStatus());
}
if (response != null) {
response.close();
}
}
}
}