Netflix Eureka源码分析(11)——eureka client第一次启动时全量抓取注册表的源码剖析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
            }
        }
    }

}

猜你喜欢

转载自blog.csdn.net/A_Story_Donkey/article/details/82884703