Skip to content

Commit

Permalink
Fix service caches bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
yiming187 committed Apr 25, 2016
1 parent 3d0186e commit 12f0586
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 15 deletions.
1 change: 1 addition & 0 deletions apollo-buildtools/pom.xml
Expand Up @@ -11,6 +11,7 @@
<artifactId>apollo-buildtools</artifactId>
<name>Apollo BuildTools</name>
<properties>
<java.version>1.7</java.version>
<github.path>${project.artifactId}</github.path>
</properties>
<dependencies>
Expand Down
Expand Up @@ -4,7 +4,6 @@
import com.ctrip.apollo.internals.ConfigManager;
import com.ctrip.apollo.spi.ConfigFactory;
import com.ctrip.apollo.spi.ConfigRegistry;
import com.ctrip.apollo.util.ConfigUtil;
import com.dianping.cat.Cat;

import org.codehaus.plexus.PlexusContainer;
Expand Down
@@ -1,7 +1,6 @@
package com.ctrip.apollo.internals;

import com.ctrip.apollo.Config;
import com.ctrip.apollo.ConfigChangeListener;
import com.ctrip.apollo.spi.ConfigFactory;
import com.ctrip.apollo.spi.ConfigFactoryManager;

Expand Down
Expand Up @@ -6,8 +6,6 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

import com.ctrip.apollo.common.controller.WebSecurityConfig;

@Configuration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.ASSIGNABLE_TYPE, value = {
SampleConfigServiceApplication.class, ConfigServiceApplication.class})})
Expand Down
Expand Up @@ -10,7 +10,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
Expand Down
Expand Up @@ -2,8 +2,6 @@

import com.google.common.base.MoreObjects;

import com.ctrip.apollo.Apollo;

import java.util.Map;

/**
Expand Down
Expand Up @@ -15,7 +15,6 @@
import com.ctrip.apollo.core.enums.Env;
import com.ctrip.apollo.core.exception.BadRequestException;
import com.ctrip.apollo.core.exception.ServiceException;
import com.ctrip.apollo.core.utils.StringUtils;
import com.ctrip.apollo.portal.PortalSettings;
import com.ctrip.apollo.portal.api.AdminServiceAPI;
import com.ctrip.apollo.portal.entity.ClusterNavTree;
Expand Down
Expand Up @@ -3,15 +3,22 @@
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.ctrip.apollo.core.enums.Env;
import com.ctrip.apollo.core.MetaDomainConsts;
import com.ctrip.apollo.core.dto.ServiceDTO;
import com.ctrip.apollo.core.enums.Env;
import com.ctrip.apollo.core.exception.ServiceException;

/**
Expand All @@ -22,40 +29,68 @@ public class ServiceLocator {

private static final Logger logger = LoggerFactory.getLogger(ServiceLocator.class);

private static final int DEFAULT_TIMEOUT_MS = 1000;

private RestTemplate restTemplate = new RestTemplate();

private List<ServiceDTO> serviceCaches = new ArrayList<>();
private Map<Env, List<ServiceDTO>> serviceCaches = new ConcurrentHashMap<Env, List<ServiceDTO>>();

private final AtomicInteger adminCallCounts = new AtomicInteger(0);

private final AtomicInteger configCallCounts = new AtomicInteger(0);

public ServiceDTO getAdminService(Env env) throws ServiceException {
List<ServiceDTO> services = getServices(env, "admin");
if (services.size() == 0) {
throw new ServiceException("No available admin service");
}
return services.get(0);
return services.get(adminCallCounts.getAndIncrement() % services.size());
}

public ServiceDTO getConfigService(Env env) throws ServiceException {
List<ServiceDTO> services = getServices(env, "config");
if (services.size() == 0) {
throw new ServiceException("No available config service");
}
return services.get(0);
return services.get(configCallCounts.getAndIncrement() % services.size());
}

private List<ServiceDTO> getServices(Env env, String serviceUrl) {
String domainName = MetaDomainConsts.getDomain(env);
String url = domainName + "/services/" + serviceUrl;
List<ServiceDTO> serviceDtos = null;
try {
ServiceDTO[] services = restTemplate.getForObject(new URI(url), ServiceDTO[].class);
if (services != null && services.length > 0) {
serviceCaches.clear();
if (!serviceCaches.containsKey(env)) {
serviceDtos = new ArrayList<ServiceDTO>();
serviceCaches.put(env, serviceDtos);
} else {
serviceDtos = serviceCaches.get(env);
serviceDtos.clear();
}
for (ServiceDTO service : services) {
serviceCaches.add(service);
serviceDtos.add(service);
}
}
} catch (Exception ex) {
logger.warn(ex.getMessage());
}
return serviceCaches;
return serviceDtos;
}

@PostConstruct
private void postConstruct() {
if (restTemplate.getRequestFactory() instanceof SimpleClientHttpRequestFactory) {
SimpleClientHttpRequestFactory rf =
(SimpleClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setReadTimeout(DEFAULT_TIMEOUT_MS);
rf.setConnectTimeout(DEFAULT_TIMEOUT_MS);
} else if (restTemplate.getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory) {
HttpComponentsClientHttpRequestFactory rf =
(HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setReadTimeout(DEFAULT_TIMEOUT_MS);
rf.setConnectTimeout(DEFAULT_TIMEOUT_MS);
}
}
}

0 comments on commit 12f0586

Please sign in to comment.