Nacos入門學習&實踐

CodeTiger發表於2021-07-18

文中涉及到了一些模組程式碼沒有給出,我一併上傳到github了,可以整個專案clone下來進行除錯。

地址:https://github.com/stronglxp/springcloud-test

在這裡插入圖片描述

1、SpringCloud Alibaba介紹

1.1 為什麼會出現SpringCloud Alibaba

Spring Cloud Netflix專案進入維護模式。https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now

將模組置於維護模式,意味著Spring Cloud團隊將不會再向模組新增新功能。他們將修復block級別的 bug 以及安全問題,他們也會考慮並審查社群的小型pull request。

1.2 SpringCloud Alibaba是什麼

文件:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。此專案包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。

依託 Spring Cloud Alibaba,您只需要新增一些註解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,通過阿里中介軟體來迅速搭建分散式應用系統。

誕生:2018.10.31,Spring Cloud Alibaba 正式入駐了Spring Cloud官方孵化器,並在Maven 中央庫釋出了第一個版本。

1.3 SpringCloud Alibaba能幹嘛

  • 服務限流降級:預設支援 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降級功能的接入,可以在執行時通過控制檯實時修改限流降級規則,還支援檢視限流降級 Metrics 監控。
  • 服務註冊與發現:適配 Spring Cloud 服務註冊與發現標準,預設整合了 Ribbon 的支援。
  • 分散式配置管理:支援分散式系統中的外部化配置,配置更改時自動重新整理。
  • 訊息驅動能力:基於 Spring Cloud Stream 為微服務應用構建訊息驅動能力。
  • 分散式事務:使用 @GlobalTransactional 註解, 高效並且對業務零侵入地解決分散式事務問題。
  • 阿里雲物件儲存:阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。支援在任何應用、任何時間、任何地點儲存和訪問任意型別的資料。
  • 分散式任務排程:提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。同時提供分散式的任務執行模型,如網格任務。網格任務支援海量子任務均勻分配到所有 Worker(schedulerx-client)上執行。
  • 阿里雲簡訊服務:覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。

1.4 如何使用

如果需要使用已釋出的版本,在 dependencyManagement 中新增如下配置。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然後在 dependencies 中新增自己所需使用的依賴即可使用。

1.5 元件

Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。

RocketMQ:一款開源的分散式訊息系統,基於高可用分散式叢集技術,提供低延時的、高可靠的訊息釋出與訂閱服務。

Dubbo:Apache Dubbo™ 是一款高效能 Java RPC 框架。

Seata:阿里巴巴開源產品,一個易於使用的高效能微服務分散式事務解決方案。

Alibaba Cloud OSS: 阿里雲物件儲存服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。您可以在任何應用、任何時間、任何地點儲存和訪問任意型別的資料。

Alibaba Cloud SchedulerX: 阿里中介軟體團隊開發的一款分散式任務排程產品,提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。

Alibaba Cloud SMS: 覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。

1.6 學習資料

2、nacos介紹及下載安裝

2.1 nacos介紹

Nacos(Dynamic Naming and Configuration Service),一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。

在這裡插入圖片描述
通過上面的SpringCloud元件圖可知,nacos這個玩意在服務註冊和服務配置、服務匯流排都有應用,直接把Eureka、Config和Bus給替換了,一箭三雕。

總結一下nacos的作用:註冊中心+配置中心的組合 -> Nacos = Eureka+Config+Bus

2.2 各種註冊中心比較在這裡插入圖片描述

CAP定理:https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86

在這裡插入圖片描述
Nacos服務發現例項模型

在這裡插入圖片描述
Nacos支援AP和CP模式的切換

C是所有節點在同一時間看到的資料是一致的;而A的定義是所有的請求都會收到響應。

何時選擇使用何種模式?

—般來說,如果不需要儲存服務級別的資訊且服務例項是通過nacos-client註冊,並能夠保持心跳上報,那麼就可以選擇AP模式。當前主流的服務如Spring cloud和Dubbo服務,都適用於AP模式,AP模式為了服務的可能性而減弱了一致性,因此AP模式下只支援註冊臨時例項。

如果需要在服務級別編輯或者儲存配置資訊,那麼CP是必須,K8S服務和DNS服務則適用於CP模式。CP模式下則支援註冊持久化例項,此時則是以Raft協議為叢集執行模式,該模式下注冊例項之前必須先註冊服務,如果服務不存在,則會返回錯誤。

切換命令:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP

2.3 學習文件

2.4 nacos伺服器下載安裝

下載前確保有jdk環境和maven環境

選擇合適的版本,點選下載

在這裡插入圖片描述
下載完成後解壓,然後以單機模式啟動bin/startup.cmd

startup.cmd -m standalone

在這裡插入圖片描述
在這裡插入圖片描述

3、nacos的服務註冊功能

3.1 建立服務提供者模組

如何建立分散式專案可參考:SpringCloud入門及建立分散式專案一文。

我們新建module:cloud-nacos-provider

在這裡插入圖片描述
pom.xml檔案如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.codeliu</groupId>
        <artifactId>springcloud-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-nacos-provider</artifactId>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web元件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.yml檔案如下

server:
  port: 10001

spring:
  application:
    name: cloud-nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  # 配置本地的Nacos伺服器地址

主啟動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudNacosProviderApplication.class, args);
    }
}

編寫一個控制器

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

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

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: " + port + "\t id" + id;
    }
}

然後啟動該模組,在nacos控制檯就能看到該例項已經註冊到nacos。

在這裡插入圖片描述

3.2 建立服務消費者模組

新建module:cloud-nacos-consumer

pom.xml檔案如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.codeliu</groupId>
        <artifactId>springcloud-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-nacos-consumer</artifactId>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.yml檔案如下

server:
  port: 10083
spring:
  application:
    name: cloud-nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
# 消費者將要去訪問的微服務名稱(註冊成功進nacos的微服務提供者)
service-url:
  nacos-user-service: http://cloud-nacos-provider

主啟動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudNacosConsumerApplication.class, args);
    }
}

配置類

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

控制器

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@Slf4j
public class OrderNacosController {
    @Autowired
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serviceUrl;

    @GetMapping(value = "/consumer/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serviceUrl + "/payment/nacos/" + id, String.class);
    }
}

然後啟動消費者模組,在nacos控制檯可以看到服務列表

在這裡插入圖片描述
我們通過consumer去訪問provider的介面

在這裡插入圖片描述

3.3 Nacos的負載均衡

nacos支援負載均衡是因為spring-cloud-starter-alibaba-nacos-discovery內含netflix-ribbon包。

為了省事,我們可以直接copy一個provider進行啟動

在這裡插入圖片描述
在這裡插入圖片描述
copy完成後,啟動在這裡插入圖片描述
然後通過consumer付訪問provider提高的介面,通過列印可以知道是輪詢訪問10001/10002

4、nacos作為配置中心

4.1 建立配置模組

新建module:cloud-nacos-config

pom.xml檔案如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.codeliu</groupId>
        <artifactId>springcloud-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-nacos-config</artifactId>

    <dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

nacos和springcloud-config一樣,在專案初始化時,要保證先從配置中心進行配置拉取,拉取配置之後,才能保證專案的正常啟動

springboot中配置檔案的載入是存在優先順序順序的,bootstrap優先順序高於application。所以我們拉取配置需要寫在bootstrap.yml檔案中,啟動完bootstrap.yml把相關配置拉取下來後才能正常啟動專案。

配置bootstrap.yml檔案

server:
  port: 3377
spring:
  application:
    name: cloud-nacos-config
  cloud:
    nacos:
      config:
        server-addr: localhost:8848   # nacos本地伺服器地址
        file-extension: yaml   # 配置檔案的格式,預設properties
        group: DEFAULT_GROUP  # 分組,預設DEFAULT_GROUP

配置application.yml檔案

spring:
  profiles:
    active: dev

4.2 在nacos控制檯增加配置資訊

前面我們在bootstrap.yml檔案中配置了spring.application.name,是因為它是構成 Nacos 配置管理 dataId欄位的一部分。

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 預設為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。
  • spring.profiles.active 即為當前環境對應的 profile,詳情可以參考 Spring Boot文件注意:當 spring.profiles.active 為空時,對應的連線符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
  • file-exetension 為配置內容的資料格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支援 propertiesyaml 型別。

最後公式:

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

在這裡插入圖片描述
接下來在nacos控制檯新增配置

在這裡插入圖片描述
在這裡插入圖片描述
儲存後,再修改啟動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class CloudNacosConfigApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(CloudNacosConfigApplication.class, args);
        // 讀取啟用配置檔案中的屬性
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :" +userName+"; age: "+userAge);
    }
}

啟動專案,控制檯列印

在這裡插入圖片描述

4.3 動態更新配置

nacos支援動態更新配置資訊。我們修改啟動類程式碼如下

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.concurrent.TimeUnit;

@SpringBootApplication
public class CloudNacosConfigApplication {
    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(CloudNacosConfigApplication.class, args);
        while (true) {
            // 讀取啟用配置檔案中的屬性
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.err.println("user name :" +userName+"; age: "+userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

while條件永遠為真,每隔一秒就是獲取配置檔案的值。然後我們在nacos控制檯修改對應配置檔案中user.age的值,發現控制檯列印的user.age的值也更新了。

在這裡插入圖片描述
如果要禁用自動更新,在bootstrap.yml中進行配置

spring:
  cloud:
    nacos:
      config:
        refresh:
          enabled: false

4.4 namespace和group和dataId三者的關係

三個東西是為了解多專案多環境的問題。

實際開發中,通常一個系統會準備

  • dev開發環境
  • test測試環境
  • prod生產環境

如何保證指定環境啟動時服務能正確讀取到Nacos上相應環境的配置檔案呢?

一個大型分散式微服務系統會有很多微服務子專案,每個微服務專案又都會有相應的開發環境、測試環境、預發環境、正式環境…那怎麼對這些微服務配置進行管理呢?

nacos預設的namespace是public,預設的group是DEFAULT_GROUP

在這裡插入圖片描述
在這裡插入圖片描述
類似Java裡面的package名和類名,最外層的namespace是可以用於區分部署環境的,Group和DatalD邏輯上區分兩個目標物件。

在這裡插入圖片描述

  • Nacos預設的Namespace是public,Namespace主要用來實現隔離。

    比方說我們現在有三個環境:開發、測試、生產環境,我們就可以建立三個Namespace,不同的Namespace之間是隔離的。

  • Group預設是DEFAULT_GROUP,Group可以把不同的微服務劃分到同一個分組裡面去

  • Service就是微服務:一個Service可以包含多個Cluster (叢集),Nacos預設Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬劃分。
    比方說為了容災,將Service微服務分別部署在了杭州機房和廣州機房,這時就可以給杭州機房的Service微服務起一個叢集名稱(HZ) ,給廣州機房的Service微服務起一個叢集名稱(GZ),還可以儘量讓同一個機房的微服務互相呼叫,以提升效能。

  • 最後是Instance,就是微服務的例項

我們可以在nacos控制檯建立namespace和group。

建立dev和test的namespace

在這裡插入圖片描述
回到配置列表,就能看到我們建立的namespace

在這裡插入圖片描述
分別在test和dev的namespace裡新建配置檔案

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在bootstrap.yml中指定group和namespace就可以獲取不同的配置檔案了。(記住dataId的生成規則)

spring:
  application:
    name: cloud-nacos-config
  cloud:
    nacos:
      config:
        server-addr: localhost:8848   # nacos本地伺服器地址
        file-extension: yaml   # 配置檔案的格式,預設properties
        group: TEST_GROUP  # 分組,預設DEFAULT_GROUP
        # group: DEV_GROUP
        namespace: 155a7fd7-6834-4787-80f7-35f56dd9f8fb
        # namespace: 2f42a525-6d50-45dc-8ed1-d474fff7ce42

5、nacos叢集和持久化

參考文件:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

https://nacos.io/zh-cn/docs/deployment.html

5.1 叢集部署架構圖

因此開源的時候推薦使用者把所有服務列表放到一個vip下面,然後掛到一個域名下面

  • http://ip1:port/openAPI 直連ip模式,機器掛則需要修改ip才可以使用。

  • http://SLB:port/openAPI 掛載SLB模式(內網SLB,不可暴露到公網,以免帶來安全風險),直連SLB即可,下面掛server真實ip,可讀性不好。

  • http://nacos.com:port/openAPI 域名 + SLB模式(內網SLB,不可暴露到公網,以免帶來安全風險),可讀性好,而且換ip方便,推薦模式

在這裡插入圖片描述
一般在實際部署時,架構圖如下

在這裡插入圖片描述
預設Nacos使用嵌入式資料庫實現資料的儲存。所以,如果啟動多個預設配置下的Nacos節點,資料儲存是存在一致性問題的。為了解決這個問題,Nacos採用了集中式儲存的方式來支援叢集化部署,目前只支援MySQL的儲存

在0.7版本之前,在單機模式時nacos使用嵌入式資料庫實現資料的儲存,不方便觀察資料儲存的基本情況。0.7版本增加了支援mysql資料來源能力,具體的操作步驟:

(1)安裝資料庫,版本要求:5.6.5+

(2)初始化mysql資料庫,資料庫初始化檔案:nacos-mysql.sql

(3)修改conf/application.properties檔案,增加支援mysql資料來源配置(目前只支援mysql),新增mysql資料來源的url、使用者名稱和密碼。

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

再以單機模式啟動nacos,nacos所有寫嵌入式資料庫的資料都寫到了mysql。

5.2 切換持久化配置

根據nacos的原始碼,Nacos預設自帶的是嵌入式資料庫derby

在這裡插入圖片描述
所以每個nacos的資料都是存放在內建的資料庫裡,如果要做叢集部署,肯定會出現資料一致性問題的。根據官方文件,我們可以把資料來源切換成MySQL,這樣就能做到資料一致性。

(1)安裝資料庫,版本要求:5.6.5+

(2)初始化mysql資料庫nacos_config,資料庫初始化檔案:nacos/conf/nacos-mysql.sql

(3)修改nacos/conf/application.properties檔案,增加支援mysql資料來源配置(目前只支援mysql),新增mysql資料來源的url、使用者名稱和密碼。

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=1311664842

儲存後重新啟動,你在nacos控制檯進行資料操作都會記錄在本地的MySQL資料庫了。

5.3 叢集搭建

5.3.1 基本環境準備

根據官網

請確保是在環境中安裝使用:

  1. 64 bit OS Linux/Unix/Mac,推薦使用Linux系統。
  2. 64 bit JDK 1.8+;下載.配置
  3. Maven 3.2.x+;下載.配置
  4. 3個或3個以上Nacos節點才能構成叢集。

環境準備:centos7系統、64 bit JDK 1.8+、Maven 3.2.x+、1個Nginx+3個nacos註冊中心+1個mysql

我是用虛擬機器安裝的centos7,其他的就不說了,都可以百度到。安裝MySQL5.7的教程

下載Nacos的Linux版本:https://github.com/alibaba/nacos/releases/tag/2.0.2

在這裡插入圖片描述
下載完成後放到centos中解壓。

5.3.2 持久化配置

匯入資料庫檔案

# 登入MySQL新建資料庫
create database nacos_config;
# 匯入sql檔案
mysql -uroot -p1311664842 nacos_config < /usr/local/nacos/nacos/conf/nacos-mysql.sql

修改application.properties檔案,在檔案末尾加上

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
db.user=root
db.password=1311664842

注意:官網文件沒有加上&serverTimezone=UTC,建議在後面加上,不然有的MySQL版本可能啟動會報錯。

5.3.3 nacos叢集配置

(1)配置cluster.conf

先複製一個出來在這裡插入圖片描述
配置三個不同的埠,注意這裡不能寫出127.0.0.1在這裡插入圖片描述
(2)修改startup.sh,通過埠啟動不同的nacos

複製一個備份
在這裡插入圖片描述
修改startup.sh
在這裡插入圖片描述
在這裡插入圖片描述
後面啟動nacos的話,就使用startup.sh -P 埠號的方式。

(3)配置nginx負載均衡

upstream cluster {
	server 127.0.0.1:3333;
	server 127.0.0.1:4444;
	server 127.0.0.1:5555;
}

proxy_pass  http://cluster;

在這裡插入圖片描述
(4)啟動相關的服務

# 啟動三個nacos服務
./startup.sh -P 3333
./startup.sh -P 4444
./startup.sh -P 5555
# 檢視nacos是否正常啟動
ps -ef | grep nacos | grep -v grep | wc -l
# 指定配置檔案啟動nginx服務
./nginx -c /usr/local/nginx/conf/nginx.conf
# 檢視nginx是否正常啟動
ps -ef | grep nginx

在這裡插入圖片描述
(5)測試

測試之前需要關閉防火牆或者開啟1111埠,不然無法訪問。我這裡是選擇關閉防火牆,因為是在虛擬機器上,隨便搞

# 檢視防火牆狀態
firewall-cmd --state
# 停止防火牆
systemctl stop firewalld.service

之後訪問http://192.168.73.128:1111/nacos,會發現可以開啟nacos的登入頁面,說明nginx進行了請求轉發

在這裡插入圖片描述
登入後我們可以新建一個配置
在這裡插入圖片描述
然後我們在虛擬機器上檢視資料,發現資料已經儲存進了MySQL資料庫。
在這裡插入圖片描述
(6)本地的微服務模組註冊進nacos叢集

之前我們有一個cloud-nacos-provider模組,我們可以嘗試把它註冊到虛擬機器的nacos叢集
在這裡插入圖片描述
修改application.yml檔案

server:
  port: 10001

spring:
  application:
    name: cloud-nacos-provider
  cloud:
    nacos:
      discovery:
        # server-addr: localhost:8848
        server-addr: 192.168.73.128:1111

接著啟動該模組,然後檢視虛擬機器的nacos控制檯,可以發現服務成功註冊
在這裡插入圖片描述

5.3.4 總結

在這裡插入圖片描述

相關文章