• 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函数去根据服务名来选择实例并发起实际的请求。

  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/htyj/p/10705547.html
Copyright © 2020-2023  润新知