资讯专栏INFORMATION COLUMN

Spring Cloud - Ribbon

王晗 / 502人阅读

摘要:根据传入的从中挑选一个对应的。是负载均衡策略实现,默认由生成,根据来执行请求,调用。将转换成通过注册中心中各个服务节点的初始化流程返回了一个拦截器,作用主要是在客户端发起请求时进行拦截,进而实现客户端负载均衡功能。

@LoadBalanced
public interface ServiceInstanceChooser {
    // 根据传入的serviceId从LoadBalancer中挑选一个对应的ServiceInstance。
    ServiceInstance choose(String serviceId);
}

public interface LoadBalancerClient extends ServiceInstanceChooser {

    // 逻辑同choose,即通过ILoadBalancer::chooseServer,然后使用返回的ServiceInstance调用下面execute方法。
    // ILoadBalancer是负载均衡策略实现,默认由RibbonClientConfiguration::ribbonLoadBalancer生成ZoneAwareLoadBalancer,
     T execute(String serviceId, LoadBalancerRequest request) throws IOException;

    // 根据ServiceInstance来执行请求,调用LoadBalancerRequest::apply。
     T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest request) throws IOException;

    // 将serviceId转换成host:port(通过注册中心中各个服务节点的metadata)
    URI reconstructURI(ServiceInstance instance, URI original);
}

初始化流程

LoadBalancerAutoConfiguration.LoadBalancerInterceptorConfig
::ribbonInterceptor返回了一个拦截器,作用主要是在客户端发起请求时进行拦截,进而实现客户端负载均衡功能。
::restTemplateCustomizer会实例化RestTemplateCustomizer,其作用是设置::ribbonInterceptor返回的拦截器

LoadBalancerAutoConfiguration
::loadBalancedRestTemplateInitializer调用RestTemplateCustomizer::customize方法来给RestTemplate添加上LoadBalancerInterceptor拦截器。

运行时流程
public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {

    private LoadBalancerClient loadBalancer;
    private LoadBalancerRequestFactory requestFactory;

    ......
    
    public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
            final ClientHttpRequestExecution execution) throws IOException {
        final URI originalUri = request.getURI();
        String serviceName = originalUri.getHost();
        
        // 会调另一个execute方法,即LoadBalancerRequest::apply,而LoadBalancerRequest的实例是由LoadBalancerRequestFactory::createRequest生成的。
        return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));
    }

}



public class LoadBalancerRequestFactory {

    ......

    public LoadBalancerRequest createRequest(final HttpRequest request,
        final byte[] body, final ClientHttpRequestExecution execution) {
    return new LoadBalancerRequest() {

        @Override
        public ClientHttpResponse apply(final ServiceInstance instance)
                throws Exception {
            // ServiceRequestWrapper重写了getURI(),即ServiceRequestWrapper::getURI调用了LoadBalancerClient::reconstructURI
            HttpRequest serviceRequest = new ServiceRequestWrapper(request, instance, loadBalancer);
            if (transformers != null) {
                for (LoadBalancerRequestTransformer transformer : transformers) {
                    serviceRequest = transformer.transformRequest(serviceRequest, instance);
                }
            }
            
            // 这里的execution是InterceptingRequestExecution::execute,它会调用serviceRequest的HttpRequest::getURI,就是上面ServiceRequestWrapper重写的getURI()
            return execution.execute(serviceRequest, body);
        }

    };
    }

 }







文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68341.html

相关文章

  • Spring Cloud实战(三)-Spring Cloud Netflix Ribbon

    摘要:概要什么是实战整合实现负载均衡是什么是一个客户端负载均衡的组件什么是负载均衡负载均衡就是分发请求流量到不同的服务器目前的实现有软件和硬件负载均衡分为两种服务器端负载均衡如上图所示服务器端负载均衡是对客户透明的用户请求到服务器真正的服务器是由 概要 什么是Spring Cloud Netflix Ribbon? 实战:整合Ribbon实现负载均衡 Spring Cloud Netfl...

    wangbinke 评论0 收藏0
  • 一起学习使用Spring Cloud Netflix之Ribbon

    摘要:本例中介绍如何使用来完成服务调用并实现负载均衡。即,对于注册中心而言,生产者和调用者都是端。文件配置如下在文件中,我们将应用命名为,端口为,表示注册中心地址。 前言 Ribbon是Spring Cloud体系中完成负载均衡的重要组件。Spring Cloud体系中有两种完成服务调用的组件,一种是Ribbon+RestTemplate,另一种Feign。Feign默认使用的也是Ribbo...

    nidaye 评论0 收藏0
  • Spring Cloud 参考文档(客户端负载均衡器:Ribbon

    摘要:客户端负载均衡器是一个客户端负载均衡器,可以让你对和客户端的行为进行大量控制,已经使用了,因此,如果你使用,此部分也适用。 客户端负载均衡器:Ribbon Ribbon是一个客户端负载均衡器,可以让你对HTTP和TCP客户端的行为进行大量控制,Feign已经使用了Ribbon,因此,如果你使用@FeignClient,此部分也适用。 Ribbon中的一个核心概念是命名客户端,每个负载均...

    Songlcy 评论0 收藏0
  • 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon

    摘要:在服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于的。配置文件如下在工程的启动类中通过向服务中心注册并且注册了一个通过注册表明,这个是负载均衡的。 转载请标明出处: http://blog.csdn.net/forezp/a...本文出自方志朋的博客 在上一篇文章,讲了服务的注册和发现。在服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http re...

    dreamans 评论0 收藏0
  • 7、服务发现&服务消费者Ribbon

    摘要:在服务注册服务提供者这一篇可能学习了这么开发一个服务提供者,在生成上服务提供者通常是部署在内网上,即是服务提供者所在的服务器是与互联网完全隔离的。服务消费者本质上也是一个。 在《服务注册&服务提供者》这一篇可能学习了这么开发一个服务提供者,在生成上服务提供者通常是部署在内网上,即是服务提供者所在的服务器是与互联网完全隔离的。这篇说下服务发现(服务消费者),通常服务消费者是部署在与互联网...

    tangr206 评论0 收藏0
  • Spring Cloud 体验

    摘要:多层服务调用常见于微服务架构中较底层的服务如果出现故障,会导致连锁故障。 Spring Cloud 体验 简介 Spring Cloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、 事件总线、全局锁、决策竞选、分布式会话等等 基于Spring Boot,Spring Cloud将各公司成熟服务框架组合起来,通过Spring Boo...

    NotFound 评论0 收藏0

发表评论

0条评论

王晗

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<