Ribbon组件的负载均衡原理

  1. 原因背景
    1. spring cloud的底层负载均衡是采用Ribbon组件,我们将user-service服务注册到eureka-server中,那么当我们在另一个服务的代码层面请求远程调用API接口http://user-service/users/5时,程序代码如何解析远程调用的user-service服务名转化为相应的服务ip地址以及端口,从而实现指定服务的远程调用
  2. 源码跟踪
    1. 我们通过http请求服务的时候,请求地址是服务名,很显然是有相应的拦截器将我们的服务名拦截修改成相应的ip地址以及端口,这个拦截器就是LoadBalancerInterceptor类
    2. 接下来我们进入this.loadBalancer.execute(serviceName,this.requestFactory.createRequest(request, body, execution))方法,可以知道接下来获取一个负载均衡器ILoadBalancer,然后通过执行getServer(loadBalancer, hint)方法,采用内置的负载均衡算法从eureka-server获取的服务列表中选择其中一个服务实例
    3. 接下来我们进入getServer(loadBalancer, hint)方法,如果没有配置将会采用默认的(default)
    4. 继续进入loadBalancer.chooseServer(hint != null ? hint : "default")方法
    5. 可以看出默认的负载均衡算法是RoundRobinRule,也就是轮询的意思
    6. 最终执行可以看出,当前经过负载均衡算法得到的实例服务是localhost:8081
  3. 总结
    1. LoadBalancerInterceptor拦截我们的RestTemplate请求http://user-service/users/5
    2. RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
    3. DynamicServerListLoadBalancer根据user-service到eureka-server拉取服务列表
    4. 获取eureka-server返回user-service的服务列表,localhost:8080、localhost:8081、localhost:8082
    5. IRule利用内置负载均衡规则,从服务列表中选择一个实例,例如localhost:8081
    6. RibbonLoadBalancerClient修改请求地址,用localhost:8081替代user-service,得到http://localhost:8081/users/5,进而发起真实的http请求

相关推荐

  1. 12-Ribbon-负载均衡原理

    2023-12-10 11:04:02       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 11:04:02       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 11:04:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 11:04:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 11:04:02       18 阅读

热门阅读

  1. Python——lambda匿名函数

    2023-12-10 11:04:02       40 阅读
  2. 第二十九章 控制到 XML 模式的映射 - 类名列表

    2023-12-10 11:04:02       26 阅读
  3. Linux centos7 扩展磁盘

    2023-12-10 11:04:02       34 阅读
  4. vue中的拖拽事件

    2023-12-10 11:04:02       34 阅读
  5. Let和Var的区别

    2023-12-10 11:04:02       34 阅读
  6. 项目记录:跨域问题解决方案

    2023-12-10 11:04:02       38 阅读
  7. js new 原理

    2023-12-10 11:04:02       36 阅读