博客
关于我
Ribbon 负载均衡调用04——ribbon 负载均衡算法||手写轮询算法(原理+JUC)CAS+自旋锁
阅读量:520 次
发布时间:2019-03-07

本文共 1993 字,大约阅读时间需要 6 分钟。

Spring Cloud 负载均衡组件源码剖析

RoundRobinRule 是 Netflix 开源的负载均衡策略之一,以轮询的方式均匀分配请求。本文将深入剖析其源码,并结合相关组件,分析其工作原理。

RoundRobinRule.java 模块

RoundRobinRule 是 Netflix 负载均衡策略中最基础搭配之一。其核心目标是确保客户端在发起请求时,能够均匀地将请求分配到服务器集群中的不同实例。

源码分析

  • 模块初始化

    不过,模块的初始化部分较为简单,其主要工作是维护一个原子性计数器 nextServerCyclicCounter,用于跟踪下一个需要访问的服务器索引。

  • 负载均衡选择机制

    choose 方法是负载均衡的核心逻辑。在这里,算法采用轮询方式,逐个访问服务器列表,直到找到一个既可达又能处理请求的服务器。以下是具体实现:

    • 首先,通过 getReachableServers 获取当前可达的服务器列表。
    • 查找 getAllServers 获取所有服务器实例。
    • 在轮询过程中,使用 incrementAndGetModulo 方法生成下一个服务器索引。
    • 通过 compareAndSet 方法保证计数器的原子性。
  • 守护机制

    如果在 10 次尝试内未能找到合适的服务器,系统将记录一个警告信息,以提示潜在的服务器不活跃问题。

  • Modulo 计数器逻辑

    incrementAndGetModulo 方法采用了一种原子性操作,确保在多线程环境下计数器不会出现竞态条件。其算法逻辑较为简单,仅是对当前计数器值进行加1操作,并模上总数。这保证了计数器不会超出预设范围。

    组件协调

    在 spring cloud 应用中,负载均衡策略 (MyLB) 与服务发现组件紧密配合。通过 ILoadBalancer 接口,各策略可以通过自定义实现进行扩展或修改。

    LoadBalancer 接口

    LoadBalancer 接口定义了负载均衡策略的核心方法 instances,该方法接受一个服务实例列表,并返回一个根据负载均衡策略分配的实例。

    MyLB 实现

    MyLB 是一种自定义负载均衡实现,采用了基于计数器的模块化策略。其核心思想是根据调用次数确定下一个服务器索引。具体实现如下:

    负载均衡算法

    • 维护一个原子性计数器,从 0 开始递增。
    • 使用 modulo 操作根据服务实例总数决定下一个服务器索引。
    • 返回对应索引的服务实例。

    这种方法的优点在于简单易懂,并能有效避免服务器压力集中。它也弥补了分布式环境下全互斥的复杂性。

    顺序控制器

    在 Spring 应用中,OrderController 类充当了业务逻辑的协调中心。其与其他组件如支付服务、发现客户等紧密结合,通过负载均衡策略来优化请求分配。

    代码示例

    public class OrderController {    @Resource    private RestTemplate restTemplate;    @Resource    private LoadBalancer loadBalancer;    @Resource    private DiscoveryClient discoveryClient;    @GetMapping("/consumer/payment/lb")    public String getLB() {        List
    instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); if (instances == null || instances.isEmpty()) { return null; } ServiceInstance selected = loadBalancer.instances(instances); URI uri = selected.getUri(); return restTemplate.getForObject(uri + "/payment/lb", String.class); }}

    该示例展示了如何通过负载均衡策略自动获取服务实例信息,严重简化了服务调用层的逻辑。它确保了在动态容器化环境下,服务的访问信息能快速获取。

    总结

    RoundRobinRule 作为基础负载均衡策略,简单易行。其算法逻辑直接,服务器选择基于轮询原则。结合 AtomicInteger 原子性操作,确保了.count.Playground.

    通过本文的分析,开发者可以清晰理解其工作原理,并根据实际需求选择和配置适合的负载均衡策略。

    转载地址:http://wsznz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现BMP图像旋转180度(附完整源码)
    查看>>
    Objective-C实现bogo sort排序算法(附完整源码)
    查看>>
    Objective-C实现boruvka博鲁夫卡算法(附完整源码)
    查看>>
    Objective-C实现Boyer-Moore字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现BP误差逆传播算法(附完整源码)
    查看>>
    Objective-C实现breadth First Search广度优先搜索算法(附完整源码))
    查看>>
    Objective-C实现BreadthFirstSearch广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现BreadthFirstShortestPath广度优先最短路径算法(附完整源码)
    查看>>
    Objective-C实现bubble sort冒泡排序算法(附完整源码)
    查看>>
    Objective-C实现bucket sort桶排序算法(附完整源码)
    查看>>
    Objective-C实现Burke 抖动算法(附完整源码)
    查看>>
    Objective-C实现Burrows-Wheeler 算法(附完整源码)
    查看>>
    Objective-C实现CaesarsCiphe凯撒密码算法(附完整源码)
    查看>>
    Objective-C实现calloc函数功能(附完整源码)
    查看>>
    Objective-C实现canny边缘检测算法(附完整源码)
    查看>>
    Objective-C实现cartesianProduct笛卡尔乘积算法(附完整源码)
    查看>>
    Objective-C实现check strong password检查密码强度算法(附完整源码)
    查看>>
    Objective-C实现chudnovsky algorithm楚德诺夫斯基算法(附完整源码)
    查看>>
    Objective-C实现CIC滤波器(附完整源码)
    查看>>
    Objective-C实现circle sort圆形排序算法(附完整源码)
    查看>>