知名网站建设定制RestTemplate +ribbon @LoadBalanced 原理 ,怎样从http://服务名/方法 到 ip地址转换,

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);

     }

    }

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发