1. 程式人生 > >SpringCloud之服務呼叫(Ribbon)

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下的原始碼或者看文件查詢。