1. JSonObject jsonObject= restTemplate.getForObject("http://gsc-services/halt", JSONObject.class);
2. public
RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
HttpMessageConverterExtractor
new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);
return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
}
3.
@Nullable
public
@Nullable ResponseExtractor
URI expanded = getUriTemplateHandler().expand(url, uriVariables);
return doExecute(expanded, method, requestCallback, responseExtractor);
}
4. 在加入 @LoadBalanced 注解后getForObject必须与服务名访问否则用ip访问的原因
@Nullable
protected
@Nullable ResponseExtractor
ClientHttpResponse response = null;
try {
//不加@LoadBalanced注解时HttpComponentsClientHttpRequest,加入@LoadBalanced 注解 InterceptingClientHttpRequest
ClientHttpRequest request = createRequest(url, method);
if (requestCallback != null) {
requestCallback.doWithRequest(request);
}
response = request.execute();
handleResponse(url, method, response);
return (responseExtractor != null ? responseExtractor.extractData(response) : null);
}
catch (IOException ex) {
String resource = url.toString();
String query = url.getRawQuery();
resource = (query != null ? resource.substring(0, resource.indexOf('?')) : resource);
throw new ResourceAccessException("I/O error on " + method.name() +
" request for "" + resource + "": " + ex.getMessage(), ex);
}
finally {
if (response != null) {
response.close();
}
}
}
5. HttpAccessor.java== restTemplate
protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
ClientHttpRequest request = getRequestFactory().createRequest(url, method);
initialize(request);
if (logger.isDebugEnabled()) {
logger.debug("HTTP " + method.name() + " " + url);
}
return request;
}
@Override
public ClientHttpRequestFactory getRequestFactory() {
List
LoadBalancerInterceptor implements ClientHttpRequestInterceptor
if (!CollectionUtils.isEmpty(interceptors)) {
ClientHttpRequestFactory factory = this.interceptingRequestFactory;
if (factory == null) {
factory = new InterceptingClientHttpRequestFactory(super.getRequestFactory(), interceptors);
this.interceptingRequestFactory = factory;
}
return factory;
}
else {
return super.getRequestFactory();
}
}
5.1. InterceptingClientHttpRequest.java
InterceptingHttpAccessor.java
//给this.interceptors属性赋值 LoadBalancerInterceptor
public void setInterceptors(List
/
if (this.interceptors != interceptors) {
this.interceptors.clear();
this.interceptors.addAll(interceptors);
AnnotationAwareOrderComparator.sort(this.interceptors);
}
}
调用在LoadBalancerAutoConfiguration自动配置类
6. LoadBalancerInterceptor bean建立是在LoadBalancerAutoConfiguration自动配置类中
6.1. @Bean
public LoadBalancerInterceptor ribbonInterceptor(
LoadBalancerClient loadBalancerClient,
LoadBalancerRequestFactory requestFactory) {
return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
}
@Bean
6.2 @ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(
final LoadBalancerInterceptor loadBalancerInterceptor) {
return restTemplate -> {
List
restTemplate.getInterceptors());
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list); //给
};
}
9.怎样从http://服务名/方法 到 ip地址转换 SpringClientFactory.java
interface com.netflix.client.config.IClientConfig
@Override
public
C instance = super.getInstance(name, type); //建立ZoneAwareLoadBalancer
if (instance != null) {
return instance;
}
IClientConfig config = getInstance(name, IClientConfig.class);
return instantiateWithConfig(getContext(name), type, config);
}
10. ZoneAwareLoadBalancer
11. DynamicServerListLoadBalancer.java
@VisibleForTesting
public void updateListOfServers() {
List
if (serverListImpl != null) {
servers = serverListImpl.getUpdatedListOfServers();
LOGGER.debug("List of Servers for {} obtained from Discovery client: {}",
getIdentifier(), servers);
if (filter != null) {
servers = filter.getFilteredListOfServers(servers);
LOGGER.debug("Filtered List of Servers for {} obtained from Discovery client: {}",
getIdentifier(), servers);
}
}
updateAllServerList(servers);
}
12. 到euerka client
org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList.java
@Override
public List
List
this.list.getUpdatedListOfServers()); //关键方法:this.list.getUpdatedListOfServers()
return servers;
}
其中:this.list 是 ServerList
13. DiscoveryEnabledNIWSServerList.JAVA (this.list.getUpdatedListOfServers())
@Override
public List
return obtainServersViaDiscovery();
}
private List
///vipAddress== gsc-services
for (String vipAddress : vipAddresses.split(",")) {
//通过euerkaClient客户端心跳包返回值就拿到了服务名与IP对应关系
List
}
}



