SpringCloudAlibaba-負載均衡Ribbon


簡介

Ribbon是Spring Cloud的一個組件, 它可以讓我們使用一個注解就能輕松的搞定負載均衡,內置多種負載均衡策略,內部負載均衡頂級接口為com.netflix.loadbalancer.IRule:具體策略如下

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

修改配置(appliaction.yml)來調整Ribbon的負載均衡策略

service-product: # 調用的提供者的名稱
 ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

RestTemplate的生成方法上添加@LoadBalanced注解

@Bean
@LoadBalanced //基於ribbon的負載均衡
public RestTemplate getRestTemplate() {
   return new RestTemplate();
}

接下來改造下單方法

    @GetMapping("/prod/{pid}")
    public Order order(@PathVariable("pid") Integer pid){
        log.info(">>>客戶下單,調用商品微服務查詢商品信息<<<");

        //直接使用微服務實例名,從nacos中獲取服務地址
        String url = "service-product";
        Product product = restTemplate.getForObject("http://"+url+"/product/"+pid, Product.class);

        log.info(">>商品信息,查詢結果:" + JSON.toJSONString(product));
        Order order = new Order();
        order.setUid(1);
        order.setUsername("測試用戶1");
        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
//        orderService.save(order);
        return order;
    }

 

通過Idea再啟動一個shop-product服務,設置端口為8082如下圖修改

啟動查看nacos是否注冊成功(下圖可以看到service-product注冊了兩個實例)

 現在進行測試結果調用(執行兩次)結果日志如下

Order  log
>>商品信息,查詢結果:{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}
>>>客戶下單,調用商品微服務查詢商品信息<<<
>>商品信息,查詢結果:{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}

product  log
商品信息查詢成功,內容為{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}

product2  log
商品信息查詢成功,內容為{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}

product、product2分別有日志輸出  則說明兩次調用分別執行到了兩個商品微服務、也說明ribbon負載均衡使用成功

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM