欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Ribbon的負(fù)載均衡策略及原理是什么

本篇內(nèi)容介紹了“Ribbon的負(fù)載均衡策略及原理是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司主營(yíng)烈山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件定制開(kāi)發(fā),烈山h5微信小程序定制開(kāi)發(fā)搭建,烈山網(wǎng)站營(yíng)銷(xiāo)推廣歡迎烈山等地區(qū)企業(yè)咨詢(xún)

    Load Balance負(fù)載均衡是用于解決一臺(tái)機(jī)器(一個(gè)進(jìn)程)無(wú)法解決所有請(qǐng)求而產(chǎn)生的一種算法。像nginx可以使用負(fù)載均衡分配流量,ribbon為客戶(hù)端提供負(fù)載均衡,dubbo服務(wù)調(diào)用里的負(fù)載均衡等等,很多地方都使用到了負(fù)載均衡。

使用負(fù)載均衡帶來(lái)的好處很明顯:

當(dāng)集群里的1臺(tái)或者多臺(tái)服務(wù)器down的時(shí)候,剩余的沒(méi)有down的服務(wù)器可以保證服務(wù)的繼續(xù)使用
使用了更多的機(jī)器保證了機(jī)器的良性使用,不會(huì)由于某一高峰時(shí)刻導(dǎo)致系統(tǒng)cpu急劇上升
負(fù)載均衡有好幾種實(shí)現(xiàn)策略,常見(jiàn)的有:

隨機(jī) (Random)
輪詢(xún) (RoundRobin)
一致性哈希 (ConsistentHash)
哈希 (Hash)
加權(quán)(Weighted)


ILoadBalance 負(fù)載均衡器

ribbon是一個(gè)為客戶(hù)端提供負(fù)載均衡功能的服務(wù),它內(nèi)部提供了一個(gè)叫做ILoadBalance的接口代表負(fù)載均衡器的操作,比如有添加服務(wù)器操作、選擇服務(wù)器操作、獲取所有的服務(wù)器列表、獲取可用的服務(wù)器列表等等。ILoadBalance的繼承關(guān)系如下:

Ribbon的負(fù)載均衡策略及原理是什么

其中RandomRule表示隨機(jī)策略、RoundRobinRule表示輪詢(xún)策略、WeightedResponseTimeRule表示加權(quán)策略、BestAvailableRule表示請(qǐng)求數(shù)最少策略等等。

隨機(jī)策略很簡(jiǎn)單,就是從服務(wù)器中隨機(jī)選擇一個(gè)服務(wù)器,RandomRule的實(shí)現(xiàn)代碼如下:

public Server choose(ILoadBalancer lb, Object key) {
    if (lb == null) {
        return null;
    }
    Server server = null;
 
    while (server == null) {
        if (Thread.interrupted()) {
            return null;
        }
        List<Server> upList = lb.getReachableServers();
        List<Server> allList = lb.getAllServers();
        int serverCount = allList.size();
        if (serverCount == 0) {
            return null;
        }
        int index = rand.nextInt(serverCount); // 使用jdk內(nèi)部的Random類(lèi)隨機(jī)獲取索引值index
        server = upList.get(index); // 得到服務(wù)器實(shí)例
 
        if (server == null) {
            Thread.yield();
            continue;
        }
 
        if (server.isAlive()) {
            return (server);
        }
 
        server = null;
        Thread.yield();
    }
    return server;
}


RoundRobinRule輪詢(xún)策略表示每次都取下一個(gè)服務(wù)器,比如一共有5臺(tái)服務(wù)器,第1次取第1臺(tái),第2次取第2臺(tái),第3次取第3臺(tái),以此類(lèi)推:

    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            log.warn("no load balancer");
            return null;
        }
 
        Server server = null;
        int count = 0;
        while (server == null && count++ < 10) {
            List<Server> reachableServers = lb.getReachableServers();
            List<Server> allServers = lb.getAllServers();
            int upCount = reachableServers.size();
            int serverCount = allServers.size();
 
            if ((upCount == 0) || (serverCount == 0)) {
                log.warn("No up servers available from load balancer: ">


WeightedResponseTimeRule繼承了RoundRobinRule,開(kāi)始的時(shí)候還沒(méi)有權(quán)重列表,采用父類(lèi)的輪詢(xún)方式,有一個(gè)默認(rèn)每30秒更新一次權(quán)重列表的定時(shí)任務(wù),該定時(shí)任務(wù)會(huì)根據(jù)實(shí)例的響應(yīng)時(shí)間來(lái)更新權(quán)重列表,choose方法做的事情就是,用一個(gè)(0,1)的隨機(jī)double數(shù)乘以最大的權(quán)重得到randomWeight,然后遍歷權(quán)重列表,找出第一個(gè)比randomWeight大的實(shí)例下標(biāo),然后返回該實(shí)例,代碼略。

BestAvailableRule策略用來(lái)選取最少并發(fā)量請(qǐng)求的服務(wù)器:

public Server choose(Object key) {
    if (loadBalancerStats == null) {
        return super.choose(key);
    }
    List<Server> serverList = getLoadBalancer().getAllServers(); // 獲取所有的服務(wù)器列表
    int minimalConcurrentConnections = Integer.MAX_VALUE;
    long currentTime = System.currentTimeMillis();
    Server chosen = null;
    for (Server server: serverList) { // 遍歷每個(gè)服務(wù)器
        ServerStats serverStats = loadBalancerStats.getSingleServerStat(server); // 獲取各個(gè)服務(wù)器的狀態(tài)
        if (!serverStats.isCircuitBreakerTripped(currentTime)) { // 沒(méi)有觸發(fā)斷路器的話(huà)繼續(xù)執(zhí)行
            int concurrentConnections = serverStats.getActiveRequestsCount(currentTime); // 獲取當(dāng)前服務(wù)器的請(qǐng)求個(gè)數(shù)
            if (concurrentConnections < minimalConcurrentConnections) { // 比較各個(gè)服務(wù)器之間的請(qǐng)求數(shù),然后選取請(qǐng)求數(shù)最少的服務(wù)器并放到chosen變量中
                minimalConcurrentConnections = concurrentConnections;
                chosen = server;
            }
        }
    }
    if (chosen == null) { // 如果沒(méi)有選上,調(diào)用父類(lèi)ClientConfigEnabledRoundRobinRule的choose方法,也就是使用RoundRobinRule輪詢(xún)的方式進(jìn)行負(fù)載均衡        
        return super.choose(key);
    } else {
        return chosen;
    }
}


使用Ribbon提供的負(fù)載均衡策略很簡(jiǎn)單,只需以下幾部:

1、創(chuàng)建具有負(fù)載均衡功能的RestTemplate實(shí)例

@Bean
@LoadBalanced
RestTemplate restTemplate() {
    return new RestTemplate();
}


使用RestTemplate進(jìn)行rest操作的時(shí)候,會(huì)自動(dòng)使用負(fù)載均衡策略,它內(nèi)部會(huì)在RestTemplate中加入LoadBalancerInterceptor這個(gè)攔截器,這個(gè)攔截器的作用就是使用負(fù)載均衡。
默認(rèn)情況下會(huì)采用輪詢(xún)策略,如果希望采用其它策略,則指定IRule實(shí)現(xiàn),如:

@Bean
public IRule ribbonRule() {
    return new BestAvailableRule();
}


這種方式對(duì)Feign也有效。

我們也可以參考ribbon,自己寫(xiě)一個(gè)負(fù)載均衡實(shí)現(xiàn)類(lèi)。

可以通過(guò)下面方法獲取負(fù)載均衡策略最終選擇了哪個(gè)服務(wù)實(shí)例:

@Autowired
    LoadBalancerClient loadBalancerClient; 
    
    //測(cè)試負(fù)載均衡最終選中哪個(gè)實(shí)例
    public String getChoosedService() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("USERINFO-SERVICE");
        StringBuilder sb = new StringBuilder();
        sb.append("host: ").append(serviceInstance.getHost()).append(", ");
        sb.append("port: ").append(serviceInstance.getPort()).append(", ");
        sb.append("uri: ").append(serviceInstance.getUri());
        return sb.toString();
    }

“Ribbon的負(fù)載均衡策略及原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)頁(yè)標(biāo)題:Ribbon的負(fù)載均衡策略及原理是什么
網(wǎng)站地址:http://aaarwkj.com/article24/jessce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站虛擬主機(jī)、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)網(wǎng)站收錄、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
国产午夜精品自拍视频| 亚洲香蕉一区二区免费| 日韩精品中文字幕电影| 欧美成人精品在线观看| 国产高清学生三级一区二区| 热热久久这里只有精品| 福利视频一区二区视频| 欧美日韩亚洲视频二区| 国产精品白嫩初高中害羞小美女| 调教亚洲另类唯美第二页| 丰满少妇一区二区三区在线观看| 伊人蕉影院久亚洲高清| 深夜视频国产在线观看| 国产高清av免费在线播放| 老湿机午夜在线免费观看| 国产九色91中文在线视频| 欧美三级美国三级亚洲三级| 日韩精品中文字幕欧美激情| 午夜18禁毛片免费看| 粉嫩极品国产在线观看| 日韩精品一区二区一牛| 激情欧美一区二区三区精品| 亚洲熟妇中文字幕五十中出| 国产日韩久久免费电影| 国产一区二区不卡自拍| 午夜视频在线观看免费版| 亚洲av产在线精品亚洲第| 亚洲成人自拍视频在线观看| 国产我不卡在线观看免费| 国产网爆热门精品一区二区| 懂色av中文一区二区| 亚洲午夜福利天堂社区| 久久精品国产亚洲av久| 国产欧美又粗又猛又爽老| 青青草免费在线播放视频网站| 日本在线看片一区二区| 一区二区视频精品在线观看| 中文字幕二区三区人妻| 日本少妇三级网站大全| 国产欧美日本综合一区| 亚洲青涩精品一区二区三区|