07、EurekaHttpClient类源码分析

1.EurekaHttpClient是一个接口类,实现类有AbstractJerseyEurekaHttpClient、EurekaHttpClientDecorator 用于完成Eureka Client和Eureka Server的交互

2.EurekaHttpClientDecorator的实现类有RedirectingEurekaHttpClient、RetryableEurekaHttpClient、SessionedEurekaHttpClient

3.在DiscoveryClient初始化的时候做初始化

@Singleton
public class DiscoveryClient implements EurekaClient {
   
     

    private static final class EurekaTransport {
   
     
        private ClosableResolver bootstrapResolver;
        private TransportClientFactory transportClientFactory;

        private EurekaHttpClient registrationClient;
        private EurekaHttpClientFactory registrationClientFactory;

        private EurekaHttpClient queryClient;
        private EurekaHttpClientFactory queryClientFactory;
    }
    
    private final EurekaTransport eurekaTransport;

    @Inject
    DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, DiscoveryClientOptionalArgs args,
                    Provider<BackupRegistry> backupRegistryProvider) {
   
     
                    
        eurekaTransport = new EurekaTransport();
        scheduleServerEndpointTask(eurekaTransport, args);
                    
    }
    
    private void scheduleServerEndpointTask(EurekaTransport eurekaTransport,
                                            DiscoveryClientOptionalArgs args) {
   
     
        EurekaJerseyClient providedJerseyClient = args == null
                ? null
                : args.eurekaJerseyClient;

        eurekaTransport.transportClientFactory = providedJerseyClient == null
                ? TransportClientFactories.newTransportClientFactory(clientConfig, additionalFilters, applicationInfoManager.getInfo())
                : TransportClientFactories.newTransportClientFactory(additionalFilters, providedJerseyClient);
                
        if (clientConfig.shouldRegisterWithEureka()) {
   
     
            EurekaHttpClientFactory newRegistrationClientFactory = null;
            EurekaHttpClient newRegistrationClient = null;
            try {
   
     
                newRegistrationClientFactory = EurekaHttpClients.registrationClientFactory(
                        eurekaTransport.bootstrapResolver,
                        eurekaTransport.transportClientFactory,
                        transportConfig
                );
                newRegistrationClient = newRegistrationClientFactory.newClient();
            } catch (Exception e) {
   
     
                logger.warn("Experimental transport initialization failure", e);
            }
            eurekaTransport.registrationClientFactory = newRegistrationClientFactory;
            eurekaTransport.registrationClient = newRegistrationClient;
        }
                
    }                                       
}

public final class EurekaHttpClients {
   
     
    public static EurekaHttpClientFactory registrationClientFactory(ClusterResolver bootstrapResolver,
                                                                TransportClientFactory transportClientFactory,
                                                                EurekaTransportConfig transportConfig) {
   
     
        return canonicalClientFactory(EurekaClientNames.REGISTRATION, transportConfig, bootstrapResolver, transportClientFactory);
    }
     
    static EurekaHttpClientFactory canonicalClientFactory(final String name,
                                                          final EurekaTransportConfig transportConfig,
                                                          final ClusterResolver<EurekaEndpoint> clusterResolver,
                                                          final TransportClientFactory transportClientFactory) {
   
     

        return new EurekaHttpClientFactory() {
   
     
            @Override
            public EurekaHttpClient newClient() {
   
     
                return new SessionedEurekaHttpClient(
                        name,
                        RetryableEurekaHttpClient.createFactory(
                                name,
                                transportConfig,
                                clusterResolver,
                                RedirectingEurekaHttpClient.createFactory(transportClientFactory),
                                ServerStatusEvaluators.legacyEvaluator()),
                        transportConfig.getSessionedClientReconnectIntervalSeconds() * 1000
                );
            }

            @Override
            public void shutdown() {
   
     
                wrapClosable(clusterResolver).shutdown();
            }
        };
    }
}

public class RedirectingEurekaHttpClient extends EurekaHttpClientDecorator {
   
     
	public static TransportClientFactory createFactory(final TransportClientFactory delegateFactory) {
   
     
        final DnsServiceImpl dnsService = new DnsServiceImpl();
        return new TransportClientFactory() {
   
     
            @Override
            public EurekaHttpClient newClient(EurekaEndpoint endpoint) {
   
     
                return new RedirectingEurekaHttpClient(endpoint.getServiceUrl(), delegateFactory, dnsService);
            }

            @Override
            public void shutdown() {
   
     
                delegateFactory.shutdown();
            }
        };
    }
}

public class RetryableEurekaHttpClient extends EurekaHttpClientDecorator {
   
     
    public static EurekaHttpClientFactory createFactory(final String name,
                                                        final EurekaTransportConfig transportConfig,
                                                        final ClusterResolver<EurekaEndpoint> clusterResolver,
                                                        final TransportClientFactory delegateFactory,
                                                        final ServerStatusEvaluator serverStatusEvaluator) {
   
     
        return new EurekaHttpClientFactory() {
   
     
            @Override
            public EurekaHttpClient newClient() {
   
     
                return new RetryableEurekaHttpClient(name, transportConfig, clusterResolver, delegateFactory,
                        serverStatusEvaluator, DEFAULT_NUMBER_OF_RETRIES);
            }

            @Override
            public void shutdown() {
   
     
                delegateFactory.shutdown();
            }
        };
    }
}

public final class TransportClientFactories {
   
     

    public static TransportClientFactory newTransportClientFactory(final EurekaClientConfig clientConfig,
                                                                   final Collection<ClientFilter> additionalFilters,
                                                                   final InstanceInfo myInstanceInfo) {
   
     
        final TransportClientFactory jerseyFactory = JerseyEurekaHttpClientFactory.create(
                clientConfig,
                additionalFilters,
                myInstanceInfo,
                new EurekaClientIdentity(myInstanceInfo.getIPAddr())
        );
        final TransportClientFactory metricsFactory = MetricsCollectingEurekaHttpClient.createFactory(jerseyFactory);

        return new TransportClientFactory() {
   
     
            @Override
            public EurekaHttpClient newClient(EurekaEndpoint serviceUrl) {
   
     
                return metricsFactory.newClient(serviceUrl);
            }

            @Override
            public void shutdown() {
   
     
                metricsFactory.shutdown();
                jerseyFactory.shutdown();
            }
        };
    }

}

public class JerseyEurekaHttpClientFactory implements TransportClientFactory {
   
     

    public static JerseyEurekaHttpClientFactory create(EurekaClientConfig clientConfig,
                                                       Collection<ClientFilter> additionalFilters,
                                                       InstanceInfo myInstanceInfo,
                                                       AbstractEurekaIdentity clientIdentity) {
   
     
        JerseyEurekaHttpClientFactoryBuilder clientBuilder = newBuilder()
                .withAdditionalFilters(additionalFilters)
                .withMyInstanceInfo(myInstanceInfo)
                .withUserAgent("Java-EurekaClient")
                .withClientAccept(EurekaAccept.fromString(clientConfig.getClientDataAccept()))
                .withAllowRedirect(clientConfig.allowRedirects())
                .withConnectionTimeout(clientConfig.getEurekaServerConnectTimeoutSeconds() * 1000)
                .withReadTimeout(clientConfig.getEurekaServerReadTimeoutSeconds() * 1000)
                .withMaxConnectionsPerHost(clientConfig.getEurekaServerTotalConnectionsPerHost())
                .withMaxTotalConnections(clientConfig.getEurekaServerTotalConnections())
                .withConnectionIdleTimeout(clientConfig.getEurekaConnectionIdleTimeoutSeconds())
                .withEncoder(clientConfig.getEncoderName())
                .withDecoder(clientConfig.getDecoderName(), clientConfig.getClientDataAccept())
                .withClientIdentity(clientIdentity);

        if ("true".equals(System.getProperty("com.netflix.eureka.shouldSSLConnectionsUseSystemSocketFactory"))) {
   
     
            clientBuilder.withClientName("DiscoveryClient-HTTPClient-System").withSystemSSLConfiguration();
        } else if (clientConfig.getProxyHost() != null && clientConfig.getProxyPort() != null) {
   
     
            clientBuilder.withClientName("Proxy-DiscoveryClient-HTTPClient")
                    .withProxy(
                            clientConfig.getProxyHost(), Integer.parseInt(clientConfig.getProxyPort()),
                            clientConfig.getProxyUserName(), clientConfig.getProxyPassword()
                    );
        } else {
   
     
            clientBuilder.withClientName("DiscoveryClient-HTTPClient");
        }

        return clientBuilder.build();
    }
}

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: