千家信息网

spring cloud中CachingSpringLoadBalancerFactory的作用是什么

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章主要讲解了"spring cloud中CachingSpringLoadBalancerFactory的作用是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,
千家信息网最后更新 2025年01月24日spring cloud中CachingSpringLoadBalancerFactory的作用是什么

这篇文章主要讲解了"spring cloud中CachingSpringLoadBalancerFactory的作用是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"spring cloud中CachingSpringLoadBalancerFactory的作用是什么"吧!

本文主要研究一下spring cloud的CachingSpringLoadBalancerFactory

CachingSpringLoadBalancerFactory

spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/openfeign/ribbon/CachingSpringLoadBalancerFactory.java

public class CachingSpringLoadBalancerFactory {        protected final SpringClientFactory factory;        protected LoadBalancedRetryFactory loadBalancedRetryFactory = null;        private volatile Map cache = new ConcurrentReferenceHashMap<>();        public CachingSpringLoadBalancerFactory(SpringClientFactory factory) {                this.factory = factory;        }        public CachingSpringLoadBalancerFactory(SpringClientFactory factory,                        LoadBalancedRetryFactory loadBalancedRetryPolicyFactory) {                this.factory = factory;                this.loadBalancedRetryFactory = loadBalancedRetryPolicyFactory;        }        public FeignLoadBalancer create(String clientName) {                FeignLoadBalancer client = this.cache.get(clientName);                if (client != null) {                        return client;                }                IClientConfig config = this.factory.getClientConfig(clientName);                ILoadBalancer lb = this.factory.getLoadBalancer(clientName);                ServerIntrospector serverIntrospector = this.factory.getInstance(clientName,                                ServerIntrospector.class);                client = this.loadBalancedRetryFactory != null                                ? new RetryableFeignLoadBalancer(lb, config, serverIntrospector,                                                this.loadBalancedRetryFactory)                                : new FeignLoadBalancer(lb, config, serverIntrospector);                this.cache.put(clientName, client);                return client;        }}
  • CachingSpringLoadBalancerFactory的构造器接收SpringClientFactory、LoadBalancedRetryFactory;它提供了create方法用于创建FeignLoadBalancer;其create方法使用ConcurrentReferenceHashMap来缓存每个client对应的FeignLoadBalancer

LoadBalancerFeignClient

spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/openfeign/ribbon/LoadBalancerFeignClient.java

public class LoadBalancerFeignClient implements Client {        static final Request.Options DEFAULT_OPTIONS = new Request.Options();        private final Client delegate;        private CachingSpringLoadBalancerFactory lbClientFactory;        private SpringClientFactory clientFactory;        public LoadBalancerFeignClient(Client delegate,                        CachingSpringLoadBalancerFactory lbClientFactory,                        SpringClientFactory clientFactory) {                this.delegate = delegate;                this.lbClientFactory = lbClientFactory;                this.clientFactory = clientFactory;        }        static URI cleanUrl(String originalUrl, String host) {                String newUrl = originalUrl;                if (originalUrl.startsWith("https://")) {                        newUrl = originalUrl.substring(0, 8)                                        + originalUrl.substring(8 + host.length());                }                else if (originalUrl.startsWith("http")) {                        newUrl = originalUrl.substring(0, 7)                                        + originalUrl.substring(7 + host.length());                }                StringBuffer buffer = new StringBuffer(newUrl);                if ((newUrl.startsWith("https://") && newUrl.length() == 8)                                || (newUrl.startsWith("http://") && newUrl.length() == 7)) {                        buffer.append("/");                }                return URI.create(buffer.toString());        }        @Override        public Response execute(Request request, Request.Options options) throws IOException {                try {                        URI asUri = URI.create(request.url());                        String clientName = asUri.getHost();                        URI uriWithoutHost = cleanUrl(request.url(), clientName);                        FeignLoadBalancer.RibbonRequest ribbonRequest = new FeignLoadBalancer.RibbonRequest(                                        this.delegate, request, uriWithoutHost);                        IClientConfig requestConfig = getClientConfig(options, clientName);                        return lbClient(clientName)                                        .executeWithLoadBalancer(ribbonRequest, requestConfig).toResponse();                }                catch (ClientException e) {                        IOException io = findIOException(e);                        if (io != null) {                                throw io;                        }                        throw new RuntimeException(e);                }        }        IClientConfig getClientConfig(Request.Options options, String clientName) {                IClientConfig requestConfig;                if (options == DEFAULT_OPTIONS) {                        requestConfig = this.clientFactory.getClientConfig(clientName);                }                else {                        requestConfig = new FeignOptionsClientConfig(options);                }                return requestConfig;        }        protected IOException findIOException(Throwable t) {                if (t == null) {                        return null;                }                if (t instanceof IOException) {                        return (IOException) t;                }                return findIOException(t.getCause());        }        public Client getDelegate() {                return this.delegate;        }        private FeignLoadBalancer lbClient(String clientName) {                return this.lbClientFactory.create(clientName);        }        static class FeignOptionsClientConfig extends DefaultClientConfigImpl {                FeignOptionsClientConfig(Request.Options options) {                        setProperty(CommonClientConfigKey.ConnectTimeout,                                        options.connectTimeoutMillis());                        setProperty(CommonClientConfigKey.ReadTimeout, options.readTimeoutMillis());                }                @Override                public void loadProperties(String clientName) {                }                @Override                public void loadDefaultValues() {                }        }}
  • LoadBalancerFeignClient的lbClient方法使用CachingSpringLoadBalancerFactory的create方法来创建FeignLoadBalancer;而execute方法则调用了lbClient方法来获取FeignLoadBalancer

小结

CachingSpringLoadBalancerFactory的构造器接收SpringClientFactory、LoadBalancedRetryFactory;它提供了create方法用于创建FeignLoadBalancer;其create方法使用ConcurrentReferenceHashMap来缓存每个client对应的FeignLoadBalancer

感谢各位的阅读,以上就是"spring cloud中CachingSpringLoadBalancerFactory的作用是什么"的内容了,经过本文的学习后,相信大家对spring cloud中CachingSpringLoadBalancerFactory的作用是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0