【微服務】- SpringCloudAlibaba的Nacos


1.簡介

為什么叫Nacos

前四個字母分別為Naming和Configuration的前兩個字母,最后的s為Service.

是什么

Nacos= Eureka +Config + Bus

功能

替代Eureka做服務注冊中心
替代Config做服務配置中心

官網

https://nacos.io/zh-cn/docs/what-is-nacos.html
下載地址:https://github.com/alibaba/nacos/releases

注冊中心對比

在這里插入圖片描述
據說Nacolp在阿里巴巴內部有超過10萬的實例運行,已經過了類似雙十一等各種大型流量的考驗

安裝及運行

在這里插入圖片描述

2.nacos作為服務注冊中心

和eureka和zookeeper類似如果要使用nacos注冊中心只需要在yml配置文件中進行配置即可。

1.nacos作為服務提供者

建立9001項目

  • 建項目
    項目名稱:cloudalibaba-provider-payment9001
  • 寫pom
  • 寫yml
server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 暴露端口,方便監控服務
management:
  endpoints:
    web:
      exposure:
        include: "*"
  • 主啟動
  • 業務類
    controller
@RestController
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;

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

}

簡單的程序只輸出其端口

測試

啟動nacos和83項目,訪問http://localhost:8848/nacos

在這里插入圖片描述
已經注冊入nacos
訪問http://localhost:9001/payment/nacos/3
在這里插入圖片描述
可以正常訪問服務提供者搭建成功。

為了演示nacos的負載均衡功能參照9001,新建9002

2.nacos作為服務消費者替代Eureka

下面開始nacos作為服務中心項目的建立

建項目

若部分代碼沒有給出,請在遠程倉庫https://gitee.com/gyhdx/cloud2020查找

  • 新建項目
    項目名稱:cloudalibaba-consumer-nacos-Order83

  • 寫pom

  • 寫yml

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 不在項目啟動中起作用,僅作為一個公有配置,方便項目中使用
service-url:
  nacos-user-service: http://nacos-payment-provider
  • 主啟動
    NacosConsumerMain83.class類
  • 業務類
    config
package wf.springcloudalibaba.config;

/** * @Description TODO * @Author gyhdx * @Date 2020/4/25 21:46 */
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemple(){
        return new RestTemplate();
    }
}

controller


package wf.springcloudalibaba.controller;

/** * @Description TODO * @Author gyhdx * @Date 2020/4/25 21:48 */
@RestController
@Slf4j
public class NacosController {

    @Resource
    private RestTemplate restTemplate;

	//獲取yml中的相關配置值
    @Value("${service-url.nacos-user-service}")
    private String path;

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

測試

啟動nacos和83項目,訪問http://localhost:8848/nacos

在這里插入圖片描述

訪問http://localhost:83/consumer/payment/nacos/3
第一次訪問在這里插入圖片描述
刷新頁面在這里插入圖片描述
實現了輪詢訪問服務提供者,證明Nacos負載均衡起作用

nacos中的負載均衡

在這里插入圖片描述
可以看到nacos依賴中已經自帶了負載均衡Ribbon。

3.nacos作為配置中心替代Config

nacos的cap

在這里插入圖片描述

在這里插入圖片描述

Nacos支持AP和CP模式的切換

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

何時選擇使用何種模式?

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

如果需要在服務級別編輯或者存儲配置信息,那么CP是必須,K8S服務和DNS服務則適用於CP模式。

CP模式下則支持注冊持久化實例,此時則是以Raft協議為集群運行模式,該模式下注冊實例之前必須先注冊服務,如果服務不存在,則會返回錯誤。

可以通過cmd執行
curl -XPUT ‘$NACOS_ SERVER:8848/nacos/v1/ns/operator/switches?ntry=serverMode&value=CP’
來實現nacos的CP模式切換

1.代碼演示nacos配置中心功能

新建項目

  • 建項目
    項目名稱:cloudalibaba-config-nacos-client3377
  • 寫pom
  • 寫yml
    因為Nacos同springcloud-config一樣,在項目初始化時,要保證先叢配置中心進行配置拉取,
    拉取配置之后,才能保證項目的正常啟動。springboot中配置文件的加載是存在優先級順序的,bootstrap優先級高於application
    bootstrap.yml
    此次先使用這的配置,不然直接使用倉庫中的會出問題
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml
 

application.yml
該yml是為了支持DataId方案的開發

spring:
  profiles:
# active: test
    active: dev
  • 主啟動
  • 業務類
    controller
@RestController
@RefreshScope
public class NacosController {

    @Value("${config.info}")
    String value;

    @GetMapping(value = "/config/nacos/info")
    public String info(){
        return value;
    }
}

注意在controller中@RefreshScope注解必須配置,為了實現動態刷新功能(Nacos的配置中心,配置發生改變,服務能感知到這種變化)

在nacos中添加配置信息

nacos中的匹配規則理論

Nacos中的dataid的組成格式及與SpringBoot配置文件中的匹配規則
在這里插入圖片描述
簡單來說就是
在這里插入圖片描述
故按照我們在項目中yml的配置,改目標Data Id為nacos-config-client-dev.yaml

在nacos中添加配置

在這里插入圖片描述
配置完成下拉,點擊發布即可
在這里插入圖片描述
配置成功后:
在這里插入圖片描述

測試

啟動3377項目,訪問http://localhost:3377/config/nacos/info

在這里插入圖片描述

配置成功。
點擊編輯修改配置
在這里插入圖片描述
刷新http://localhost:3377/config/nacos/info
在這里插入圖片描述
可以看到改變了,這就是上面yml的端口開放實現監控和@RefreshScope共同起作用。

2.Nacos的分類配置

多環境多項目的問題

  • 問題1:
    實際開發中,通常一個系統會准備
    dev開發環境
    test測試環境
    prod生產環境。
    如何保證指定環境啟動時服務能正確讀取到Nacos.上相應環境的配置文件呢?
  • 問題2:
    一個大型分布式微服務系統會有很多微服務子項目,
    每個微服務項目又都會有相應的開發環境、測試環境、預發環境、正式環境…
    那怎么對這些微服務配置進行管理呢?

nacos的圖形化管理界面

  • 配置管理
    在這里插入圖片描述
  • 命名空間
    在這里插入圖片描述

Namespace+ Group+Data ID3者關系?為什么這么設計?

  • 是什么
    類似Java里面的package名和類名
    最外層的namespace是可以用於區分部署環境的,Group和DatalD邏輯 上區分兩個目標對象。
  • 三者關系
    在這里插入圖片描述
    默認情況:
    Namespace=public, Group=DEFAULT GROUP,默認Cluster是DEFAULT

Nacos默認的命名空間是public, Namespace主要用來實現隔離。
比方說我們現在有三個環境:開發、測試、生產環境,我們就可以創建三三個Namespace,不同的Namespace之間是隔離的。

Group默認是DEFAULT_ GROUP, Group可以把不同的微服務划分到同一個分組里面去

Service就是微服務;一個Service可以包含多個Cluster (集群),Nacos默認Cluster是DEFAULT, Cluster是對指定微服務的一個虛擬划分。
比方說為了容災,將Service微服務分別部署在了杭州機房和廣州機房,
這時就可以給杭州機房的Service微服務起一個集群名稱(HZ),
給廣州機房的Service微服務起一個集群名稱 (GZ) ,還可以盡量讓同一個機房的微服務互相調用,以提升性能。

最后是Instance,就是微服務的實例。

3.三種方案加載配置

DataId方案

指定spring.profile.active和配置文件的DatalD來使不同環境下讀取不同的配置

默認空間+默認分組+新建dev和test兩個DatalD

  • 新建dev配置DatalD
    nacos-config-client-dev.yaml
  • 新建test配置DatalD
    nacos-config-client-test.yaml
    在這里插入圖片描述
    我們開始配置的application.yml中為dev,此時修改為test
    在這里插入圖片描述
    訪問http://localhost:3377/config/nacos/info
    在這里插入圖片描述
    可以看到,該方案起作用了。

Group方案

通過group實現環境區分
在這里插入圖片描述
在新建時直接修改Group即可
在這里插入圖片描述
想讓項目成功訪問,需要在bootstrap.yml中修改一下配置
在這里插入圖片描述
重啟項目,成功訪問http://localhost:3377/config/nacos/info
在這里插入圖片描述
注意此處瀏覽器顯示的內容為nacos中配置的
在這里插入圖片描述
是通過controller獲取
在這里插入圖片描述
具體規則
在這里插入圖片描述

namespace方案

在這里插入圖片描述
可以自定義命名空間的名稱、描述和ID,新建dev(開發)、test(測試)兩個命名空間。
回到配置列表查看
在這里插入圖片描述

在dev命名空間新建配置

在這里插入圖片描述
然后,對項目的bootstrap.yml文件進行修改
在這里插入圖片描述
在這里插入圖片描述

此處我的命名空間為dev,group為DEV_GROUP,active環境為dev,說明訪問的是
在這里插入圖片描述
重啟項目,成功訪問http://localhost:3377/config/nacos/info
在這里插入圖片描述
namespace方案使用成功。

3.nacos集群架構說明

1.集群模式部署

這個快速開始手冊是幫忙您快速在你的電腦上,下載安裝並使用Nacos,部署生產使用的集群模式。

集群部署架構圖

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

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

http://VIP:port/openAPI 掛載VIP模式,直連vip即可,下面掛server真實ip,可讀性不好。

http://nacos.com:port/openAPI 域名 + VIP模式,可讀性好,而且換ip方便,推薦模式
在這里插入圖片描述
注意:VIP=virtue ip(虛擬ip,用來在集群環境映射Nacos的真實ip)
在這里插入圖片描述
在這里插入圖片描述
實現上述架構的一種方案
在這里插入圖片描述

Nacos支持三種部署模式

單機模式 - 用於測試和單機試用。
集群模式 - 用於生產環境,確保高可用。
多集群模式 - 用於多數據中心場景。

2.nacos持久化

因為nacos具備注冊中心的功能,以及支持cp故nacos需要數據的持久化。

默認Nacos使用嵌入式數據庫實現數據的存儲。所以,如果啟動多個默認配置下的Nacos節點,數據存儲是存在一致性問題的。
為了解決這個問題,Nacos采用了集中式存儲的方式來支持集群化部署,目前只支持MySQL的存儲。

Nacos默認自帶的是嵌入式數據庫derby

實現derby數據庫到mysql數據庫的切換

官網https://nacos.io/zh-cn/docs/deployment.html
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM