能夠實現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是什麼
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版圖
- 特性大圖:要從功能特性,非功能特性,全面介紹我們要解的問題域的特性訴求
- 架構大圖:通過清晰架構,讓您快速進入 Nacos 世界
- 業務大圖:利用當前特性可以支持的業務場景,及其最佳實踐
- 生態大圖:系統梳理 Nacos 和主流技術生態的關係
- 優勢大圖:展示 Nacos 核心競爭力
- 戰略大圖:要從戰略到戰術層面講 Nacos 的巨集觀優勢
Nacos 生態圖
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
中文件列表如下:
Nacos Derby安裝
安裝Nacos生產環境會結合prometheus和grafana實現對Nacos的監控,我們這裡不做它們的監控操作,需要將docker-compose的配置註釋掉,修改example/standalone-derby.yaml
,配置如下:
進入到example
目錄下執行如下命令:
docker-compose -f standalone-derby.yaml up -d
安裝完成後,我們可以直接訪問它的控制台 http://192.168.200.129:8848/nacos,賬號密碼都是nacos,效果如下:
關於控制台的使用,我們在後面詳細講解。
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
,並執行初始化操作,初始化腳本後,資料庫數據如下:
4、新建配置,查看存儲
此時訪問後臺 http://192.168.200.129:8848/nacos ,並創建一個配置信息,如下圖:
此時我們可以隨意填寫些配置,如下圖:
配置填寫後,數據會添加到資料庫中的config_info
表中,如下表:
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 效果如下:
2 Nacos功能應用
2.1 Nacos服務註冊與發現
服務發現是微服務架構體系中最關鍵的組件之一。如果嘗試著用手動的方式來給每一個客戶端來配置所有服務提供者的服務列表是一件非常困難的事,而且也不利於 服務的動態擴縮容。Nacos Discovery Starter 可以幫助您將服務自動註冊到 Nacos 服務端並且能夠動態感知和刷新某個服務實例的服務列表。除此之外,Nacos Discovery Starter 也將服務實例自身的一些元數據信息-例如 host,port,健康檢查URL,主頁等-註冊到 Nacos 。
接下來我們學習一下如何使用Nacos作為服務的註冊中心,並實現服務註冊和服務發現。當前項目開發主流技術是SpringBoot,我們就講解基於SpringBoot如何使用Nacos實現服務註冊與發現。
如上圖,我們以打車項目為例,當用戶打車成功的時候,會調用hailtaxi-order
,hailtaxi-order
會下訂單,同時修改司機狀態,修改狀態需要調用hailtaxi-driver
,我們把hailtaxi-order
服務和hailtaxi-driver
服務都註冊到Nacos中,並實現服務調用,如果整個調用都沒有問題,就說明服務註冊發現沒問題。
關於SpringCloud Alibaba和SpringBoot的版本,我們可以通過 https://start.spring.io/actuator/info 查看。
SpringBoot我們修改成2.2.10版本,SpringCloud版本改成Hoxton.SR11版本。要使用Nacos需要引入依賴包,並且將Consul依賴移除。
1、註釋掉hailtaxi-api
和hailtaxi-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-order
和hailtaxi-pay
中也註意要註釋掉consul的相關依賴坐標
2、在hailtaxi-api
和hailtaxi-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.yml
(bootstrap.properties
)用來在程式引導時執行,應用於更加早期配置信息讀取,如可以使用來配置application.yml
中使用到參數等。
application.yml
(application.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中已經註冊了相關服務,如下圖:
5、按相同方式配置hailtaxi-driver
,hailtaxi-order
,hailtaxi-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
中的異常錯誤處理掉!!!
7、測試
使用postman測試:
http://localhost:8001/driver/info/1
此時服務調用沒有任何問題,說明服務註冊和服務發現正常。
2.2 負載均衡
如上圖,如果此時用戶打車成功,會調用訂單服務,訂單服務會修改司機狀態,此時會調用hailtaxi-driver
,如果是生產環境,每個節點一定是集群狀態,比如有2個hailtaxi-driver
節點,此時如何實現負載均衡?
我們可以發現服務註冊到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的配置如下
最終可以在nacos控制台查看服務的權重信息:
為了方便查看調用了哪個節點,我們把每個節點的埠號輸出,我們請求打車測試
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 命名空間中!!!
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
3、在nacos中添加配置
在配置管理>配置列表
中添加,如下圖:
將hailtaxi-driver原來在application.yml
中的配置全部填寫到下麵表單中,然後將application.yml
配置文件刪除,或者刪除所有配置,如下圖:
Data ID:預設載入${spring.application.name}.${file-extension}
另外對於web服務的埠
server.port
一般留在application.yml
中
註意Data ID
的配置。
4、啟動測試:
我們啟動hailtaxi-driver
服務,預設載入${spring.application.name}.${file-extension:properties}
配置,載入完成後,配置數據會生效,並訪問
http://localhost:18081/driver/info/1 測試,效果如下:
5、配置hailtaxi-gateway
,hailtaxi-order
,hailtaxi-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
hailtaxi-driver-dev.yaml
這樣多出來兩份配置信息如下:
2、在hailtaxi-driver
項目的bootstrap.yml
中激活配置,如下:
啟動項目,看是否能正常啟動!!!
訪問:http://localhost:18081/driver/info/1
3、將active
換成test
,啟動後訪問:http://localhost:18081/driver/info/1
2.3.3 共用/擴展 配置
在實際的業務場景中應用和共用配置間的關係可能,Spring Cloud Alibaba Nacos Config
從 0.2.1 版本後,可支持自定義 Data Id 的配置,通過它可以解決配置共用問題。
共用配置:
1、創建一個Data ID 為:datasource.yaml
的配置,用於配置資料庫連接,如下圖:
2、在hailtaxi-driver-dev.yaml
中將資料庫的配置信息刪除,如下圖:
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
配置信息的載入由NacosConfigProperties完成
啟動測試訪問 http://localhost:18081/driver/info/1,此時能訪問資料庫,同時也能獲取hailtaxi-driver-dev.yaml
中的配置,效果如下:
擴展配置:
nacos除了支持讀取以上所支持的的配置信息外,用戶還可以自定義擴展配置
1、在nacos中 創建一個Data ID 為:custom.yaml
的配置,配置信息如下圖:
app:
version: v1.0
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
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.name
和 app.version
,再次查看控制台輸出
5、預設情況下,shared-configs
和 extension-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
中的服務列表
3、在nacos中,找到hailtaxi-driver-dev.yaml
中,編輯配置,勾選“Beta發佈”,在文本框里填入要下發配置配置的IP,多個IP用逗號分隔,操作如下:
修改配置內容,點擊“發佈Beta”按鈕,即可完成灰度配置的發佈,點擊“發佈Beta”後,“發佈Beta”按鈕變灰,此時可以選擇“停止Beta”或者“發佈”。“停止Beta”表示取消停止灰度發佈,當前灰度發佈配置的IP列表和配置內容都會刪除,頁面回到正常發佈的樣式。“發佈”表示將灰度配置在所有客戶端生效,之前的配置也會被覆蓋,同時頁面回到正常發佈的樣式:
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方便,因此官方推薦該模式,該模式的結構圖如下:
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版本,版本如下:
解壓壓縮包後,包結構如下:
2)配置資料庫
修改conf/application.properties
配置資料庫,配置如下:
3)集群配置
修改conf/cluster.conf
配置集群:
192.168.211.145:8848
192.168.211.146:8848
192.168.211.147:8848
4)節點同步
將修改好的服務分別上傳到192.168.211.146
、192.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
訪問任何一個單節點,信息如下:
註:
學習階段,為了節省資源,可以直接使用
nacos-docker
中已配置好的集群啟動 yml 進行啟動
3.3 客戶端接入Nacos集群
客戶端接入,不建議寫多個節點的IP:Port,建議以功能變數名稱的方式連接Nacos,因此需要配置Nacos功能變數名稱,在192.168.211.145
節點中配置功能變數名稱nacos.hailtaxi.com
,nginx
配置如下:
#負載均衡池配置
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
,效果如下:
項目中使用:
方式1:
項目中Nacos地址可以把多個地址寫到一起,用逗號隔開,如下代碼:
Nacos效果如下:
方式2:
通過Nginx訪問即可,配置如下:
192.168.211.145:80
本文由傳智教育博學谷 - 狂野架構師教研團隊發佈
轉載請註明出處!