1. 程式人生 > >SpringCloud之服務調用(Ribbon)

SpringCloud之服務調用(Ribbon)

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)