天天看點

SpringCloud之服務調用(Ribbon)

業務場景

訂單服務調用商品服務叢集,進行僞下單功能開發,使用Ribbon實作訂單調用商品服務。

思路:

1.建立訂單服務

2.編寫僞下單接口

a.調用商品服務擷取商品資訊(Ribbon調用服務)

b.根據商品資訊,訂單接口傳回訂單詳情資訊

調用邏輯圖如下:

SpringCloud之服務調用(Ribbon)

實作訂單服務項目

訂單服務項目通過Spring Initializr搭建項目,選擇Web 和 Eureka Discovery。跟前一篇部落格寫的Product-Service是一樣的。我們把Product-Service執行個體端口也擷取到放入到産品資訊中,驗證Ribbon的用戶端負載均衡。

SpringCloud之服務調用(Ribbon)

order-service入口:

SpringCloud之服務調用(Ribbon)

分析:

服用的調用就是通過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控制台,如下圖:

SpringCloud之服務調用(Ribbon)

通過調用order-service的save接口:

SpringCloud之服務調用(Ribbon)
SpringCloud之服務調用(Ribbon)
SpringCloud之服務調用(Ribbon)

随着訂單接口的調用,我們可以看到ProductName的商品服務執行個體的接口每次都是不一樣的,這裡就是用戶端負載均衡政策的展現。

總結:

預設情況下,RestTemplate用戶端負債均衡采用的是輪巡政策進行用戶端服務調用。我們可以通過配置修改負載均衡政策。如下:

SpringCloud之服務調用(Ribbon)

該政策采用随機調用政策,更多的政策可參考com.netflix.loadbalancer下的源碼或者看文檔查詢。

繼續閱讀