SpringCloud之服務調用(Ribbon)
阿新 • • 發佈:2018-11-22
find random net text ram auth ade 文檔 pub 業務場景
訂單服務調用商品服務集群,進行偽下單功能開發,使用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下的源碼或者看文檔查詢。
SpringCloud之服務調用(Ribbon)