1. 程式人生 > >java架構之路-(微服務專題)nacos叢集精講實戰

java架構之路-(微服務專題)nacos叢集精講實戰

上次回顧:

  上次部落格,我們主要說了微服務的發展歷程和nacos叢集單機的搭建,單機需要-m standalone啟動,叢集建議使用nginx做一下反向代理,自行保證mysql和ngxin的高可用。

本次定位:

  一、nacos的內部概念

  二、nacos的基本使用

  三、為下次ribbon元件做準備

nacos的內部概念

  上次我們搭建好了nacos叢集,這次我們就在那個叢集基礎上來繼續說,上次我們只說到了服務如何註冊到我們的nacos,但是呼叫還沒說,這次我們來說說各種呼叫吧(呼叫的負載均衡演算法在ribbon去說)。

  ①.呼叫,我們先來一個最簡單的呼叫,使用者系統去呼叫訂單系統,查詢訂單。

   建立兩個springboot專案,加入註冊中心配置。配置上次部落格說過了,這裡就不再贅述了,在訂單服務內寫一個方法。

@RestController
public class OrderController {

    @GetMapping("/getOrderData")
    public String getOrderData(){
        return "獲得訂單服務的資料";
    }


    @GetMapping("/getOrderData-B")
    public String getOrderDataB(){
        return "獲得訂單服務的資料B";
    }
}

  我就簡單寫一個了,能獲取到下面的字串也說明呼叫時可以的。

  在使用者服務中,編寫config配置。

@Configuration
public class ClientConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

  開始呼叫啦

@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/getOrder")
    public String getOrderData(){
        List<ServiceInstance> orderInfo = discoveryClient.getInstances("nacos-order");
        if(null == orderInfo || orderInfo.isEmpty()) {
            return "使用者微服務沒有對應的例項可用";
        }
      
        String targetUri = orderInfo.get(0).getUri().toString();

        String forObject = restTemplate.getForObject(targetUri + "/getOrderData", String.class);
        System.out.println("forObject = " + forObject);

        return forObject;
    }
}

  就這樣,最簡單的呼叫也就可以實現了。(沒有任何負載均衡演算法,我直接get(0)了)。

  ②.namespace

  這裡我們來看看什麼是namespace,如果我們開發,測試環境共用一個nacos,必定我們的介面地址也是不同,而且你在開發過程中,也是不建議隨意配置測試環境的,這時我們就應該用namespace來隔離我們的空間。

  開啟我們的nacos的頁面,點選名稱空間,新建,輸入資訊即可。

   我們再來看一下程式碼實現,如何實現隔離的。

  首先在配置檔案中新增namespace配置。namespace:名稱空間ID

spring:
  application:
    name: nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
server:
  port: 8888

   訂單服務的配置為開發環境,使用者服務配置為測試環境的,我們來執行一下程式碼,理論上應該呼叫不通的,我們來看一下結果。

  現實如此無法呼叫,也就做到了我們的隔離環境。如果不寫namespace,預設是public名稱空間。

  ③.group

  group分組,也是用來隔離的,打個比方啊,加入我們的使用者服務,訂單服務,倉儲服務和物流服務四個服務,訂單服務中有一個介面叫getData,倉儲服務中也有一個介面叫getData,我們的使用者服務只想呼叫到我們的訂單服務的getData,不想呼叫到倉儲服務的getData,這時我們可以用group分組來隔離。

   我們來看一下配置吧。只需要加入group:分組名稱即可,nacos客戶端不需要任何設定,這裡需要注意的是你的父類專案依賴,2.1.0.RELEASE版本是沒有group的,也無法設定group(反正我沒找到什麼好辦法)。需要改配置為2.1.1.RELEASE

<!--spring cloud alibaba依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
spring:
  application:
    name: nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
        group: pay
server:
  port: 8888

  ④.還有一個概念是service服務叢集,什麼意思呢?先上個圖。

   就是什麼呢,我們現在有兩組叢集,一個是北京的訂單服務叢集,一個是北京的使用者服務叢集,還有一個上海的訂單服務叢集,我們希望北京的使用者叢集,優先去呼叫北京的訂單系統,上海的優先呼叫上海的叢集服務。並不希望我們跨地區遠端呼叫(如果組內實在沒有服務了,也可以呼叫,但是優先考慮同一叢集的)。配置檔案如下所示

spring:
  application:
    name: nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
        group: pay
        cluster-name: BJ-cluster
server:
  port: 8888

  ⑤.再就是版本了,也是我知道的最後一個了,比如我們要進行灰度釋出了,我們有100臺服務叢集,但是這次新功能很重要,不能一次性全部更新,我們選擇灰度釋出,我們選出5臺服務作為新版釋出的,我們定義為V2,內部介面時不相容的,所以我們只能要5臺新使用者服務去呼叫5臺訂單服務,原有的95臺使用者服務還是繼續呼叫那95臺訂單服務,我們定義為V1。

  我們來看一下程式碼配置

spring:
  application:
    name: nacos-order
  cloud:
    nacos:

      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
        group: namespace-one
        cluster-name: BJ-cluster
        metadata:
          version: v1
server:
  port: 8888

  劇透一下,nacos是用map來進行隔離的,大致結構式Map<namespace,Map<group::serviceName,Service>>,也是我們為什麼cluster-name和版本為什麼做不到完全隔離,後面的原始碼部落格會說詳細說這個問題的。

總結:

  這次我們主要說了nacos的使用,原理?原理還沒說,等到我們的原始碼帶著說一下吧,不難,就是一個心跳的問題。nacos要知道namespace、group、cluster-name、版本主要是用來做什麼的,什麼時候我們該選擇什麼。下次我們來說一下Ribbon,也就是我們服務直接呼叫的一個外掛。

 

最進弄了一個公眾號,小菜技術,歡迎大家的加入