史上最全Spring Cloud Alibaba--Nacos教程(涵蓋負載均衡、配置管理、多環境切換、配置共用/刷新、灰度、集群)

来源:https://www.cnblogs.com/jiagooushi/archive/2022/06/06/16348763.html
-Advertisement-
Play Games

能夠實現Nacos安裝 基於Nacos能實現應用負載均衡 能基於Nacos實現配置管理 配置管理 負載均衡 多環境切換 配置共用 配置刷新 灰度發佈 掌握Nacos集群部署 1 Nacos安裝 Nacos是Alibaba微服務生態組件中的重要組件之一,主要用它實現應用的動態服務發現、配置管理、服務管 ...


  • 能夠實現Nacos安裝
  • 基於Nacos能實現應用負載均衡
  • 能基於Nacos實現配置管理
    • 配置管理
    • 負載均衡
    • 多環境切換
    • 配置共用
    • 配置刷新
    • 灰度發佈
  • 掌握Nacos集群部署

1 Nacos安裝

Nacos是Alibaba微服務生態組件中的重要組件之一,主要用它實現應用的動態服務發現、配置管理、服務管理。

https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

1.1 Nacos概要

Nacos是什麼

file

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。

Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。

Nacos 支持幾乎所有主流類型的“服務”的發現、配置和管理:

1:Kubernetes Service
2:gRPC & Dubbo RPC Service
3:Spring Cloud RESTful Service

Nacos特性

服務發現和服務健康監測:

Nacos 支持基於 DNS 和基於 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的Agent TODO註冊 Service 後,服務消費者可以使用DNS TODO 或HTTP&API查找和發現服務。

Nacos 提供對服務的實時的健康檢查,阻止向不健康的主機或服務實例發送請求。Nacos 支持傳輸層 (PING 或 TCP)和應用層 (如 HTTP、MySQL、用戶自定義)的健康檢查。 對於複雜的雲環境和網路拓撲環境中(如 VPC、邊緣網路等)服務的健康檢查,Nacos 提供了 agent 上報模式和服務端主動檢測2種健康檢查模式。Nacos 還提供了統一的健康檢查儀錶盤,幫助您根據健康狀態管理服務的可用性及流量。

動態配置服務

動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。

動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。

配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。

Nacos 提供了一個簡潔易用的UI (控制台樣例 Demo) 幫助您管理所有的服務和應用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀發佈、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,幫助您更安全地在生產環境中管理配置變更和降低配置變更帶來的風險。

動態 DNS 服務

動態 DNS 服務支持權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及數據中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以 DNS 協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。

Nacos 提供了一些簡單的 DNS APIs TODO 幫助您管理服務的關聯功能變數名稱和可用的 IP:PORT 列表.

服務及其元數據管理

Nacos 能讓您從微服務平臺建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命周期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計數據。

Nacos版圖

file

  • 特性大圖:要從功能特性,非功能特性,全面介紹我們要解的問題域的特性訴求
  • 架構大圖:通過清晰架構,讓您快速進入 Nacos 世界
  • 業務大圖:利用當前特性可以支持的業務場景,及其最佳實踐
  • 生態大圖:系統梳理 Nacos 和主流技術生態的關係
  • 優勢大圖:展示 Nacos 核心競爭力
  • 戰略大圖:要從戰略到戰術層面講 Nacos 的巨集觀優勢

Nacos 生態圖

file

Nacos 無縫支持一些主流的開源生態:

1:Spring Cloud
2:Apache Dubbo and Dubbo Mesh
3:Kubernetes and CNCF。

使用 Nacos 簡化服務發現、配置管理、服務治理及管理的解決方案,讓微服務的發現、管理、共用、組合更加容易。

1.2 Nacos架構

參考官方文檔:https://nacos.io/zh-cn/docs/architecture.html

1.3 Nacos安裝

關於Nacos安裝,可以直接參考官網安裝 https://nacos.io/zh-cn/docs/quick-start.html,我們接下來學習基於Docker實現Nacos單機安裝和基於Docker實現Nacos集群安裝。

採用Docker-Compose安裝Nacos要更方便,所以大家可以先學習一下Docker-Compose。

Nacos安裝模式有多種:

單機模式 Derby:
	這種模式是極簡模式,數據沒法持久化存儲,適合開發環境。
	
單機模式 MySQL:(支持MySQL5.7和MySQL8.0,我們這裡學習MySQL5.7安裝模式,因為當前主流還是MySQL5.7)
	這種模式支持數據持久化,數據會存儲到MySQL中,適合生產環境。

集群模式:
	這種模式適合生產環境並且服務節點個數較多,不存在單點故障問題。

克隆項目:

#克隆項目
git clone https://github.com/nacos-group/nacos-docker.git

#進入nacos-docker目錄
cd nacos-docker

#查看文件列表
ce example
ll

example中文件列表如下:

file

Nacos Derby安裝

安裝Nacos生產環境會結合prometheus和grafana實現對Nacos的監控,我們這裡不做它們的監控操作,需要將docker-compose的配置註釋掉,修改example/standalone-derby.yaml,配置如下:

file

進入到example目錄下執行如下命令:

docker-compose -f standalone-derby.yaml up -d

安裝完成後,我們可以直接訪問它的控制台 http://192.168.200.129:8848/nacos,賬號密碼都是nacos,效果如下:

file

關於控制台的使用,我們在後面詳細講解。

Nacos MySQL版安裝

1、我們先停掉之前安裝的服務,並刪掉之前的容器

#停掉容器
docker stop nacos-standalone

#刪掉容器
docker rm nacos-standalone

#或者一步到位
docker-compose -f standalone-derby.yaml down

2、使用example/standalone-mysql-5.7.yaml

version: "2"
services:
  nacos:
    image: nacos/nacos-server:${NACOS_VERSION}
    container_name: nacos-standalone-mysql
    env_file:
      - ../env/nacos-standlone-mysql.env
    volumes:
      - ./standalone-logs/:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9555:9555"
    depends_on:
      - mysql
    restart: on-failure
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:5.7
    env_file:
      - ../env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"

3、在example目錄下使用docker-compose命令啟動

docker-compose -f standalone-mysql-5.7.yaml up -d

資料庫腳本在nacos的nacos\config\src\main\resources\META-INF工程中有對應腳本,也可以通過下麵的網址獲取SQL:

https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META-INF/nacos-db.sql

創建資料庫nacos_config,並執行初始化操作,初始化腳本後,資料庫數據如下:

file

4、新建配置,查看存儲

此時訪問後臺 http://192.168.200.129:8848/nacos ,並創建一個配置信息,如下圖:

file

此時我們可以隨意填寫些配置,如下圖:

file

配置填寫後,數據會添加到資料庫中的config_info表中,如下表:

file

Docker 安裝Nacos

我們也可以直接採用Docker的方式安裝Nacos,這樣安裝不要克隆項目也不需要修改配置文件,會更方便,安裝命令如下:

docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.200.129 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-p 8848:8848 \
--restart=always \
--name nacos nacos/nacos-server

註意:需要提取準備好msyql資料庫

訪問 http://192.168.200.129:8848/nacos 效果如下:

file

2 Nacos功能應用

2.1 Nacos服務註冊與發現

服務發現是微服務架構體系中最關鍵的組件之一。如果嘗試著用手動的方式來給每一個客戶端來配置所有服務提供者的服務列表是一件非常困難的事,而且也不利於 服務的動態擴縮容。Nacos Discovery Starter 可以幫助您將服務自動註冊到 Nacos 服務端並且能夠動態感知和刷新某個服務實例的服務列表。除此之外,Nacos Discovery Starter 也將服務實例自身的一些元數據信息-例如 host,port,健康檢查URL,主頁等-註冊到 Nacos 。

接下來我們學習一下如何使用Nacos作為服務的註冊中心,並實現服務註冊和服務發現。當前項目開發主流技術是SpringBoot,我們就講解基於SpringBoot如何使用Nacos實現服務註冊與發現。

file

如上圖,我們以打車項目為例,當用戶打車成功的時候,會調用hailtaxi-orderhailtaxi-order會下訂單,同時修改司機狀態,修改狀態需要調用hailtaxi-driver,我們把hailtaxi-order服務和hailtaxi-driver服務都註冊到Nacos中,並實現服務調用,如果整個調用都沒有問題,就說明服務註冊發現沒問題。

關於SpringCloud Alibaba和SpringBoot的版本,我們可以通過 https://start.spring.io/actuator/info 查看。

file

SpringBoot我們修改成2.2.10版本,SpringCloud版本改成Hoxton.SR11版本。要使用Nacos需要引入依賴包,並且將Consul依賴移除。

1、註釋掉hailtaxi-apihailtaxi-gateway中的consul依賴包:

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

另外在hailtaxi-orderhailtaxi-pay中也註意要註釋掉consul的相關依賴坐標

2、在hailtaxi-apihailtaxi-gateway中引入如下依賴:

<!--nacos-discovery-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<!--nacos-config-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

3、配置bootstrap.yml

bootstrap.ymlbootstrap.properties)用來在程式引導時執行,應用於更加早期配置信息讀取,如可以使用來配置application.yml中使用到參數等。

application.ymlapplication.properties) 應用程式特有配置信息,可以用來配置後續各個模塊中需使用的公共參數等。

bootstrap.yml 先於 application.yml載入。

項目中如果使用Nacos,需要使用bootstrap.yml,因此我們需要將項目中的application.yml換成bootstrap.yml

hailtaxi-gateway中創建bootstrap.yml配置文件,添加如下配置:

spring:
  application:
    name: hailtaxi-gateway
  cloud:
    nacos:
      discovery:
        # nacos 服務註冊地址
        server-addr: 192.168.200.129:8848
      config:
        server-addr: 192.168.200.129:8848

註釋/刪掉 :application.yml中和consul相關的配置以及spring.application.name的配置,application.yml中剩餘的配置如下:

server:
  port: 8001
spring:
#  application:
#    name: hailtaxi-gateway
  main:
    allow-bean-definition-overriding: true

  cloud:
#    #Consul配置
#    consul:
#      host: 127.0.0.1
#      port: 8500
#      discovery:
#        #註冊到Consul中的服務名字
#        service-name: ${spring.application.name}
#        #註冊的服務的實例 Id,最好不要重覆,這裡參考官網建議的方式 帶隨機數 預設:應用名:port
#        #instance-id: ${spring.application.name}:${vcap.application.instance_id:${spring.application.i nstance_id:${random.value}}}
#        # 自定義實例id為:應用名:ip:port
#        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#        prefer-ip-address: true
#        # 開啟服務註冊
#        register: true
#        # 開啟服務發現
#        enabled: true
#        #2 分鐘之後健康檢查未通過取消註冊
#        health-check-critical-timeout: 2m
#        #consul 健康檢查的輪詢周期  源碼查看debug的時候把時間設置長一點
#        health-check-interval: 7200s
    gateway:
      #路由配置
      routes:
        #唯一標識符
        - id: hailtaxi-driver
          uri: lb://hailtaxi-driver
          #路由斷言
          predicates:
            - Path=/driver/**
            - Cookie=username,itheima
            - Header=token,^(?!\d+$)[\da-zA-Z]+$
            - Method=GET,POST
            #- Token=Authorization
          filters:
            - PayMethod=alipay,業務整合
            - name: RequestRateLimiter #請求數限流 名字不能隨便寫 ,使用預設的facatory
              args:
                key-resolver: "#{@ipKeyResolver}"
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 1
        #唯一標識符
        - id: hailtaxi-order
          uri: lb://hailtaxi-order
          #路由斷言
          predicates:
            - Path=/order/**
        #唯一標識符
        - id: hailtaxi-pay
          uri: lb://hailtaxi-pay
          #路由斷言
          predicates:
            - Path=/pay/**
  redis:
    host: 192.168.200.129
    port: 6379

4、在項目啟動類上添加開啟服務發現的註解

@SpringBootApplication
@EnableDiscoveryClient 
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

此時我們運行hailtaxi-gateway,可以發現在Nacos中已經註冊了相關服務,如下圖:

file

5、按相同方式配置hailtaxi-driverhailtaxi-orderhailtaxi-pay三個項目

hailtaxi-driver中創建bootstrap.yml並配置如下:

spring:
application:
name: hailtaxi-driver
cloud:
nacos:
discovery:
  # nacos 服務註冊地址
  server-addr: 192.168.200.129:8848
config:
  server-addr: 192.168.200.129:8848

並註釋掉/刪掉 application.yml中跟consul相關的配置以及spring.application.name的配置

其他兩個項目按相同方式操作即可!!!

6、啟動各個服務,查看服務列表

註意:啟動前,將hailtaxi-driver中的異常錯誤處理掉!!!

file

7、測試

使用postman測試:

http://localhost:8001/driver/info/1

http://localhost:8001/order

此時服務調用沒有任何問題,說明服務註冊和服務發現正常。

2.2 負載均衡

file

如上圖,如果此時用戶打車成功,會調用訂單服務,訂單服務會修改司機狀態,此時會調用hailtaxi-driver,如果是生產環境,每個節點一定是集群狀態,比如有2個hailtaxi-driver節點,此時如何實現負載均衡?

file

我們可以發現服務註冊到Nacos中,有一個權重屬性,這個權重屬性就是Nacos的負載均衡機制,此時需要用到Nacos的負載均衡策略NacosRule,我們可以在程式中先初始化負載均衡演算法,再到bootstrap.yml中配置權重。

1、初始化負載均衡演算法

hailtaxi-order中初始化負載均衡演算法:

/***
 * Nacos負載均衡演算法
 * @return
 */
@Bean
@Scope(value="prototype")
public IRule loadBalanceRule(){
    return new NacosRule();
}

2、權重配置,因為是基於權重的

為了演示集群效果,我們啟動多個hailtaxi-driver,併在bootstrap.yml中配置權重

spring:
  application:
    name: hailtaxi-driver
  cloud:
    nacos:
      discovery:
        # nacos 服務註冊地址
        server-addr: 192.168.200.129:8848
        weight: 1
      config:
        server-addr: 192.168.200.129:8848

這是預設18082的,對於18085和18086的配置如下

file

file

最終可以在nacos控制台查看服務的權重信息:

file

為了方便查看調用了哪個節點,我們把每個節點的埠號輸出,我們請求打車測試

http://localhost:8001/order ,執行6次,應該會按1:2:3 的比例來調用

註意:如果hailtaxi-order模塊通過openfeign調用超時,可以設置它的超時時間

由於openfeign底層預設使用的是ribbon,故可以採用如下配置:

ribbon:
# 處理請求的超時時間
ReadTimeout: 5000
# 連接建立的超時時長
ConnectTimeout: 5000

如果我們把演算法NacosRule註釋,預設就是和Ribbon集成,和Ribbon預設開啟,可以通過如下配置實現關閉或開啟:

ribbon:
  nacos:
    enabled: true

2.3 配置中心

Nacos 提供用於存儲配置和其他元數據的 key/value 存儲,為分散式系統中的外部化配置提供伺服器端和客戶端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 應用的外部屬性配置。

Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客戶端和伺服器上的概念與 Spring Environment 和 PropertySource 有著一致的抽象,在特殊的 bootstrap 階段,配置被載入到 Spring 環境中。當應用程式通過部署管道從開發到測試再到生產時,您可以管理這些環境之間的配置,並確保應用程式具有遷移時需要運行的所有內容。

2.3.1 配置管理

1、我們可以在Nacos控制台配置項目的配置數據,先打開Nacos控制台,在命名空間中點擊新建命名空間,如下圖:

命名空間可以用於數據隔離,預設在public 命名空間中!!!

file

2、修改hailtaxi-driver中的bootstrap.yml配置文件,指定命名空間

spring:
  application:
    name: hailtaxi-driver
  cloud:
    nacos:
      discovery:
        # nacos 服務註冊地址
        server-addr: 192.168.200.129:8848
        weight: 1
        # 指定命名空間的id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
      config:
        server-addr: 192.168.200.129:8848
        # 指定命名空間的id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
        # 如果將配置信息保存到nacos,指定配置文件擴展名
        file-extension: yaml
        # nacos config dataid name 預設載入 ${spring.application.name}.${file-extension},當然也可指定
        #name: hailtaxi-driver.yaml

file

3、在nacos中添加配置

配置管理>配置列表中添加,如下圖:

file

將hailtaxi-driver原來在application.yml中的配置全部填寫到下麵表單中,然後將application.yml配置文件刪除,或者刪除所有配置,如下圖:

Data ID:預設載入${spring.application.name}.${file-extension}

另外對於web服務的埠server.port一般留在application.yml

file

註意Data ID的配置。

4、啟動測試:

我們啟動hailtaxi-driver服務,預設載入${spring.application.name}.${file-extension:properties} 配置,載入完成後,配置數據會生效,並訪問

http://localhost:18081/driver/info/1 測試,效果如下:

file

5、配置hailtaxi-gatewayhailtaxi-orderhailtaxi-pay等幾個項目

按照相同的方式,將各個項目中application.yml中的配置配置到nacos中,並註釋/刪除掉本地application.yml中的配置(埠的配置一般留在項目中)

最後啟動所有項目,測試走網關的API。

2.3.2 多環境切換

spring-cloud-starter-alibaba-nacos-config 在載入配置的時候,不僅僅載入以 dataid 為 ${spring.application.name}.${file-extension:properties} 為首碼的基礎配置,還載入dataid為 ${spring.application.name}-${profile}.${file-extension:properties} 的基礎配置。在日常開發中如果遇到多套環境下的不同配置,可以通過Spring 提供的 ${spring.profiles.active} 這個配置項來配置。

1、在nacos中創建hailtaxi-driver-dev.yaml作為開發環節的配置,創建hailtaxi-driver-test.yaml作為測試環境的配置文件,創建如下:

hailtaxi-driver-test.yaml

file

hailtaxi-driver-dev.yaml

file

這樣多出來兩份配置信息如下:

file

2、在hailtaxi-driver項目的bootstrap.yml中激活配置,如下:

file

啟動項目,看是否能正常啟動!!!

file

訪問:http://localhost:18081/driver/info/1

file

3、將active換成test,啟動後訪問:http://localhost:18081/driver/info/1

file

2.3.3 共用/擴展 配置

在實際的業務場景中應用和共用配置間的關係可能,Spring Cloud Alibaba Nacos Config 從 0.2.1 版本後,可支持自定義 Data Id 的配置,通過它可以解決配置共用問題。

共用配置:

1、創建一個Data ID 為:datasource.yaml 的配置,用於配置資料庫連接,如下圖:

file

2、在hailtaxi-driver-dev.yaml中將資料庫的配置信息刪除,如下圖:

file

3、在bootstrap.yml中引入共用配置需要使用shared-configs屬性,配置如下:

spring:
  application:
    name: hailtaxi-driver
  profiles:
  	# 激活 dev 配置
    active: dev
  cloud:
    nacos:
      discovery:
        # nacos 服務註冊地址
        server-addr: 192.168.200.129:8848
        weight: 1
        # 指定命名空間的id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
      config:
        server-addr: 192.168.200.129:8848
        # 指定命名空間的id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
        # 如果將配置信息保存到nacos,指定配置文件擴展名
        file-extension: yaml
        # nacos config dataid name 預設載入 ${spring.application.name}.${file-extension},當然也可指定
        #name: hailtaxi-driver.yaml
        # 載入共用配置信息
        shared-configs[0]:
          dataId: datasource.yaml
          refresh: true

file

配置信息的載入由NacosConfigProperties完成

file

file

啟動測試訪問 http://localhost:18081/driver/info/1,此時能訪問資料庫,同時也能獲取hailtaxi-driver-dev.yaml中的配置,效果如下:

file

擴展配置:

nacos除了支持讀取以上所支持的的配置信息外,用戶還可以自定義擴展配置

1、在nacos中 創建一個Data ID 為:custom.yaml 的配置,配置信息如下圖:

app: 
  version: v1.0

file

2、在hailtaxi-driver模塊的bootstrap.yml中載入該配置,使用extension-configs屬性,如下:

spring:
  application:
    name: hailtaxi-driver
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        # nacos 服務註冊地址
        server-addr: 192.168.200.129:8848
        weight: 1
        # 指定命名空間的id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
      config:
        server-addr: 192.168.200.129:8848
        # 指定命名空間的id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
        # 如果將配置信息保存到nacos,指定配置文件擴展名
        file-extension: yaml
        # nacos config dataid name 預設載入 ${spring.application.name}.${file-extension},當然也可指定
        #name: hailtaxi-driver.yaml
        # 載入共用配置信息
        shared-configs[0]:
          dataId: datasource.yaml
          refresh: true
        # 載入擴展配置
        extension-configs:
          - dataId: custom.yaml

3、在應用程式中去讀該配置,在DriverController中添加如下代碼

@Value("${app.version}")
private String version;

@GetMapping("/appinfo")
public String getAppInfo() {
    return version;
}

4、測試訪問:http://localhost:18081/driver/appinfo 查看結果

2.3.4 配置刷新

配置自動刷新對程式來說非常重要,Nacos支持配置自動刷新,並且提供了多種刷新機制。

Environment自動刷新

spring-cloud-starter-alibaba-nacos-config 支持配置的動態更新,Environment能實時更新到最新的配置信息,啟動 Spring Boot 應用測試的代碼如下:

1、在hailtaxi-driver-dev.yaml中添加一個配置項,如下

app: 
  name: itheima

file

2、在hailtaxi-driver的啟動類中添加一段測試代碼:

@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(basePackages = "com.itheima.driver.mapper")
public class DriverApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(DriverApplication.class,args);

        while(true) {
            //當動態配置刷新時,會更新到 Enviroment中,
            String name = applicationContext.getEnvironment().getProperty("app.name");
            String version = applicationContext.getEnvironment().getProperty("app.version");
            System.out.println("app.name="+name+";app.version=" + version);
            try {
                TimeUnit.SECONDS.sleep(5); // 每隔5秒中從Enviroment中獲取一下
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

3、啟動查看控制台輸出,

4、在nacos中修改app.nameapp.version,再次查看控制台輸出

5、預設情況下,shared-configsextension-configs 是不自動刷新的,【其他配置可以】,如果要支持刷新,需要添加refresh屬性,如下

        # 載入共用配置信息
        shared-configs[0]:
          dataId: datasource.yaml
          refresh: true
        # 載入擴展配置
        extension-configs:
          - dataId: custom.yaml
            refresh: true
@Value刷新

程式中如果寫了@Value註解,可以採用@RefreshScope實現刷新,只需要在指定類上添加該註解即可,如下代碼:

@RestController
@RequestMapping(value = "/driver")
@RefreshScope
public class DriverController {

    @Value("${app.version}")
    private String version;
    @Value("${app.name}")
    private String appname;

    @GetMapping("/appinfo")
    public String getAppInfo() {
        return appname + ";"+version;
    }
}

啟動測試: http://localhost:18081/driver/appinfo

修改完配置信息後再次測試,查看是否能動態刷新!

2.3.5 灰度發佈

灰度配置指的是指定部分客戶端IP進行新配置的下發,其餘客戶端配置保持不變,用以驗證新配置對客戶端的影響,保證配置的平穩發佈。灰度配置是生產環境中一個比較重要的功能,對於保證生產環境的穩定性非常重要。在1.1.0中,Nacos支持了以IP為粒度的灰度配置,具體使用步驟如下:

1、將hailtaxi-driver項目打包,上傳到伺服器,並啟動

2、本地也啟動

查看nacos中的服務列表

file

file

3、在nacos中,找到hailtaxi-driver-dev.yaml 中,編輯配置,勾選“Beta發佈”,在文本框里填入要下發配置配置的IP,多個IP用逗號分隔,操作如下:

file

修改配置內容,點擊“發佈Beta”按鈕,即可完成灰度配置的發佈,點擊“發佈Beta”後,“發佈Beta”按鈕變灰,此時可以選擇“停止Beta”或者“發佈”。“停止Beta”表示取消停止灰度發佈,當前灰度發佈配置的IP列表和配置內容都會刪除,頁面回到正常發佈的樣式。“發佈”表示將灰度配置在所有客戶端生效,之前的配置也會被覆蓋,同時頁面回到正常發佈的樣式:

file

4、測試:

訪問:

http://localhost:18081/driver/appinfo

http://192.168.200.129:18081/driver/appinfo

3 Nacos集群

在生產環境Nacos一般都不是單節點存在,如果是單節點,很容易存在單點故障,因此生產環境一般都以集群形式存在。

3.1 集群架構

Nacos集群模式有多種,但其實無論哪種都是將3個Nacos服務進行集群發佈。

集群需要採用數據共用模式進行配置信息共用,也就是要將數據存入到同一個資料庫中,我們對每種集群模式進行說明:

1)直連模式

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

比如我現在有3個Nacos,每次操作數據的時候,都需要使用IP:埠的模式,這種模式效率極低,並且一旦節點故障無法識別,因此官方不推薦這種模式。

2)VIP模式

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

3)功能變數名稱模式

http://nacos.com:port/openAPI 功能變數名稱 + VIP模式,可讀性好,而且換ip方便,因此官方推薦該模式,該模式的結構圖如下:

file

3.2 Nacos集群部署

我們搭建Nacos集群環境,集群環境配置如下:

節點 IP
Nacos1 192.168.211.145 8848
Nacos2 192.168.211.146 8848
Nacos3 192.168.211.147 8848

1)服務下載

https://github.com/alibaba/nacos/releases/下載需要的服務,當前使用的是1.4.1, 我們可以選擇下載1.4.1版本,版本如下:

file

解壓壓縮包後,包結構如下:

file

2)配置資料庫

修改conf/application.properties配置資料庫,配置如下:

file

3)集群配置

修改conf/cluster.conf配置集群:

192.168.211.145:8848
192.168.211.146:8848
192.168.211.147:8848

4)節點同步

將修改好的服務分別上傳到192.168.211.146192.168.211.147服務:

scp -r nacos 192.168.211.146:/usr/local/server/alibaba/
scp -r nacos 192.168.211.147:/usr/local/server/alibaba/

5)啟動每個節點

進入到每個節點nacos/bin目錄下,執行啟動:

sh startup.sh

訪問任何一個單節點,信息如下:

file

註:

學習階段,為了節省資源,可以直接使用nacos-docker中已配置好的集群啟動 yml 進行啟動

3.3 客戶端接入Nacos集群

客戶端接入,不建議寫多個節點的IP:Port,建議以功能變數名稱的方式連接Nacos,因此需要配置Nacos功能變數名稱,在192.168.211.145節點中配置功能變數名稱nacos.hailtaxi.comnginx配置如下:

#負載均衡池配置
upstream hailtaxi-nacos{
    server 192.168.211.145:8848;
    server 192.168.211.146:8848;
    server 192.168.211.147:8848;
}

server {
    listen       80;
    server_name  nacos.hailtaxi.com;

	location / {
		proxy_pass http://hailtaxi-nacos;
	}
}

配置nacos.hailtaxi.com功能變數名稱映射:

#修改hosts文件
vi /etc/hots

#添加如下映射關係
192.168.211.145 hailtaxinacos.com

保存Nginx配置,並啟動Nginx,修改本地C:\Windows\System32\drivers\hosts,添加如下配置:

192.168.211.145 hailtaxinacos.com

訪問http://hailtaxinacos.com/nacos,效果如下:
file

項目中使用:

方式1:

項目中Nacos地址可以把多個地址寫到一起,用逗號隔開,如下代碼:

file

Nacos效果如下:

file

方式2:

通過Nginx訪問即可,配置如下:

	192.168.211.145:80

本文由傳智教育博學谷 - 狂野架構師教研團隊發佈
轉載請註明出處!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Srinath,科學家,軟體架構師。Apache Axis2項目的聯合創始人,Apache Software基金會的成員,WSO2流處理器(wso2.com/analytics)的聯席架構師。 Srinath通過不懈的努力最終總結出了30條架構原則,他主張架構師的角色應該由開發團隊本身去扮演,而不... ...
  • 在《clickhouse專欄》上一篇文章中《資料庫、數據倉庫之間的區別與聯繫》,我們介紹了什麼是資料庫,什麼是數據倉庫,二者的區別聯繫。clickhouse的定位是“數據倉庫”,所以理解了上一篇的內容,其實就能夠知道clickhouse適用於什麼樣的應用場景,不適合什麼樣的應用場景。 下麵本節我們就 ...
  • 庫 是一種代碼的二進位的封裝形式,將.o文件打包封裝就成了庫。庫可以在任何地方使用,但用戶卻不能看見他的具體實現。庫有利於代碼模塊化,只要介面設計得合理,改變庫的內部實現,不會影響到用戶級別的代碼使用。 動態庫 1.封裝動態庫 假設有源代碼sum.c, sub.c gcc sum.c -c -o s ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • Spring Ioc源碼分析系列--實例化Bean的幾種方法 前言 前面的文章Spring Ioc源碼分析系列--Bean實例化過程(二)在講解到bean真正通過那些方式實例化出來的時候,並沒有繼續分析了,而是留到了這裡去分析,主要是因為獲取獲取構造函數,推斷構造函數也是一個比較複雜的操作,就想另起 ...
  • 主線程與守護線程 預設情況下,Java 進程需要等待所有線程都運行結束,才會結束。有一種特殊的線程叫做守護線程,只要其它非守護線程運行結束了,即使守護線程的代碼沒有執行完,也會強制結束。 package Daemon; import lombok.extern.slf4j.Slf4j; @Slf4j ...
  • 1 與其它協程庫使用對比 這個 C 協程庫是雲風(cloudwu) 寫的,其介面風格與 Lua 協程類似,並且都是非對稱 stackful 協程。這個是源代碼中的示例: #include "coroutine.h" #include <stdio.h> struct args { int n; }; ...
  • 在理解裝飾器的概念前,我們首先看一下function和inner function在python中的含義。 function與inner function function:在python中,function就像其他對象一樣,可以當做參數或返回值。 inner function:一個函數A(inne ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...