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

    你可能感兴趣的文章
    MySQL高级-视图
    查看>>
    nacos集群搭建
    查看>>
    Nessus漏洞扫描教程之配置Nessus
    查看>>
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    Netty WebSocket客户端
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0014---Buffer类型化和只读
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>