博客
关于我
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/

    你可能感兴趣的文章
    Openstack的视频学习
    查看>>
    openstack虚拟机迁移live-migration中libvirt配置
    查看>>
    ORACEL学习--理解over()函数
    查看>>
    ORACLE Bug 4431215 引发的血案—原因分析篇
    查看>>
    oracle dblink 创建使用 垮库转移数据
    查看>>
    oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
    查看>>
    Oracle dbms_job.submit参数错误导致问题(ora-12011 无法执行1作业)
    查看>>
    oracle dg switchover,DG Switchover fails
    查看>>
    Oracle EBS环境下查找数据源(OAF篇)
    查看>>
    Oracle GoldenGate Director安装和配置(无图)
    查看>>
    oracle script
    查看>>
    Oracle select表要带双引号的原因
    查看>>
    Oracle SOA Suit Adapter
    查看>>
    Oracle Spatial空间数据库建立
    查看>>
    UML— 活动图
    查看>>
    Oracle Statspack分析报告详解(一)
    查看>>
    oracle 使用leading, use_nl, rownum调优
    查看>>
    Oracle 写存储过程的一个模板还有一些基本的知识点
    查看>>
    Oracle 创建 DBLink 的方法
    查看>>
    oracle 创建字段自增长——两种实现方式汇总
    查看>>