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

    你可能感兴趣的文章
    power english (1) —— passion
    查看>>
    Power English (1) 原文
    查看>>
    power English (3)原文
    查看>>
    POWER ENGLISH(7)- repetition
    查看>>
    SpringBoot中集成SpringBatch详细解析与实战示例(CSV文件读取十万条数据进行业务处理后写入Mysql数据库)
    查看>>
    powerbi 一张表在另外一张表中出现的数量_PowerBi之初步学习笔记
    查看>>
    QGIS怎样设置简体中文以及新建可编辑的多边形的图层
    查看>>
    PowerBuilder 使用自定义事件触发键盘Enter事件
    查看>>
    PowerCreatorCMS UploadResourcePic 任意文件上传漏洞复现
    查看>>
    PowerDesigner 使用的一些技巧(转)
    查看>>
    QGIS在Windows上下载安装与建立空间数据库连接
    查看>>
    PowerDesigner165安装婆姐汉花教程
    查看>>
    PowerDesigner使用教程:设置注释、默认值属性
    查看>>
    PowerDesigner使用教程:不显示背景网格
    查看>>
    PowerDesigner使用教程:创建数据模型以及导出
    查看>>
    PowerDesigner使用教程:右侧工具栏显示/隐藏
    查看>>
    PowerDesigner使用教程:导出sql文件以及解决中文乱码问题
    查看>>
    PowerDesigner使用教程:时间字段设置
    查看>>
    PowerDesigner使用教程:给字段添加唯一约束
    查看>>
    QGIS中怎样设置图层样式并导出地图样式
    查看>>