如何使用Ribbon實現(xiàn)服務負載均衡、結合Eureka、簡單定義策略

上一篇文章Eureka自我保護機制、健康檢查的作用、actuator模塊監(jiān)控 ,我們簡單學習了服務健康監(jiān)控的一些知識,這篇文章的主題是使用Ribbon實現(xiàn)服務負載均衡。
在學習之前,我們先弄清一個概念,什么叫負載均衡?負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務器、FTP服務器企業(yè)關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
顯然,度娘已經很完美的解答了這個問題,用大白話解釋就是客戶端在請求數據的時候,其實每次請求的服務器都不一定是相同的。
今天我們來使用Spring Clound Ribbon來實現(xiàn)服務的負載均衡。Ribbon 從屬于Spring Cloud Netflix 項目。
我們仍然以上篇文章中的三個工程為例(Eureka-server,userreg,myweb),為了模擬多節(jié)點,我們先復制userreg工程,命名為userreg2,端口改為9002,其余一模一樣。
我們在myweb工程pom文件中添加如下依賴

...
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
...

接下來我們只需要在業(yè)務類中,作如下代碼

@RestController
public class Myweb {
    @Autowired
    DiscoveryClient discoveryClient;
    @Autowired
    LoadBalancerClient mLoadBalancerClient;

    @RequestMapping("/userreg")
    public Map userreg() {
//        List<ServiceInstance> list = discoveryClient.getInstances("USERREG");
//        String serviceUrl = list.get(0).getUri().toString();

        /*robbinz負載均衡實現(xiàn)*/
        ServiceInstance userreg = mLoadBalancerClient.choose("USERREG");
        String serviceUrl = userreg.getUri().toString();
        System.out.println(serviceUrl);
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(serviceUrl + "/reg", Map.class);
    }
}

代碼就是如此簡潔!注入LoadBalancerClient實例,使用LoadBalancerClient實例中的choose方法,根據微服務名稱來獲取服務實例,在這個選擇或者說獲取服務實例的過程中,Robbon內部采用一定的規(guī)則來確定獲取哪個服務實例(默認使用輪詢index,選擇index對應位置的server)。我們多調用幾次http://localhost:9050/userreg接口,我們查看控制臺

image.png
可以看到默認規(guī)則下是均衡負載的。
如果我們需要自定義規(guī)則要怎么做呢?
其實也很簡單,我們可以先看下ribbon均衡策略有哪些?


策略名 策略描述 實現(xiàn)說明
BestAvailableRule 選擇一個最小的并發(fā)請求的server 逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server
AvailabilityFilteringRule 過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,并過濾掉那些高并發(fā)的的后端server(active connections 超過配置的閾值) 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個server的運行狀態(tài)
WeightedResponseTimeRule 根據相應時間分配一個weight,相應時間越長,weight越小,被選中的可能性越低。 一 個后臺線程定期的從status里面讀取評價響應時間,為每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運行,沒有形成statas時,使用roubine策略選擇 server。
RetryRule 對選定的負載均衡策略機上重試機制。 在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server
RoundRobinRule(默認) roundRobin方式輪詢選擇server 輪詢index,選擇index對應位置的server
RandomRule 隨機選擇一個server 在index上隨機,選擇index對應位置的server
ZoneAvoidanceRule 復合判斷server所在區(qū)域的性能和server的可用性選擇server 使 用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個 zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于過濾掉連接數過多的 Server。

我們如果定義使用隨機RandomRule,我們可以建立一個config類

@Configuration
public class MyConfig {
    @Bean
    public IRule getRibbonRule() {
        return new RandomRule();
    }

}

別忘了在類上添加注解@Configuration哦。
好了我們現(xiàn)在重啟一下服務,瘋狂訪問http://localhost:9050/userreg接口,我們看下控制臺

image.png

我們發(fā)現(xiàn)ribbon已經幫我們切換了均衡策略,隨機選擇一個服務供調用。
預告我們后面一篇文章使用Feign調用注冊在Eureka中的遠程服務(入門)

作者:簡書
鏈接:http://www.itdecent.cn/p/q81RER
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容