11.SpringCloudAlibabaNacos服務註冊和配置中心

长名06發表於2024-11-07

0.前置

在本章節前,還有一小節,是關於SpringCloudAlibaba的簡單介紹,這裡不再記錄相關筆記。直接給出和課程一致的SCAlibaba2022.x的文件地址,GItHub上已經提醒,移到了aliyun的子域名下。

1.Nacos在微服務體系中的定位


和SpringCloud中的Consul相同的。

2.Nacos簡介

2.1 Nacos名字的由來

Nacos:Dynamic Naming and Configuration Service

見面知意,該元件用來,做服務註冊中心和配置中心。

2.2 是什麼

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

一句話:Nacos就是註冊中心 + 配置中心的組合。

Nacos = Eureka + Config + Bus

Nacos = Spring Cloud Consul

2.3 能幹嗎

替代Eureka/Consul做服務註冊中心。

替代(Config/Bus)/Consul做服務配置中心和滿足動態重新整理廣播通知。

2.4 下載

https://nacos.io/

2.5 各種註冊中心比較

服務註冊發現元件 CAP模型 控制檯管理 社群活躍度
Eureka AP 支援 低(2.x版本閉源)
Zookeeper CP 不支援
Consul CP 支援
Nacos AP 支援

據說 Nacos 在阿里巴巴內部有超過 10 萬的例項執行,已經過了類似雙十一等各種大型流量的考驗,Nacos預設是AP模式,但也可以調整切換為CP,我們一般用預設AP即可。

3.Nacos下載安裝

3.1 下載

官網,或GitHub下載略。

3.2 執行

解壓下載的安裝包,執行bin目錄下的startup.cmd

startup.cmd -m standalone

3.3 訪問控制檯

http://localhost:8848/nacos

預設密碼是Nacos和Nacos

4.Nacos Discovery服務註冊中心

4.1 概述

https://nacos.io/docs/latest/ecology/use-nacos-with-spring-cloud/

4.2 基於Nacos的服務提供者

4.2.1 新建Moudle

4.2.2 POM
<dependencies>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引入自己定義的api通用包 -->
        <dependency>
            <groupId>com.atguigu.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--SpringBoot通用依賴模組-->
        <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>
        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
            <scope>provided</scope>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
4.2.3 YML
server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址
4.2.4 主啟動
@SpringBootApplication
@EnableDiscoveryClient
public class Main9001 {
    public static void main(String[] args) {
        SpringApplication.run(Main9001.class, args);
    }
}
4.2.5 業務類
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 PayAlibabaController
{
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/pay/nacos/{id}")
    public String getPayInfo(@PathVariable("id") Integer id)
    {
        return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
}
4.2.6 啟動測試

4.3 基於Nacos的服務消費者

4.3.1 建Module

4.3.2 POM
    <dependencies>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--loadbalancer-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!--web + actuator-->
        <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>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
4.3.3 YML

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#消費者將要去訪問的微服務名稱(nacos微服務提供者叫什麼你寫什麼)
service-url:
  nacos-user-service: http://nacos-payment-provider
4.3.4 主啟動
@EnableDiscoveryClient
@SpringBootApplication
public class Main83 {
    public static void main(String[] args) {
        SpringApplication.run(Main83.class, args);
    }
}
4.3.5 業務類
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 RestTemplateConfig
{
    @Bean
    @LoadBalanced //賦予RestTemplate負載均衡的能力
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}
@RestController
public class OrderNacosController
{
    @Resource
    private RestTemplate restTemplate;

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

    @GetMapping("/consumer/pay/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id)
    {
        String result = restTemplate.getForObject(serverURL + "/pay/nacos/" + id, String.class);
        return result+"\t"+"    我是OrderNacosController83呼叫者。。。。。。";
    }
}
4.3.6 啟動測試

4.3.7 演示負載均衡

1.安裝9001新建9002

2.複製服務,虛擬埠對映

點選9001服務,Copy Configuration,之後配置名字,在配置虛擬機器引數-DServer.port=9002,儲存,就會看到服務列表裡,有新的服務,啟動即可。

5.Nacos Config服務配置中心

5.1 概述

Consul8500服務配置動態變更功能可以被Nacos取代。

5.2 官網文件

https://nacos.io/docs/latest/ecology/use-nacos-with-spring-boot/

5.3 Nacos作為配置中心配置步驟

5.3.1 建module

5.3.2 POM

新增

<!--bootstrap-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
5.3.3 YML

YML有兩個bootstrap和application

Nacos同Consul一樣,在專案初始化時,要保證先從配置中心進行配置拉取,拉取配置之後,才能保證專案的正常啟動,為了滿足動態重新整理和全域性廣播通知

springboot中配置檔案的載入是存在優先順序順序的,bootstrap優先順序高於application

bootstrap.yml

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務註冊中心地址
      config:
        server-addr: localhost:8848 #Nacos作為配置中心地址
        file-extension: yaml #指定yaml格式的配置
# nacos端配置檔案DataId的命名規則是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml

application.yml

server:
  port: 3377

spring:
  profiles:
    active: dev # 表示開發環境
      #active: prod # 表示生產環境
    #active: test # 表示測試環境
5.3.4主啟動
@SpringBootApplication
@EnableDiscoveryClient
public class Main3377 {
    public static void main(String[] args) {
        SpringApplication.run(Main3377.class, args);
    }
}
5.3.5 業務類
@RestController
@RefreshScope //在控制器類加入@RefreshScope註解使當前類下的配置支援Nacos的動態重新整理功能。
public class NacosConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

5.4 在Nacos中新增配置資訊

5.4.1 Nacos中的匹配規則

DataId理論: 見https://nacos.io/docs/latest/ecology/use-nacos-with-spring-cloud/


最後公式:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

DataId實操:預設為服務名-環境.副檔名。例一個x.name為aa,x.active為dev,x.file-extension為yaml,則改專案的配置檔案為aa-dev.yaml

建立配置

5.5 測試

http://localhost:3377/config/info

結果:nacos-config-client-dev.yaml breeze version=1

5.6 動態重新整理

修改為version=2 釋出

結果:nacos-config-client-dev.yaml breeze version=2

5.7 歷史配置

Nacos會記錄配置檔案的歷史版本預設保留30天,還有一鍵回滾功能,回滾操作,會觸發配置更新。

6.Nacos資料模型值Namespace-Group-DataId

6.1 問題

問題1:實際開發中,通常一個系統會準備dev開發環境、test測試環境、prod生產環境。如何保證指定環境啟動時服務能正確讀取到Nacos上相應環境的配置檔案呢?

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

6.2 Namespace + Group + DataId三者關係

Nacos資料模型Key由三元組唯一確定,NameSpace預設是空串,公共名稱空間(public),分組預設是DEFAULT_GROUP。

1 是什麼 類似Java裡面的package名和類名,最外層的Namespace是可以用於區分部署環境的,Group和DataID邏輯上區分兩個目標物件
2 預設值 預設情況:Namespace=public,Group=DEFAULT_GROUP。Nacos預設的名稱空間是public,Namespace主要用來實現隔離。比方說我們現在有三個環境:開發、測試、生產環境,我們就可以建立三個Namespace,不同的Namespace之間是隔離的。Group預設是DEFAULT_GROUP,Group可以把不同的微服務劃分到同一個分組裡面去
Service就是微服務 一個Service可以包含一個或者多個Cluster(叢集),Nacos預設Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬劃分。見下一節:服務領域模型-補充說明


6.3 Nacos的圖形化管理介面

6.3.1 名稱空間Namespace


6.3.2 配置管理

6.4 三種方案載入配置

6.4.1 DataId方案

指定spring.profiles.active和配置檔案的DataID來使不同環境下讀取不同的配置

6.4.2 透過Group實現環境區分

預設空間(public) + prod_group + 新建DataID

在bootstrap.yml下新增配置

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務註冊中心地址
      config:
        server-addr: localhost:8848 #Nacos作為配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: prod_group #新增配置

application.yml

server:
  port: 3377

spring:
  profiles:
    active: prod # 表示開發環境

6.5 Namespace方案

透過新建Namespace方案實現名稱空間環境區分

6.5.1 新建名稱空間

6.5.2 新建配置

選擇名稱空間後,在新增配置。

6.5.3 在配置中,新增一條namespace

bootstrap.yml

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務註冊中心地址
      config:
        server-addr: localhost:8848 #Nacos作為配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: prod_group #新增配置
        namespace: private #新增名稱空間
# nacos端配置檔案DataId的命名規則是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml

application.yml

server:
  port: 3377

spring:
  profiles:
    active: prod # 表示開發環境
      #active: prod # 表示生產環境
    #active: test # 表示測試環境

只是為了記錄自己的學習歷程,且本人水平有限,不對之處,請指正。

相關文章