1. JSONObject jsonObject= .getForObject("http://gsc-services/halt", JSONObject.class);
2. public <T> T getForObject(String url, Class<T> , Object... uriVariables) throws RestClientException {
RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
HttpMessageConverterExtractor<T> responseExtractor =
new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);
return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
}
3.
@
public <T> T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables) throws RestClientException {
URI expanded = getUriTemplateHandler().expand(url, uriVariables);
return doExecute(expanded, method, requestCallback, responseExtractor);
}
4. 在加入 @LoadBalanced 注解后getForObject知名网站建设定制必须与服务名访问否则用ip访问的原因
@Nullable
protected <T> T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {
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<ClientHttpRequestInterceptor> interceptors = getInterceptors(); //关键点:interceptors中存在 返回 InterceptingClientHttpRequest
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<ClientHttpRequestInterceptor> interceptors) {
/
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<ClientHttpRequestInterceptor> list = new ArrayList<>(
restTemplate.getInterceptors());
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list); //给
};
}
9.怎样从http://服务名/方法 到 ip地址转换 SpringClientFactory.java
interface com.netflix.client.config.IClientConfig
@Override
public <C> C getInstance(String name, Class<C> type) {
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<T extends Server> extends DynamicServerListLoadBalancer<T>
11. DynamicServerListLoadBalancer.java
@VisibleForTesting
public void updateListOfServers() {
List<T> servers = new ArrayList<T>();
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<DiscoveryEnabledServer> getUpdatedListOfServers() {
List<DiscoveryEnabledServer> servers = setZones(
this.list.getUpdatedListOfServers()); //关键方法:this.list.getUpdatedListOfServers()
return servers;
}
其中:this.list 是 ServerList<DiscoveryEnabledServer>
13. DiscoveryEnabledNIWSServerList.JAVA (this.list.getUpdatedListOfServers())
@Override
public List<DiscoveryEnabledServer> getUpdatedListOfServers(){
return obtainServersViaDiscovery();
}
private List<DiscoveryEnabledServer> obtainServersViaDiscovery() {
///vipAddress== gsc-services
for (String vipAddress : vipAddresses.split(",")) {
//通过euerkaClient客户端心跳包返回值就拿到了服务名与IP对应关系
List<InstanceInfo> listOfInstanceInfo = eurekaClient.getInstancesByVipAddress(vipAddress, isSecure, targetRegion);
}
}