栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

RestTemplate +ribbon @LoadBalanced 原理 ,怎样从http://服务名/方法 到 ip地址转换,

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RestTemplate +ribbon @LoadBalanced 原理 ,怎样从http://服务名/方法 到 ip地址转换,

1.     JSonObject jsonObject=  restTemplate.getForObject("http://gsc-services/halt", JSONObject.class);

2. public T getForObject(String url, Class responseType, Object... uriVariables) throws RestClientException {

RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);

HttpMessageConverterExtractor responseExtractor =

new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);

return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);

}

3.

@Nullable

public T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,

@Nullable ResponseExtractor responseExtractor, Object... uriVariables) throws RestClientException {

URI expanded = getUriTemplateHandler().expand(url, uriVariables);

return doExecute(expanded, method, requestCallback, responseExtractor);

}

4. 在加入 @LoadBalanced 注解后getForObject必须与服务名访问否则用ip访问的原因 

@Nullable

protected T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,

@Nullable ResponseExtractor 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 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 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 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 getInstance(String name, Class 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 extends DynamicServerListLoadBalancer

11.  DynamicServerListLoadBalancer.java  

    @VisibleForTesting

    public void updateListOfServers() {

        List servers = new ArrayList();

        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 getUpdatedListOfServers() {

List servers = setZones(

this.list.getUpdatedListOfServers()); //关键方法:this.list.getUpdatedListOfServers()

return servers;

}

  其中:this.list 是 ServerList  

  13.  DiscoveryEnabledNIWSServerList.JAVA  (this.list.getUpdatedListOfServers())

     @Override

    public List getUpdatedListOfServers(){

        return obtainServersViaDiscovery();

    }

    private List obtainServersViaDiscovery() {

     ///vipAddress== gsc-services

     for (String vipAddress : vipAddresses.split(",")) { 

        //通过euerkaClient客户端心跳包返回值就拿到了服务名与IP对应关系

       List listOfInstanceInfo = eurekaClient.getInstancesByVipAddress(vipAddress, isSecure, targetRegion);

     }

    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/770827.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号