SpringCloud之服務呼叫(Ribbon)
阿新 • • 發佈:2018-11-22
業務場景
訂單服務呼叫商品服務叢集,進行偽下單功能開發,使用Ribbon實現訂單呼叫商品服務。
思路:
1.建立訂單服務
2.編寫偽下單介面
a.呼叫商品服務獲取商品資訊(Ribbon呼叫服務)
b.根據商品資訊,訂單介面返回訂單詳情資訊
呼叫邏輯圖如下:
實現訂單服務專案
訂單服務專案通過Spring Initializr搭建專案,選擇Web 和 Eureka Discovery。跟前一篇部落格寫的Product-Service是一樣的。我們把Product-Service例項埠也獲取到放入到產品資訊中,驗證Ribbon的客戶端負載均衡。
order-service入口:
分析:
服用的呼叫就是通過RestTemplate實現,而RestTemplate是通過Ribbon實現的。@LoadBalanced是客戶端負載均衡的註解。
服務呼叫:
package com.ckmike.order_service.service.impl; import com.ckmike.order_service.domain.ProductOrder; import com.ckmike.order_service.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.Date; import java.util.Map; import java.util.UUID; /** * OrderServiceImpl 簡要描述 * <p> TODO:描述該類職責 </p> * * @author ckmike * @version 1.0 * @date 18-11-7 下午11:55 * @copyright ckmike **/ @Service public class OrderServiceImpl implements OrderService { @Autowired private RestTemplate restTemplate; @Override public ProductOrder save(int userId, int productId) { // 獲取商品資訊 Map<String,Object> obj = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId,Map.class); ProductOrder productOrder = new ProductOrder(); productOrder.setCreateTime(new Date()); productOrder.setUserId(userId); productOrder.setTradeNo(UUID.randomUUID().toString()); productOrder.setPrice(Double.parseDouble(obj.get("price").toString())); productOrder.setProductName(obj.get("name").toString()); return productOrder; } }
我們把EurekaServer、Product-Service(3個例項)、Order-Service三個專案啟動起來,eureka控制檯,如下圖:
通過呼叫order-service的save介面:
分析:
隨著訂單介面的呼叫,我們可以看到ProductName的商品服務例項的介面每次都是不一樣的,這裡就是客戶端負載均衡策略的體現。
總結:
預設情況下,RestTemplate客戶端負債均衡採用的是輪巡策略進行客戶端服務呼叫。我們可以通過配置修改負載均衡策略。如下:
該策略採用隨機呼叫策略,更多的策略可參考com.netflix.loadbalancer下的原始碼或者看文件查詢。