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

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

Ribbon中BestAvailableRule和RetryRule的使用方法

這篇文章主要講解了“Ribbon中BestAvailableRule和RetryRule的使用方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Ribbon中BestAvailableRule和RetryRule的使用方法”吧!

十余年的郟縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整郟縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“郟縣網(wǎng)站設(shè)計(jì)”,“郟縣網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

    Ribbon的版本是2.3.0.release.

1.BestAvailableRule

                    Ribbon中BestAvailableRule和RetryRule的使用方法

                                                                              圖1

    ClientConfigEnabledRoundRobinRule如下所示,定義了一個(gè)類屬性RoundRobinRule,choose方法中調(diào)用RoundRobinRule進(jìn)行選擇,所以這里面的是輪循算法。

    List-1.1

public class ClientConfigEnabledRoundRobinRule extends AbstractLoadBalancerRule {
    RoundRobinRule roundRobinRule = new RoundRobinRule();

    public ClientConfigEnabledRoundRobinRule() {
    }

    public void initWithNiwsConfig(IClientConfig clientConfig) {
        this.roundRobinRule = new RoundRobinRule();
    }

    public void setLoadBalancer(ILoadBalancer lb) {
        super.setLoadBalancer(lb);
        this.roundRobinRule.setLoadBalancer(lb);
    }

    public Server choose(Object key) {
        if (this.roundRobinRule != null) {
            return this.roundRobinRule.choose(key);
        } else {
            throw new IllegalArgumentException("This class has not been initialized with the RoundRobinRule class");
        }
    }
}

    BestAvailableRule繼承了ClientConfigEnabledRoundRobinRule,內(nèi)部實(shí)現(xiàn)如下List-1.2,遍歷所有的服務(wù)提供者,選擇并發(fā)量最小的那個(gè)服務(wù)。

    List-1.2

private LoadBalancerStats loadBalancerStats;

public Server choose(Object key) {
    if (this.loadBalancerStats == null) {
        return super.choose(key);
    } else {
        List serverList = this.getLoadBalancer().getAllServers();
        int minimalConcurrentConnections = 2147483647;
        long currentTime = System.currentTimeMillis();
        Server chosen = null;
        Iterator var7 = serverList.iterator();

        while(var7.hasNext()) {
            Server server = (Server)var7.next();
            ServerStats serverStats = this.loadBalancerStats.getSingleServerStat(server);
            if (!serverStats.isCircuitBreakerTripped(currentTime)) {
                int concurrentConnections = serverStats.getActiveRequestsCount(currentTime);
                if (concurrentConnections < minimalConcurrentConnections) {
                    minimalConcurrentConnections = concurrentConnections;
                    chosen = server;
                }
            }
        }

        if (chosen == null) {
            return super.choose(key);
        } else {
            return chosen;
        }
    }
}

public void setLoadBalancer(ILoadBalancer lb) {
    super.setLoadBalancer(lb);
    if (lb instanceof AbstractLoadBalancer) {
        this.loadBalancerStats = ((AbstractLoadBalancer)lb).getLoadBalancerStats();
    }

}

    choose方法重新了父類中的choose方法,

  1. 獲取服務(wù)列表,遍歷服務(wù)

  2. 通過(guò)ServerStats獲取當(dāng)前服務(wù)實(shí)例的并發(fā)連接數(shù),如下List-3所示,并發(fā)連接數(shù)不是0,且當(dāng)前時(shí)間與上次有效更改時(shí)間間隔在范圍內(nèi),則返回當(dāng)前并發(fā)連接數(shù)。

  3. 遍歷所有的服務(wù)提供者后,如果得到的server是null,則調(diào)用父類的choose方法,用RoundRobin算法進(jìn)行選擇。

    List-1.3

public int getActiveRequestsCount(long currentTime) {
    int count = this.activeRequestsCount.get();
    if (count == 0) {
        return 0;
    } else if (currentTime - this.lastActiveRequestsCountChangeTimestamp <= (long)(activeRequestsCountTimeout.get() * 1000) && count >= 0) {
        return count;
    } else {
        this.activeRequestsCount.set(0);
        return 0;
    }
}

2.RetryRule

                                       Ribbon中BestAvailableRule和RetryRule的使用方法

                                                                                  圖2

    RetryRule的實(shí)現(xiàn)比較簡(jiǎn)單,基于RoundRobinRule,如下List-2.1所示

    List-2.1

public class RetryRule extends AbstractLoadBalancerRule {
    IRule subRule = new RoundRobinRule();
    long maxRetryMillis = 500L;
    ...
    public Server choose(ILoadBalancer lb, Object key) {
        long requestTime = System.currentTimeMillis();
        long deadline = requestTime + this.maxRetryMillis;
        Server answer = null;
        answer = this.subRule.choose(key);
        if ((answer == null || !answer.isAlive()) && System.currentTimeMillis() < deadline) {
            InterruptTask task = new InterruptTask(deadline - System.currentTimeMillis());

            while(!Thread.interrupted()) {
                answer = this.subRule.choose(key);
                if (answer != null && answer.isAlive() || System.currentTimeMillis() >= deadline) {
                    break;
                }

                Thread.yield();
            }

            task.cancel();
        }

        return answer != null && answer.isAlive() ? answer : null;
    }
    ...

    RetryRule中choose(Object key)調(diào)用choose(ILoadBalancer lb, Object key),

  1. 當(dāng)前時(shí)間加上maxRetryMillis得到deadline,即截止時(shí)間

  2. 用subRule獲取服務(wù)server,如果服務(wù)有效則直接返回該服務(wù)

  3. 構(gòu)造InterruptTask,它里面有個(gè)Timer定時(shí)任務(wù),如List-2.2。之后循壞,只要當(dāng)前線程沒(méi)有被interrupt,則用subRule的RoundRobin算法選擇一個(gè)服務(wù)實(shí)例,如果這個(gè)服務(wù)有效或者當(dāng)前時(shí)間過(guò)了截止時(shí)間則跳出循壞

  4. 如果步驟3中得到的服務(wù)實(shí)例無(wú)效,且當(dāng)前時(shí)間在截止時(shí)間之內(nèi),則調(diào)用Thread.yield(),讓出線程資源給其它線程

    通過(guò)源碼可知,RetryRule在subRule.choose獲得無(wú)效的服務(wù)實(shí)例后,僅僅是再次再次用subRule獲取服務(wù)實(shí)例,并不會(huì)一直嘗試下去,即嘗試一次。

    List-2.2

public class InterruptTask extends TimerTask {
    static Timer timer = new Timer("InterruptTimer", true);
    protected Thread target = null;

    public InterruptTask(long millis) {
        this.target = Thread.currentThread();
        timer.schedule(this, millis);
    }

    public boolean cancel() {
        try {
            return super.cancel();
        } catch (Exception var2) {
            return false;
        }
    }

    public void run() {
        if (this.target != null && this.target.isAlive()) {
            this.target.interrupt();
        }
    }
    ...

感謝各位的閱讀,以上就是“Ribbon中BestAvailableRule和RetryRule的使用方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Ribbon中BestAvailableRule和RetryRule的使用方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁(yè)標(biāo)題:Ribbon中BestAvailableRule和RetryRule的使用方法
文章起源:http://weahome.cn/article/ishcph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部