天天看點

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

上一篇:詳解Nacos的産生與應用 | 帶你讀《Spring Cloud Alibaba(2019)》之三 下一篇:如何實作用戶端負載均衡? | 帶你讀《Spring Cloud Alibaba(2019)》之五

本文來自于《精通Spring Cloud Alibaba》課程的整理,講師為餘勝軍,

點選檢視視訊内容

本文系志願者整理,供配合學習中心課程使用,不做商業用途。

Nacos整合SpringCloud

建立工程,需要選擇1.8

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四
Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

子產品名稱:然後Finish。

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

Nacos整合SpringCloud,我們需要引入依賴。

Maven依賴資訊

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.0.RELEASE</version>
 </parent>
<dependencies>
    <!--  springboot 整合web元件-->
    <dependency>
       <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.2.2.RELEASE</version>
    </dependency>
</dependencies>           

如何實作服務的注冊?

會員服務(生産者)

服務接口

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

接口完成後,對會員進行注冊。

拿到配置檔案,對項目命名

配置檔案

application.yml檔案

spring:
  cloud:
    nacos:
      discovery:
        ###服務注冊位址
        server-addr: 127.0.0.1:8848
  application:
    name: mayikt-member
server:
  port: 8081           
Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

再進行代碼測試,自動實作對服務進行注冊

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四
Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

詳情頁面:

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

訂單服務(消費者)

按照之前的步驟,建立消費者:

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

建立項目之後,第一步,根據服務名稱從 注冊中心 擷取叢集清單位址。

第二步,根據清單任意選擇一個 實作本地rpc調用rest

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

模拟運作:

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

配置檔案:

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

執行結果:

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

注意:RestTeanmlate它不是SpringCloud寫的,本身Spring支援Http協定調用

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

訂單調用會員服務

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四
Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

此時這個程式是不完善的,我們需要去修改:

服務接口:

@RestController
public class MemberService {
    @Value("${server.port}")
    private String serverPort;

    /**
     * 會員服務提供的接口
     *
     * @param userId
     * @return
     */
    @RequestMapping("/getUser")
    public String getUser(Integer userId) {
        return "每特教育,端口号:" + serverPort;
    }
}           
@RestController
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    private LoadBalancer loadBalancer;

    /**
     * 訂單調用會員服務
     *
     * @return
     */
//    @RequestMapping("/orderToMember")
//    public String orderToMember() {
//        // 從注冊中心上擷取該注冊服務清單
//        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
//        ServiceInstance serviceInstance = serviceInstanceList.get(0);
//        URI rpcMemberUrl = serviceInstance.getUri();
//        // 使用本地rest形式實作rpc調用
//        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
//        return "訂單調用會員擷取結果:" + result;
//    }
    @RequestMapping("/orderToMember")
    public String orderToMember() {
        // 從注冊中心上擷取該注冊服務清單
        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
        ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList);
        URI rpcMemberUrl = serviceInstance.getUri();
        // 使用本地rest形式實作rpc調用
        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
        return "訂單調用會員擷取結果:" + result;
    }
}           
Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

Rpc遠端調用設計到本地負載均衡算法。

1、從注冊中心擷取服務叢集的清單

2、從清單選擇一個

負載均衡算法有哪些

A、一緻性hash計算

B、輪訓、權重

C、随機

我們以輪訓為例,采用政策設計模式

通路次數%叢集size。

負載均衡算法

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四
public interface LoadBalancer {


    /**
     * 根據多個不同的位址 傳回單個調用rpc位址
     *
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}

@Component
public class RotationLoadBalancer implements LoadBalancer {
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) {
        int index = atomicInteger.incrementAndGet() % serviceInstances.size();
        ServiceInstance serviceInstance = serviceInstances.get(index);
        return serviceInstance;
    }
}           

Nacos與其他注冊對比分析

通路之後在 服務清單中發現有兩個叢集。下線原理是在它的集合中移除

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

通過算法實時,實作中心擷取位址。

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四
Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

手寫RPC負載均衡五種算法。

權重需要對資料實作重新排序。

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

一緻性hash:

Nacos如何整合SpringCloud ?| 帶你讀《Spring Cloud Alibaba(2019)》之四

随機數從集合中随機尋找。

故障轉移:利用for循環,集合中取下一個值。

程式設計思維能力:舉一反三