簡介
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負載均衡使用成功