• Ribbon跟Nginx实现负载均衡的区别!


    一,

    Ribbon是在客户端去进行请求的分发,而Nginx则是服务器端的

    下面是Ribbon的源码

        public Server choose(ILoadBalancer lb, Object key) {
            if (lb == null) {
                log.warn("no load balancer");
                return null;
            } else {
                Server server = null;
                int count = 0;
     
                while(true) {
                    if (server == null && count++ < 10) {
                        List reachableServers = lb.getReachableServers();
                        List allServers = lb.getAllServers();
                        int upCount = reachableServers.size();
                        int serverCount = allServers.size();
                        if (upCount != 0 && serverCount != 0) {
                            int nextServerIndex = this.incrementAndGetModulo(serverCount);
                            server = (Server)allServers.get(nextServerIndex);
                            if (server == null) {
                                Thread.yield();
                            } else {
                                if (server.isAlive() && server.isReadyToServe()) {
                                    return server;
                                }
     
                                server = null;
                            }
                            continue;
                        }
     
                        log.warn("No up servers available from load balancer: " + lb);
                        return null;
                    }
     
                    if (count >= 10) {
                        log.warn("No available alive servers after 10 tries from load balancer: " + lb);
                    }
     
                    return server;
                }
            }
        }
     
     
        private int incrementAndGetModulo(int modulo) {
            int current;
            int next;
            do {
                current = this.nextServerCyclicCounter.get();
                next = (current + 1) % modulo;
                //while 自旋操作
            } while(!this.nextServerCyclicCounter.compareAndSet(current, next));
     
            return next;
        }

    二,工作原理

    • Ribbon:Ribbon 通过在客户端维护服务实例列表和选择算法来实现负载均衡。客户端应用程序通过 Ribbon 客户端负载均衡器来选择要发送请求的服务实例。
    • Nginx:Nginx 在服务器端实现负载均衡,它接收来自客户端的请求,并根据预先配置的负载均衡策略将请求分发给多个后端服务器。Nginx 可以根据请求的不同特征,如 IP 地址、HTTP 头部等,使用不同的负载均衡算法。

    三,性能跟灵活性

    • Ribbon:Ribbon 作为客户端库集成到应用程序中,对于每个请求都需要在客户端进行负载均衡选择,可能会增加客户端的负载和延迟。
    • Nginx:Nginx 是一个高性能的反向代理服务器,通过在服务器端实现负载均衡,可以有效地减轻客户端的负载,并提供更好的性能和灵活性。

    总结

    总的来说,Ribbon 适用于微服务架构中服务消费方的负载均衡,而 Nginx 则适用于各种类型的应用程序和服务,提供了更灵活、高性能的负载均衡解决方案。

  • 相关阅读:
    Java练习题-获取数组元素最大值
    【图像去噪】基于非线性扩散PM算法实现图像去噪附matlab代码
    Leetcode2918. 数组的最小相等和
    工作中积累的对K8s的就绪和存活探针的一些认识
    深夜 2 点,差点魂归故土
    【算法基础】轮盘赌算法 轮盘选择算子
    LeetCode力扣刷题——指针三剑客之三:图
    一篇掌握docker
    Android笔记
    Vue.js正式环境中配置多个请求的URL
  • 原文地址:https://blog.csdn.net/2301_81018165/article/details/136689360