真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Ribbon中RandomRule和RoundRobinRule的使用方法

本篇內(nèi)容介紹了“Ribbon中RandomRule和RoundRobinRule的使用方法”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司主要為客戶提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁視覺設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、全網(wǎng)整合營銷推廣、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)手機(jī)網(wǎng)站開發(fā)、微商城、網(wǎng)站托管及成都網(wǎng)站維護(hù)、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為成都塑料袋行業(yè)客戶提供了網(wǎng)站改版服務(wù)。

    Ribbon的版本是2.3.0.release.

1.RandomRule

                          Ribbon中RandomRule和RoundRobinRule的使用方法

                                                                                     圖1

    圖1所示,RandomRule繼承AbstractLoadBalancerRule,調(diào)用choose(Object)時(shí),調(diào)用內(nèi)部方法choose(ILoadBalancer lb, Object key),如下List-1

    List-1

public Server choose(ILoadBalancer lb, Object key) {
    if (lb == null) {
        return null;
    } else {
        Server server = null;

        while(server == null) {
            if (Thread.interrupted()) {
                return null;
            }

            List upList = lb.getReachableServers();
            List allList = lb.getAllServers();
            int serverCount = allList.size();
            if (serverCount == 0) {
                return null;
            }

            int index = this.chooseRandomInt(serverCount);
            server = (Server)upList.get(index);
            if (server == null) {
                Thread.yield();
            } else {
                if (server.isAlive()) {
                    return server;
                }

                server = null;
                Thread.yield();
            }
        }

        return server;
    }
}

protected int chooseRandomInt(int serverCount) {
    return ThreadLocalRandom.current().nextInt(serverCount);
}
  1. 通過ILoadBalancer獲取所有的服務(wù),如果服務(wù)個(gè)數(shù)是0則直返回null

  2. 調(diào)用chooseRandomInt方法,參數(shù)是服務(wù)個(gè)數(shù),這樣返回的隨機(jī)值是在0與服務(wù)數(shù)之間,有趣的是出于多線程安全的考慮,使用了java.util.concurrent.ThreadLocalRandom#current來獲取隨機(jī)值

  3. 如果服務(wù)是alive,則返回改服務(wù)

2.RoundRobinRule

                                 Ribbon中RandomRule和RoundRobinRule的使用方法

                                                                                  圖2

    RoundRobinRule是輪循算法實(shí)現(xiàn),choose(Object)方法會調(diào)用choose(ILoadBalancer lb, Object key),如下List-2所示

    List-2

private AtomicInteger nextServerCyclicCounter;

public RoundRobinRule() {
    this.nextServerCyclicCounter = new AtomicInteger(0);
}

public RoundRobinRule(ILoadBalancer lb) {
    this();
    this.setLoadBalancer(lb);
}

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(!this.nextServerCyclicCounter.compareAndSet(current, next));

    return next;
}

    很重要的一個(gè)類屬性是AtomicInteger nextServerCyclicCounter,通過它來實(shí)現(xiàn)輪循。

  1. ILoadBalancer獲取所有的服務(wù)列表

  2. 之后調(diào)用incrementAndGetModulo方法,參數(shù)是服務(wù)個(gè)數(shù),incrementAndGetModulo方法中用CAS來實(shí)現(xiàn)線程安全,獲得服務(wù)的下標(biāo)

  3. 得到服務(wù)Server后,判斷是否是alive和ReadyToServe,則返回;如果循壞了10次還沒有找到,則log打印warn日志提示

    這個(gè)實(shí)現(xiàn)是簡單的輪循,沒有實(shí)現(xiàn)有權(quán)重的RoundRibbon。

“Ribbon中RandomRule和RoundRobinRule的使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


網(wǎng)站欄目:Ribbon中RandomRule和RoundRobinRule的使用方法
分享鏈接:http://weahome.cn/article/iidjch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部