Nacos入門學(xué)習(xí)&實(shí)踐

文中涉及到了一些模塊代碼沒有給出,我一并上傳到github了,可以整個項(xiàng)目clone下來進(jìn)行調(diào)試。

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

在這里插入圖片描述

1、SpringCloud Alibaba介紹

1.1 為什么會出現(xiàn)SpringCloud Alibaba

Spring Cloud Netflix項(xiàng)目進(jìn)入維護(hù)模式。https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now

將模塊置于維護(hù)模式,意味著Spring Cloud團(tuán)隊(duì)將不會再向模塊添加新功能。他們將修復(fù)block級別的 bug 以及安全問題,他們也會考慮并審查社區(qū)的小型pull request。

1.2 SpringCloud Alibaba是什么

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

Spring Cloud Alibaba 致力于提供微服務(wù)開發(fā)的一站式解決方案。此項(xiàng)目包含開發(fā)分布式應(yīng)用微服務(wù)的必需組件,方便開發(fā)者通過 Spring Cloud 編程模型輕松使用這些組件來開發(fā)分布式應(yīng)用服務(wù)。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以將 Spring Cloud 應(yīng)用接入阿里微服務(wù)解決方案,通過阿里中間件來迅速搭建分布式應(yīng)用系統(tǒng)。

誕生:2018.10.31,Spring Cloud Alibaba 正式入駐了Spring Cloud官方孵化器,并在Maven 中央庫發(fā)布了第一個版本。

1.3 SpringCloud Alibaba能干嘛

  • 服務(wù)限流降級:默認(rèn)支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降級功能的接入,可以在運(yùn)行時通過控制臺實(shí)時修改限流降級規(guī)則,還支持查看限流降級 Metrics 監(jiān)控。
  • 服務(wù)注冊與發(fā)現(xiàn):適配 Spring Cloud 服務(wù)注冊與發(fā)現(xiàn)標(biāo)準(zhǔn),默認(rèn)集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系統(tǒng)中的外部化配置,配置更改時自動刷新。
  • 消息驅(qū)動能力:基于 Spring Cloud Stream 為微服務(wù)應(yīng)用構(gòu)建消息驅(qū)動能力。
  • 分布式事務(wù):使用 @GlobalTransactional 注解, 高效并且對業(yè)務(wù)零侵入地解決分布式事務(wù)問題。
  • 阿里云對象存儲:阿里云提供的海量、安全、低成本、高可靠的云存儲服務(wù)。支持在任何應(yīng)用、任何時間、任何地點(diǎn)存儲和訪問任意類型的數(shù)據(jù)。
  • 分布式任務(wù)調(diào)度:提供秒級、精準(zhǔn)、高可靠、高可用的定時(基于 Cron 表達(dá)式)任務(wù)調(diào)度服務(wù)。同時提供分布式的任務(wù)執(zhí)行模型,如網(wǎng)格任務(wù)。網(wǎng)格任務(wù)支持海量子任務(wù)均勻分配到所有 Worker(schedulerx-client)上執(zhí)行。
  • 阿里云短信服務(wù):覆蓋全球的短信服務(wù),友好、高效、智能的互聯(lián)化通訊能力,幫助企業(yè)迅速搭建客戶觸達(dá)通道。

1.4 如何使用

如果需要使用已發(fā)布的版本,在 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:把流量作為切入點(diǎn),從流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)等多個維度保護(hù)服務(wù)的穩(wěn)定性。

Nacos:一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。

RocketMQ:一款開源的分布式消息系統(tǒng),基于高可用分布式集群技術(shù),提供低延時的、高可靠的消息發(fā)布與訂閱服務(wù)。

Dubbo:Apache Dubbo? 是一款高性能 Java RPC 框架。

Seata:阿里巴巴開源產(chǎn)品,一個易于使用的高性能微服務(wù)分布式事務(wù)解決方案。

Alibaba Cloud OSS: 阿里云對象存儲服務(wù)(Object Storage Service,簡稱 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存儲服務(wù)。您可以在任何應(yīng)用、任何時間、任何地點(diǎn)存儲和訪問任意類型的數(shù)據(jù)。

Alibaba Cloud SchedulerX: 阿里中間件團(tuán)隊(duì)開發(fā)的一款分布式任務(wù)調(diào)度產(chǎn)品,提供秒級、精準(zhǔn)、高可靠、高可用的定時(基于 Cron 表達(dá)式)任務(wù)調(diào)度服務(wù)。

Alibaba Cloud SMS: 覆蓋全球的短信服務(wù),友好、高效、智能的互聯(lián)化通訊能力,幫助企業(yè)迅速搭建客戶觸達(dá)通道。

1.6 學(xué)習(xí)資料

2、nacos介紹及下載安裝

2.1 nacos介紹

Nacos(Dynamic Naming and Configuration Service),一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。

在這里插入圖片描述

通過上面的SpringCloud組件圖可知,nacos這個玩意在服務(wù)注冊和服務(wù)配置、服務(wù)總線都有應(yīng)用,直接把Eureka、Config和Bus給替換了,一箭三雕。

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

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

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

在這里插入圖片描述

Nacos服務(wù)發(fā)現(xiàn)實(shí)例模型

在這里插入圖片描述

Nacos支持AP和CP模式的切換

C是所有節(jié)點(diǎn)在同一時間看到的數(shù)據(jù)是一致的;而A的定義是所有的請求都會收到響應(yīng)。

何時選擇使用何種模式?

—般來說,如果不需要存儲服務(wù)級別的信息且服務(wù)實(shí)例是通過nacos-client注冊,并能夠保持心跳上報,那么就可以選擇AP模式。當(dāng)前主流的服務(wù)如Spring cloud和Dubbo服務(wù),都適用于AP模式,AP模式為了服務(wù)的可能性而減弱了一致性,因此AP模式下只支持注冊臨時實(shí)例。

如果需要在服務(wù)級別編輯或者存儲配置信息,那么CP是必須,K8S服務(wù)和DNS服務(wù)則適用于CP模式。CP模式下則支持注冊持久化實(shí)例,此時則是以Raft協(xié)議為集群運(yùn)行模式,該模式下注冊實(shí)例之前必須先注冊服務(wù),如果服務(wù)不存在,則會返回錯誤。

切換命令:

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

2.3 學(xué)習(xí)文檔

2.4 nacos服務(wù)器下載安裝

下載前確保有jdk環(huán)境和maven環(huán)境

選擇合適的版本,點(diǎn)擊下載

在這里插入圖片描述

下載完成后解壓,然后以單機(jī)模式啟動bin/startup.cmd

startup.cmd -m standalone
在這里插入圖片描述

在這里插入圖片描述

3、nacos的服務(wù)注冊功能

3.1 創(chuàng)建服務(wù)提供者模塊

如何創(chuàng)建分布式項(xiàng)目可參考:SpringCloud入門及創(chuàng)建分布式項(xiàng)目一文。

我們新建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服務(wù)器地址

主啟動類

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控制臺就能看到該實(shí)例已經(jīng)注冊到nacos。

在這里插入圖片描述

3.2 創(chuàng)建服務(wù)消費(fèi)者模塊

新建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
# 消費(fèi)者將要去訪問的微服務(wù)名稱(注冊成功進(jìn)nacos的微服務(wù)提供者)
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);
    }
}

然后啟動消費(fèi)者模塊,在nacos控制臺可以看到服務(wù)列表

在這里插入圖片描述

我們通過consumer去訪問provider的接口

在這里插入圖片描述

3.3 Nacos的負(fù)載均衡

nacos支持負(fù)載均衡是因?yàn)閟pring-cloud-starter-alibaba-nacos-discovery內(nèi)含netflix-ribbon包。

為了省事,我們可以直接copy一個provider進(jìn)行啟動

在這里插入圖片描述

在這里插入圖片描述

copy完成后,啟動
在這里插入圖片描述

然后通過consumer付訪問provider提高的接口,通過打印可以知道是輪詢訪問10001/10002

4、nacos作為配置中心

4.1 創(chuàng)建配置模塊

新建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一樣,在項(xiàng)目初始化時,要保證先從配置中心進(jìn)行配置拉取,拉取配置之后,才能保證項(xiàng)目的正常啟動。

springboot中配置文件的加載是存在優(yōu)先級順序的,bootstrap優(yōu)先級高于application。所以我們拉取配置需要寫在bootstrap.yml文件中,啟動完bootstrap.yml把相關(guān)配置拉取下來后才能正常啟動項(xiàng)目。

配置bootstrap.yml文件

server:
  port: 3377
spring:
  application:
    name: cloud-nacos-config
  cloud:
    nacos:
      config:
        server-addr: localhost:8848   # nacos本地服務(wù)器地址
        file-extension: yaml   # 配置文件的格式,默認(rèn)properties
        group: DEFAULT_GROUP  # 分組,默認(rèn)DEFAULT_GROUP

配置application.yml文件

spring:
  profiles:
    active: dev

4.2 在nacos控制臺增加配置信息

前面我們在bootstrap.yml文件中配置了spring.application.name,是因?yàn)樗菢?gòu)成 Nacos 配置管理 dataId字段的一部分。

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

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默認(rèn)為 spring.application.name 的值,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置。
  • spring.profiles.active 即為當(dāng)前環(huán)境對應(yīng)的 profile,詳情可以參考 Spring Boot文檔。 注意:當(dāng) spring.profiles.active 為空時,對應(yīng)的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
  • file-exetension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項(xiàng) 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);
    }
}

啟動項(xiàng)目,控制臺打印

在這里插入圖片描述

4.3 動態(tài)更新配置

nacos支持動態(tài)更新配置信息。我們修改啟動類代碼如下

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條件永遠(yuǎn)為真,每隔一秒就是獲取配置文件的值。然后我們在nacos控制臺修改對應(yīng)配置文件中user.age的值,發(fā)現(xiàn)控制臺打印的user.age的值也更新了。

在這里插入圖片描述

如果要禁用自動更新,在bootstrap.yml中進(jìn)行配置

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

4.4 namespace和group和dataId三者的關(guān)系

三個東西是為了解多項(xiàng)目多環(huán)境的問題。

實(shí)際開發(fā)中,通常一個系統(tǒng)會準(zhǔn)備

  • dev開發(fā)環(huán)境
  • test測試環(huán)境
  • prod生產(chǎn)環(huán)境

如何保證指定環(huán)境啟動時服務(wù)能正確讀取到Nacos上相應(yīng)環(huán)境的配置文件呢?

一個大型分布式微服務(wù)系統(tǒng)會有很多微服務(wù)子項(xiàng)目,每個微服務(wù)項(xiàng)目又都會有相應(yīng)的開發(fā)環(huán)境、測試環(huán)境、預(yù)發(fā)環(huán)境、正式環(huán)境…那怎么對這些微服務(wù)配置進(jìn)行管理呢?

nacos默認(rèn)的namespace是public,默認(rèn)的group是DEFAULT_GROUP

在這里插入圖片描述

在這里插入圖片描述

類似Java里面的package名和類名,最外層的namespace是可以用于區(qū)分部署環(huán)境的,Group和DatalD邏輯上區(qū)分兩個目標(biāo)對象。

在這里插入圖片描述
  • Nacos默認(rèn)的Namespace是public,Namespace主要用來實(shí)現(xiàn)隔離。

    比方說我們現(xiàn)在有三個環(huán)境:開發(fā)、測試、生產(chǎn)環(huán)境,我們就可以創(chuàng)建三個Namespace,不同的Namespace之間是隔離的。

  • Group默認(rèn)是DEFAULT_GROUP,Group可以把不同的微服務(wù)劃分到同一個分組里面去

  • Service就是微服務(wù):一個Service可以包含多個Cluster (集群),Nacos默認(rèn)Cluster是DEFAULT,Cluster是對指定微服務(wù)的一個虛擬劃分。
    比方說為了容災(zāi),將Service微服務(wù)分別部署在了杭州機(jī)房和廣州機(jī)房,這時就可以給杭州機(jī)房的Service微服務(wù)起一個集群名稱(HZ) ,給廣州機(jī)房的Service微服務(wù)起一個集群名稱(GZ),還可以盡量讓同一個機(jī)房的微服務(wù)互相調(diào)用,以提升性能。

  • 最后是Instance,就是微服務(wù)的實(shí)例

我們可以在nacos控制臺創(chuàng)建namespace和group。

創(chuàng)建dev和test的namespace

在這里插入圖片描述

回到配置列表,就能看到我們創(chuàng)建的namespace

在這里插入圖片描述

分別在test和dev的namespace里新建配置文件

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在bootstrap.yml中指定group和namespace就可以獲取不同的配置文件了。(記住dataId的生成規(guī)則)

spring:
  application:
    name: cloud-nacos-config
  cloud:
    nacos:
      config:
        server-addr: localhost:8848   # nacos本地服務(wù)器地址
        file-extension: yaml   # 配置文件的格式,默認(rèn)properties
        group: TEST_GROUP  # 分組,默認(rèn)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 集群部署架構(gòu)圖

因此開源的時候推薦用戶把所有服務(wù)列表放到一個vip下面,然后掛到一個域名下面

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

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

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

在這里插入圖片描述

一般在實(shí)際部署時,架構(gòu)圖如下

在這里插入圖片描述

默認(rèn)Nacos使用嵌入式數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的存儲。所以,如果啟動多個默認(rèn)配置下的Nacos節(jié)點(diǎn),數(shù)據(jù)存儲是存在一致性問題的。為了解決這個問題,Nacos采用了集中式存儲的方式來支持集群化部署,目前只支持MySQL的存儲。

在0.7版本之前,在單機(jī)模式時nacos使用嵌入式數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的存儲,不方便觀察數(shù)據(jù)存儲的基本情況。0.7版本增加了支持mysql數(shù)據(jù)源能力,具體的操作步驟:

(1)安裝數(shù)據(jù)庫,版本要求:5.6.5+

(2)初始化mysql數(shù)據(jù)庫,數(shù)據(jù)庫初始化文件:nacos-mysql.sql

(3)修改conf/application.properties文件,增加支持mysql數(shù)據(jù)源配置(目前只支持mysql),添加mysql數(shù)據(jù)源的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

再以單機(jī)模式啟動nacos,nacos所有寫嵌入式數(shù)據(jù)庫的數(shù)據(jù)都寫到了mysql。

5.2 切換持久化配置

根據(jù)nacos的源碼,Nacos默認(rèn)自帶的是嵌入式數(shù)據(jù)庫derby

在這里插入圖片描述

所以每個nacos的數(shù)據(jù)都是存放在內(nèi)置的數(shù)據(jù)庫里,如果要做集群部署,肯定會出現(xiàn)數(shù)據(jù)一致性問題的。根據(jù)官方文檔,我們可以把數(shù)據(jù)源切換成MySQL,這樣就能做到數(shù)據(jù)一致性。

(1)安裝數(shù)據(jù)庫,版本要求:5.6.5+

(2)初始化mysql數(shù)據(jù)庫nacos_config,數(shù)據(jù)庫初始化文件:nacos/conf/nacos-mysql.sql

(3)修改nacos/conf/application.properties文件,增加支持mysql數(shù)據(jù)源配置(目前只支持mysql),添加mysql數(shù)據(jù)源的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控制臺進(jìn)行數(shù)據(jù)操作都會記錄在本地的MySQL數(shù)據(jù)庫了。

5.3 集群搭建

5.3.1 基本環(huán)境準(zhǔn)備

根據(jù)官網(wǎng)

請確保是在環(huán)境中安裝使用:

  1. 64 bit OS Linux/Unix/Mac,推薦使用Linux系統(tǒng)。
  2. 64 bit JDK 1.8+;下載.配置。
  3. Maven 3.2.x+;下載.配置。
  4. 3個或3個以上Nacos節(jié)點(diǎn)才能構(gòu)成集群。

環(huán)境準(zhǔn)備:centos7系統(tǒng)、64 bit JDK 1.8+、Maven 3.2.x+、1個Nginx+3個nacos注冊中心+1個mysql

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

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

在這里插入圖片描述

下載完成后放到centos中解壓。

5.3.2 持久化配置

導(dǎo)入數(shù)據(jù)庫文件

# 登錄MySQL新建數(shù)據(jù)庫
create database nacos_config;
# 導(dǎo)入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

注意:官網(wǎng)文檔沒有加上&serverTimezone=UTC,建議在后面加上,不然有的MySQL版本可能啟動會報錯。

5.3.3 nacos集群配置

(1)配置cluster.conf

先復(fù)制一個出來

在這里插入圖片描述

配置三個不同的端口,注意這里不能寫出127.0.0.1
在這里插入圖片描述

(2)修改startup.sh,通過端口啟動不同的nacos

復(fù)制一個備份

在這里插入圖片描述

修改startup.sh
在這里插入圖片描述

在這里插入圖片描述

后面啟動nacos的話,就使用startup.sh -P 端口號的方式。

(3)配置nginx負(fù)載均衡

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)啟動相關(guān)的服務(wù)

# 啟動三個nacos服務(wù)
./startup.sh -P 3333
./startup.sh -P 4444
./startup.sh -P 5555
# 查看nacos是否正常啟動
ps -ef | grep nacos | grep -v grep | wc -l
# 指定配置文件啟動nginx服務(wù)
./nginx -c /usr/local/nginx/conf/nginx.conf
# 查看nginx是否正常啟動
ps -ef | grep nginx

在這里插入圖片描述

(5)測試

測試之前需要關(guān)閉防火墻或者開啟1111端口,不然無法訪問。我這里是選擇關(guān)閉防火墻,因?yàn)槭窃谔摂M機(jī)上,隨便搞

# 查看防火墻狀態(tài)
firewall-cmd --state
# 停止防火墻
systemctl stop firewalld.service

之后訪問http://192.168.73.128:1111/nacos,會發(fā)現(xiàn)可以打開nacos的登錄頁面,說明nginx進(jìn)行了請求轉(zhuǎn)發(fā)

在這里插入圖片描述

登錄后我們可以新建一個配置
在這里插入圖片描述

然后我們在虛擬機(jī)上查看數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)已經(jīng)保存進(jìn)了MySQL數(shù)據(jù)庫。
在這里插入圖片描述

(6)本地的微服務(wù)模塊注冊進(jìn)nacos集群

之前我們有一個cloud-nacos-provider模塊,我們可以嘗試把它注冊到虛擬機(jī)的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

接著啟動該模塊,然后查看虛擬機(jī)的nacos控制臺,可以發(fā)現(xiàn)服務(wù)成功注冊


在這里插入圖片描述
5.3.4 總結(jié)
在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容