zoukankan      html  css  js  c++  java
  • Spring cloud 之Ribbon(二)负载均衡原理

    ribbon实现负载均衡的原理

    我们从Ribbon实现负载均衡的代码可以看到,Ribbon是通过RestTemPlate实现客户端负载均衡的,准确的说是RestTemPlate上的@LoadBalanced实现负载均衡的,我们看一下LoadBalanced的代码内容:

    public interface LoadBalancerClient {
         Serviceinstance choose(String serviceId);
         <T> T execute(String werviceId,LoadBalancerRequest<T> request) throws IOException;
          URI reconstructURI(ServiceInstance instance,URI original);             
    }
    • choose方法:根据传入的服务serviceId,从负载均衡器中挑选一个对应服务的示例。
    •  execute方法:使用从负载均衡器中挑选出来的服务示例来执行请求内容。
    • reconstructURI方法:为系统构建一个合适的host:port形式的URI。在分布式系统中,我们呢使用逻辑上的服务名称作为host来构建URI(替换服务实例的后三天:port形式)进行请求,比如http://myservice /path/to/service。在改操作的定义中,前者ServiceInstance对象是带有host和port的具体服务实例,而后者URI对象则是使用逻辑服务名定义为host的URI,而返回的URI内容则是通过ServiceInstance的服务实例详情拼接出的具体host:post形式的请求地址。

      通过LoadBalancerClient进行梳理,可以看到LoadBalancerAutoConfiguration为客户端负载均衡器的自动化配置类。看源码可以看到,LoadBalancerAutoConfiguration类头上的注解可以知道,Ribbon实现的负载均衡自动化配置需要满足下面两个条件:

    • @ConditionalOnClass(RestTemplate.class):  RestTemplate类必须存在于当前工程的环境中。
    • @ConditionalOnBean(LoadBalancerClient,class):在Spring的Bean工程中必须有LoadBalancerClient的实现Bean。

      在该自动化配置类中,主要做了三件事:

    • 创建了一个LoadBalancerInterceptor的Bean,用于实现对客户端发起请求时进行拦截,以是西安客户端负载均衡。
    • 创建了一个RestTemplateCustomizer的Bean,用于给RestTemplate增加LoadBalancerInterceptor拦截器
    • 维护一个被@LoadBalanced注解修饰的RestTemplate对象列表,并在这里进行初始化,通过调用RestTemplateCustomizer的实例来给需求客户端负载均衡的RestTemplate增加LoadBalancerinterceptor

       接下来,我们看看LoadBalancerInterceptor拦截器是如何将一个普通的RestTemplate变成客户端负载均衡的:

      通过LoadBalancerInterceptor的源码分析,我们可以看到在拦截器中注入了LoadbalancerClient的实现。当一个被@LoadBalanced注解修饰的RestTemplate对象向外发起HTTP请求时,会被LoadBalancerInterceptor类的intercept的函数所拦截。由于我们在用RestTemplate时采用了服务名作为host,所以直接从HttpRequest的URI对象中通过getHost(0就可以拿到用户名,然后调用execute函数去根据服务名来选择实例并发起实际的请求。

  • 相关阅读:
    1.1下载
    【翻译】培训提示:解决常见编码问题的简单技巧
    小猪的Git使用总结
    Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
    springweb flux 编程模型
    java aop做一个接口耗时的计算
    mysql保留两位小数
    在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程
    Windows下编译使用Aliyun OSS PHP SDK
    windows下Gulp入门详细教程 &&gulp安装失败的原因(红色)
  • 原文地址:https://www.cnblogs.com/htyj/p/10705547.html
Copyright © 2011-2022 走看看