Skip to content

Commit a8e2070

Browse files
committed
perf: speed up startup when meet timeout of meta service and config service
lazy init
1 parent 3f0979d commit a8e2070

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigServiceLocator.java

+31-15
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
import com.ctrip.framework.apollo.core.utils.DeprecatedPropertyNotifyUtil;
2323
import com.ctrip.framework.foundation.Foundation;
2424
import java.lang.reflect.Type;
25+
import java.util.Collections;
2526
import java.util.List;
2627
import java.util.Map;
2728
import java.util.concurrent.Executors;
2829
import java.util.concurrent.ScheduledExecutorService;
2930
import java.util.concurrent.atomic.AtomicReference;
3031

3132
import org.slf4j.Logger;
32-
import org.slf4j.LoggerFactory;
3333

3434
import com.ctrip.framework.apollo.build.ApolloInjector;
3535
import com.ctrip.framework.apollo.core.dto.ServiceDTO;
@@ -54,25 +54,33 @@ public class ConfigServiceLocator {
5454
private static final Logger logger = DeferredLoggerFactory.getLogger(ConfigServiceLocator.class);
5555
private HttpClient m_httpClient;
5656
private ConfigUtil m_configUtil;
57-
private AtomicReference<List<ServiceDTO>> m_configServices;
58-
private Type m_responseType;
59-
private ScheduledExecutorService m_executorService;
57+
private final AtomicReference<List<ServiceDTO>> m_configServices = new AtomicReference<>(
58+
Collections.emptyList());
59+
private static final Type m_responseType = new TypeToken<List<ServiceDTO>>() {
60+
}.getType();
61+
ScheduledExecutorService m_executorService;
6062
private static final Joiner.MapJoiner MAP_JOINER = Joiner.on("&").withKeyValueSeparator("=");
6163
private static final Escaper queryParamEscaper = UrlEscapers.urlFormParameterEscaper();
6264

6365
/**
6466
* Create a config service locator.
6567
*/
6668
public ConfigServiceLocator() {
67-
List<ServiceDTO> initial = Lists.newArrayList();
68-
m_configServices = new AtomicReference<>(initial);
69-
m_responseType = new TypeToken<List<ServiceDTO>>() {
70-
}.getType();
71-
m_httpClient = ApolloInjector.getInstance(HttpClient.class);
72-
m_configUtil = ApolloInjector.getInstance(ConfigUtil.class);
73-
this.m_executorService = Executors.newScheduledThreadPool(1,
74-
ApolloThreadFactory.create("ConfigServiceLocator", true));
75-
initConfigServices();
69+
}
70+
71+
/**
72+
* only init once.
73+
*/
74+
private void initialize() {
75+
if (m_httpClient == null) {
76+
synchronized (this) {
77+
if (m_httpClient == null) {
78+
m_httpClient = ApolloInjector.getInstance(HttpClient.class);
79+
m_configUtil = ApolloInjector.getInstance(ConfigUtil.class);
80+
initConfigServices();
81+
}
82+
}
83+
}
7684
}
7785

7886
private void initConfigServices() {
@@ -160,8 +168,14 @@ private String getDeprecatedCustomizedConfigService() {
160168
* @return the services dto
161169
*/
162170
public List<ServiceDTO> getConfigServices() {
171+
initialize();
163172
if (m_configServices.get().isEmpty()) {
164-
updateConfigServices();
173+
// quick fail
174+
throw new ApolloConfigException(
175+
"No available config service, "
176+
+ "server side maybe crash or network cannot connect to server from this ip, "
177+
+ "one of meta service url is " + assembleMetaServiceUrl()
178+
);
165179
}
166180

167181
return m_configServices.get();
@@ -178,6 +192,8 @@ private boolean tryUpdateConfigServices() {
178192
}
179193

180194
private void schedulePeriodicRefresh() {
195+
this.m_executorService = Executors.newScheduledThreadPool(1,
196+
ApolloThreadFactory.create("ConfigServiceLocator", true));
181197
this.m_executorService.scheduleAtFixedRate(
182198
new Runnable() {
183199
@Override
@@ -190,7 +206,7 @@ public void run() {
190206
m_configUtil.getRefreshIntervalTimeUnit());
191207
}
192208

193-
private synchronized void updateConfigServices() {
209+
synchronized void updateConfigServices() {
194210
String url = assembleMetaServiceUrl();
195211

196212
HttpRequest request = new HttpRequest(url);

0 commit comments

Comments
 (0)