大家好,我是不才陳某~
這是《Spring Cloud 進階》第1篇文章,往期文章如下:
- 五十五張圖告訴你微服務的靈魂擺渡者Nacos究竟有多強?
- openFeign奪命連環9問,這誰受得了?
- 阿里面試這樣問:Nacos、Apollo、Config配置中心如何選型?這10個維度告訴你!
- 阿里面試敗北:5種微服務注冊中心如何選型?這幾個維度告訴你!
- 阿里限流神器Sentinel奪命連環 17 問?
- 對比7種分布式事務方案,還是偏愛阿里開源的Seata,真香!(原理+實戰)
- Spring Cloud Gateway奪命連環10問?
- Spring Cloud Gateway 整合阿里 Sentinel網關限流實戰!
- 分布式鏈路追蹤之Spring Cloud Sleuth奪命連環9問?
- 鏈路追蹤自從用了SkyWalking,睡的真香!
- 3本書了,7萬+字,10篇文章,《Spring Cloud 進階》基礎版 PDF
前言
Nacos是阿里巴巴開源的服務注冊中心以及配置中心,致力於給開發者提供一款便捷、簡單上手的開源框架。
Nacos究竟有什么驚人的地方呢?看下圖:
從上圖不難看出阿里巴巴的野心,一個Nacos干掉了Spring Cloud的三大組件,分別是注冊中心Eureka
、服務配置Config
,服務總線Bus
。
本文目錄結構如下圖:
為什么Nacos這么受歡迎?
Nacos官方文檔的介紹中有這么一句話,如下:
Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平台。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務范式、雲原生范式) 的服務基礎設施。
什么意思呢?不着急,有對比才有傷害。
Eureka
、Config
這兩個組件相信大家都用過,有什么感受?
當然,這兩個組件給我最直觀的感受就是繁瑣,原因如下:
- 無論是Eureka還是Config都必須自己搭建個服務
- 英文界面不是那么友好
用過Nacos的開發者都說很爽,不用自己搭建服務,阿里給你准備好了服務,只需要啟動即可;界面中英文都有,很適合初學者。
當然最重要的原因就是以上組件很可能面臨停更
、比如Eureka已經停更了,誰知道后面其他的組件會不會如此呢?
如何自學呢?
對於初學者當然是官方文檔了,下面作者列出了Nacos相關的官方文檔:
- https://nacos.io/zh-cn/docs/what-is-nacos.html(中英文兼備)
- https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html(英文)
- https://github.com/alibaba/nacos(Nacos項目倉庫)
當然很多人不願意看官方文檔,作者也在為大家准備了視頻教程。
公號
碼猿技術專欄
回復關鍵詞9527
免費獲取。
本文版本說明
基於Maven構建的微服務項目,各個組件版本如下:
- JDK1.8+
- Spring Boot-2.2.2.RELEASE
- SpringCloud-Hoxton.SR3
- SpringCloud Alibaba-2.2.1.RELEASE
注意:Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本可不是隨便選擇的,官網明確規定了各個版本的適配:https://github.com/alibaba/spring-cloud-alibaba/wiki,如下圖:
不同版本的Alibaba也對應了不同組件的版本,如下圖:
一定要完全按照文檔給出的版本來選擇,不然會出現意想不到的BUG,那豈不是雞雞....
作者使用的是分模塊的聚合項目演示,其中dependencyManagement
依賴如下,對應着上文提到的版本:
注意:如果你的版本的不是和作者一樣,請一定嚴格按照官方文檔給的版本進行適配,否則會有意想不到的BUG....
啟動Nacos服務
根據上面作者選擇的Spring Cloud Alibaba的版本,對應的Nacos版本是1.2.1
,直接去GitHub(https://github.com/alibaba/nacos/tags)下載對應的版本即可,可以選擇windows或者Linux,如下圖:
下載完成之后直接解壓即可,從它的目錄結構和文件名稱一看這就是一個Spring Boot 項目。
進入/bin
目錄,有兩個腳本,如下:
startup.cmd
:windows平台的啟動腳本startup.sh
:Linux平台的啟動腳本
由於作者本地是windows,直接雙擊startup.cmd
啟動項目,出現以下界面則啟動完成:
在瀏覽器輸入http://localhost:8848/nacos
進入Nacos的登錄界面。
用戶名:nacos;密碼:nacos
登錄成功的界面如下:
服務注冊發現
微服務的服務注冊和發現相信都用過Eureka,要自己本地構建一個Eureka微服務,但是整合了Alibaba的Nacos則不用那么復雜,直接啟動Alibaba提供的Nacos服務即可,這樣讓程序員把全部精力放在業務上,下面是一個簡單的架構圖:
如何演示效果呢?
參照上面架構圖,作者分別創建了兩個模塊,分別是nacos-provider
(服務提供者)、nacos-consumer
(服務消費者),職責如下:
nacos-provider
:注冊進入nacos-server,對外暴露服務nacos-consumer
:注冊進入nacos-server,調用nacos-provider的服務
nacos-provider服務提供者創建
由於使用了多模塊聚合項目,只需要創建一個nacos-provider模塊即可。步驟如下:
1. 添加Maven依賴
需要添加spring-cloud-starter-alibaba-nacos-discovery
這個依賴,如下圖:
由於父模板中指定了spring-cloud-alibaba-dependencies
的版本,子模塊中直接引入依賴即可,不需要指定版本號,這樣才能達到版本管理的效果。
2. 配置YML文件
在配置文件中指定服務名稱、端口號、nacos-server的地址等信息,如下:
server:
port: 9001
spring:
application:
## 指定服務名稱,在nacos中的名字
name: nacos-provider
cloud:
nacos:
discovery:
# nacos的服務地址,nacos-server中IP地址:端口號
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯
include: '*'
3. 開啟服務注冊發現功能
這個大部分Spring Boot功能模塊相同,都需要使用@EnableXxxx
注解來開啟某個功能,否則無法引入自動配置。這里需要使用Spring Cloud的原生注解@EnableDiscoveryClient
來開啟服務注冊發現的功能,如下:
4. 寫個演示服務
nacos-provider作為服務提供者注冊到nacos中,肯定需要提供個服務來供消費者(nacos-consumer)調用,下面是隨便寫的一個接口:
5. 啟動項目
按照上面的5個步驟算是完成了最基本的一個服務,現在只需要啟動nacos-provider這個服務即可。
啟動成功之后在nacos的服務管理->服務列表這里將會發現注冊進入的nacos-provider這個服務,如下圖:
OK,在nacos中能夠看到服務注冊成功了,完成任務..........
nacos-consumer服務消費者創建
同樣是注冊進入nacos,因此大致步驟都是一樣的,步驟如下:
1. 添加Maven依賴
需要添加spring-cloud-starter-alibaba-nacos-discovery
這個依賴,如下圖:
2. 配置YML文件
同樣是指定服務名、端口、nacos-server的地址,如下:
server:
port: 9002
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
# nacos的服務地址
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯
include: '*'
3. 開啟服務注冊發現功能
使用@EnableDiscoveryClient
標注,如下圖:
4. 寫個演示服務
如何演示呢?nacos-provider提供了一個服務,那么我們就調用它的服務來演示一把。
其實Nacos集成了Ribbon,何以見得呢?打開spring-cloud-starter-alibaba-nacos-discovery
的依賴一看便知,如下圖:
因此我們便能使用Ribbon的負載均衡來調用服務,步驟如下:
- 創建RestTemplate,使用
@LoadBalanced
注解標注開啟負載均衡,如下圖:
- 直接使用注冊到nacos的中的服務名作為訪問地址調用服務,如下圖:
- 上圖中的
serviceUrl
是什么東西呢?難道是IP地址?當然不是,既然nacos-provider和nacos-consumer都已經注冊到nacos中,那么可能是可以直接通過服務名直接找到對應得服務,因此這個serviceUrl=http://service-name
,如下圖:
OK,至此nacos-consumer已經准備完成,下面就可以啟動項目。
5. 啟動項目
啟動成功之后將會在nacos中的服務列表中查看到兩個服務,分別是nacos-provider、nacos-consumer,如下圖:
此時服務提供者和消費者都已成功注冊到Nacos,那么接下來就是測試服務能否調的通的問題了。
直接調用nacos-consumer的接口,輸入地址:http://localhost:9002/nacos/test/16
,返回信息如下圖則表示相互調用成功:
總結
Nacos的服務注冊發現很簡單,比Eureka簡單多了,無需自己構建個注冊中心。
啟動配置管理
為什么要用配置管理?其實這已經不僅僅是微服務的痛點了,單體服務也存在這樣的痛點。試問線上的項目如果想要的修改某個配置,比如添加一個數據源,難道要停服更新?顯然是不太現實,那么如何解決呢?
對於單體應用前面已經寫過一篇文章,感興趣的可以看:如何讓Spring Boot 的配置 "動" 起來?
微服務環境下可選的方案還是很多的,比如Config+BUS,攜程開源的Apollo....
這都不是今天的重點,用過Config+BUS覺得怎么樣?自己要搭建一個Config微服務,還要集成GitHub等,你不難受嗎?
下面就來介紹一下Nacos是如何完美的實現配置管理以及動態刷新的。
如何演示效果呢?
新建一個模塊nacos-config
用來整合Nacos實現配置管理,項目結構如下:
Nacos配置列表在哪里能看到呢?在管理平台->配置管理->配置列表這一欄,如下圖:
添加依賴
由於使用了模塊聚合的工程,因此不需要指定版本號,依賴如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置YAML文件
在bootstrap.yml
文件中設置Nacos的配置,如下:
spring:
application:
name: nacos-config
## 當前環境,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}
profiles:
active: dev
cloud:
nacos:
config:
## nacos的地址,作為配置中心
server-addr: 127.0.0.1:8848
## 配置內容的數據格式,目前只支持 properties 和 yaml 類型,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}
file-extension: properties
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯
include: '*'
Data ID是什么?
dataId是一個配置的唯一標識,怎么取值呢?格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
:前綴,默認是spring.application.name
的值,也可以通過配置項spring.cloud.nacos.config.prefix
來配置。spring.profiles.active
: 即為當前環境對應的 profile。當spring.profiles.active
為空時,對應的連接符-
也將不存在,dataId 的拼接格式變成${prefix}.${file-extension}
file-exetension
為配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension
來配置。目前只支持properties
和yaml
類型。
添加一個配置
下面在nacos中添加一個config.version
的配置,如下圖:
以上就是添加的config.version
的配置,發布之后查看列表如下圖:
獲取nacos中的配置
獲取nacos中的配置很簡單,使用原生注解@Value()
直接讀取即可,步驟如下:
- 新建一個實體類
DynamicConfigEntity
:
@Component
@Data
public class DynamicConfigEntity {
//直接讀取nacos中config.version的配置
@Value("${config.version}")
private String version;
}
- 新建一個controller測試,如下:
@RestController
@RequestMapping("/nacos")
public class NacosController {
@Autowired
private DynamicConfigEntity entity;
@GetMapping("/test/{id}")
public String test(@PathVariable("id")Integer id){
return "accept one msg id="+id+"----- version="+entity.getVersion();
}
}
運行項目成功后,在瀏覽器輸入地址:http://localhost:9003/nacos/test/1,返回如下結果:
結果很明顯,Nacos中的配置生效了,是不是很簡單?
配置如何動態刷新?
設想一下:現在由於需求改變了,我需要將config.version
這個配置改成2,那么我直接改變Nacos中的配置會生效嗎?
不妨試一下,直接將Nacos中的配置修改成2,如下圖:
此時我們再不重啟項目的情況下訪問:http://localhost:9003/nacos/test/1,結果如下圖:
what???怎么沒變呢?不是說Nacos可以自動刷新配置嗎?
其實想要Nacos自動刷新配置還需要結合原生注解@RefreshScope
,這個注解是不是很眼熟,在Config中也是用這個注解刷新配置,我們只需要將該注解標注在配置的實體類上即可,如下:
@Component
@RefreshScope
@Data
public class DynamicConfigEntity {
//直接讀取nacos中config.version的配置
@Value("${config.version}")
private String version;
}
此時加上@RefreshScope
重啟之后將Nacos中config.version
這個配置改成3,然后訪問http://localhost:9003/nacos/test/1,結果如下圖:
多環境如何隔離配置?(Namespace)
試想一下:正常的業務開發至少有三個環境吧,如下:
- dev:本地開發環境
- test:測試環境
- prod:生產環境
那么每個環境的配置肯定是不同的,那么問題來了,如何將以上三種不同的配置在Nacos能夠很明顯的區分呢?
很多人可能會問:DataId
格式中不是有環境的區分嗎?這個不是可以滿足嗎?
DataId
當然能夠區分,但是微服務配置可不止這幾個啊?一旦多了你怎么查找呢?多種環境的配置雜糅到一起,你好辨別嗎?
當然阿里巴巴的Nacos開發團隊顯然考慮到了這種問題,官方推薦用命名空間(namespace)來解決環境配置隔離的問題。
Namespace(命名空間):解決多環境及多租戶數據的隔離問題
在多套不同的環境下,可以根據指定的環境創建不同的Namespace,實現多環境的數據隔離
Nacos中默認提供的命名空間則是public
,上述我們創建的config.version
這個配置就屬於public
這個命名空間,如下圖:
當然我們可以根據業務需要創建自己的命名空間,操作如下圖:
陳某創建了三個,分別是dev、test、prod,如下圖:
注意:上圖中的
命名空間ID
是系統自動生成的唯一ID,后續指定不同的Namespace就用這個ID。
創建完成之后,在配置列表上方則可以看見不同的命名空間,如下圖:
既然Nacos中的Namespace配置好了,那么微服務中如何配置呢?前面也說過,Nacos默認指定的命名空間是public
,那么如何在項目中指定命名空間呢?
其實很簡單,假設在test
這個命名空間中添加一個config.version=4
,如下圖:
此時只需要在bootstrap.yml
配置中指定如下配置:
spring:
application:
name: nacos-config
cloud:
nacos:
config:
## namespace的取值是命名空間ID,這里取的是test命名空間ID
namespace: d0ffeec2-3deb-4540-9664-fdd77461fd6b
注意:Namespace必須在
bootstrap.yml
配置文件中指定,否則不生效。
至此,已經全部配置完畢,啟動項目,瀏覽器訪問http://localhost:9003/nacos/test/1,結果如下圖:
不同業務配置如何隔離?(Group)
試想以下場景:有兩個微服務,一個是訂單系統,一個是用戶系統,但是他們有着相同的配置,比如datasource-url
,那么如何區分呢?
此時Group就派上用場了,顧名思義Group是分組的意思。
Group:Nacos 中的一組配置集,是組織配置的維度之一,簡單的說則是不同的系統或微服務的配置文件可以放在一個組里。Nacos如果不指定Group,則默認的分組是DEFAULT_GROUP。
上述場景中訂單系統、用戶系統可以單獨分為一個組,比如ORDER_GROUP
、USER_GROUP
。當然這是比較細粒度的分組,根據企業的業務也可以多個微服務分為一組。
下面在Nacos中新建一個config.version=5
,命名空間為test
,分組為ORDER_GROUP
,如下圖:
此時命名空間test
中的配置如下圖:
在bootstrap.yml
配置文件中指定分組,配置如下:
spring:
application:
name: nacos-config
cloud:
nacos:
config:
## 指定命名空間
namespace: d0ffeec2-3deb-4540-9664-fdd77461fd6b
## 指定分組為ORDER_GROUP
group: ORDER_GROUP
注意:Group配置和Namespace一樣,要在
bootstrap.yml
文件中配置。
至此,已經全部配置完畢,啟動項目,瀏覽器訪問http://localhost:9003/nacos/test/1,結果如下圖:
總結
Nacos實現配置管理和動態配置刷新很簡單,總結如下步驟:
- 添加對應
spring-cloud-starter-alibaba-nacos-config
依賴 - 使用原生注解
@Value()
導入配置 - 使用原生注解
@RefreshScope
刷新配置 - 根據自己業務場景做好多環境配置隔離(Namespace)、不同業務配置隔離(Group)
- 切記:命名空間和分組的配置一定要放在
bootstrap.yml
或者bootstrap.properties
配置文件中
Nacos如何共享配置?
場景:一個項目的微服務數量逐漸增多,勢必會有相同的配置,那么我們可以將相同的配置抽取出來作為項目中共有的配置,比如集群中的數據源信息..
Nacos的共享配置能夠完美的解決上述問題,配置起來也是很簡單,沒辦法,就是這么強大。
Nacos中新建共享配置
陳某這里演示兩個共享配置,DataId
分別是share-config1.properties
,share-config2.properties
,如下圖:
注意:
DataId
一定要帶有后綴properties
或者yml
share-config1.properties
配置中的內容如下:
database.url=jdbc:mysql://112.111.0.135:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
share-config2.properties
配置中的內容如下:
database.user=root
新建模塊nacos-config-share
此處新建一個模塊nacos-config-share來演示效果,依賴同nacos-config
bootstrap.yml
配置如下:
spring:
application:
name: nacos-config-share
cloud:
nacos:
config:
## 指定命名空間
namespace: 51f0479b-a88d-4646-902b-f2a063801502
## nacos的地址,作為配置中心
server-addr: 127.0.0.1:8848
## 配置內容的數據格式,目前只支持 properties 和 yaml 類型,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}
file-extension: properties
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯
include: '*'
以上的配置和nacos-config
差不多,指定application.name
、命名空間、file-extension
、nacos服務地址....
當然除了以上配置肯定是不夠的,要想共享配置還需要添加以下配置:
spring:
application:
name: nacos-config-share
cloud:
nacos:
config:
## 共享配置,List集合,可以配置多個
shared-configs:
## dataId:配置文件的dataId,必須帶有后綴
- dataId: share-config1.properties
## refresh:指定是否能夠動態刷新,默認是false
refresh: true
- dataId: share-config2.properties
## 指定配置文件的分組,默認是DEFAULT_GROUP
group: ORDER_GROUP
refresh: true
想要看到效果,肯定是需要通過@Value()
導入配置,如下:
@Component
@RefreshScope
@Data
public class DynamicConfigEntity {
//獲取共享配置文件中database.url
@Value("${database.url}")
private String databaseUrl;
//獲取共享配置文件中database.user
@Value("${database.user}")
private String user;
}
上面配置完畢,啟動nacos-config-share這個項目,訪問:http://localhost:9003/nacos/test/1,結果如下圖:
動態刷新配置這里就不再演示了,自己動手玩一下......
Nacos如何持久化?
前面講了這么多,大家有沒有思考過一個問題,Nacos的一系列的配置究竟存儲在哪里呢?
其實Nacos默認使用的是內嵌的數據庫Derby
,這個在Nacos-server文件下的/data
目錄下就可以驗證,如下圖:
那么問題來了,這些配置如何用自己的數據庫存儲呢?
目前Nacos僅支持
Mysql
數據庫,且版本要求:5.6.5+
初始化數據庫
首先在Mysql中新建一個數據庫nacos-config
(名稱隨意),然后執行Nacos中的SQL腳本,該腳本是Nacos-server文件夾中的nacos-mysql.sql
,如下圖:
執行該腳本,將會自動創建表,如下圖:
修改配置文件
Nacos-server也是一個Spring Boot 項目,想要連接自己的數據庫,當然要配置數據源了,那么在哪里配置呢?
配置文件同樣在Nacos-server中的conf目錄下,如下圖:
只需要將application.properties
中的Mysql配置取消注釋並且配置好自己的數據源即可,如下圖:
修改完畢,重新啟動Nacos-server。
如何驗證是否持久化呢?很簡單,只需要創建一個配置,然后在his_config_info
表中查看下是否存在即可,如下圖:
Nacos集群如何搭建?
真是夠了,又來扯皮高可用了,真是頭大..........
Nacos推薦集群模式部署,這樣可以避免單點故障,那么如何搭建集群呢?請看官方文檔:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
話不多說,偷一張官網的架構圖,如下:
上圖什么意思呢?說實話,這文檔寫的真不咋的,很多除初學者一看就懵,請看陳某的架構圖,如下:
看了陳某畫的圖是不是更清楚了呢?請求進來先共同Nginx集群進行轉發到Nacos集群中,當然為了保持高可用,數據庫必須也是集群模式。
Nacos官方推薦Linux下搭建集群模式,因此陳某嘗試在Linux環境下搭建。Nginx和Mysql這里集群就不再演示如何搭建了,不是今天的重點,主要演示下Nacos集群的搭建方法。
下載Linux下的Nacos
在GitHub上下載自己對應的版本,陳某用的版本是1.2.1,地址:https://github.com/alibaba/nacos/releases/tag/1.2.1
找到后綴為tar.gz
的文件下載,如下圖:
修改配置文件
由於條件限制,陳某僅僅在一台服務器上啟動三個Nacos服務演示。Nacos的端口分別為8848、8849、8850。
修改端口號
Nacos默認的端口號是8848,那么如何修改端口呢?只需要修改conf
目錄下的application.properties
中的server.port
即可,如下圖:
修改集群配置
那么如何配置集群呢?在conf
目錄下有一個cluster.conf.example
文件,如下圖:
只需要將cluster.conf.example
這個文件復制一份為cluster.conf
放在conf
目錄下,其中配置的內容如下:
172.16.1.84:8848
172.16.1.84:8849
172.16.1.84:8850
什么意思呢?172.16.1.84
是服務器的IP地址,這里填寫自己服務器的IP,:
后面的是Nacos的端口號。
修改數據源
這個在持久化的那里已經講過了,只需要將application.properties
中的數據源替換掉,如下圖:
啟動Nacos
經過上述的步驟Nacos集群已經配置好了,現在分別啟動Nacos,命令如下:
bash -f ./startup.sh
啟動成功,訪問任意一個端口的Nacos服務,在集群管理->節點列表
中將會看到自己搭建的三個節點,如下圖:
至此,Nacos集群算是搭建完成了......
Nginx中配置
此處就不演示Nginx集群搭建了,直接在單機的Nginx中配置。直接修改nginx的conf文件,內容如下:
upstream nacos{
server 172.16.1.84:8848;
server 172.16.1.84:8849;
server 172.16.1.84:8850;
}
server{
listen 80;
location / {
proxy_pass http://nacos;
}
}
相信大家都能看懂,此處就不再做過多解釋了.....配置完成后,啟動Nginx,直接訪問:http://ip/nacos。
項目中配置server-addr
既然搭建了集群,那么項目中也要配置一下,有兩種方式,下面分別介紹。
第一種:通過直連的方式配置,如下:
spring:
application:
## 指定服務名稱,在nacos中的名字
name: nacos-provider
cloud:
nacos:
discovery:
# nacos的服務地址,nacos-server中IP地址:端口號
server-addr: 172.16.1.84:8848,172.16.1.84:8849,172.16.1.84:8850
第二種:直接連接Nginx,如下:
spring:
application:
## 指定服務名稱,在nacos中的名字
name: nacos-provider
cloud:
nacos:
discovery:
# nacos的服務地址,nacos-server中IP地址:端口號
server-addr: 172.16.1.84:80
總結
Nacos集群搭建非常簡單,唯一的配置就是cluster.conf
中設置三個Nacos服務,這也正是Nacos的設計理念,讓開發者能夠盡快上手,專注業務的開發。
Nacos是CP還是AP?
先來簡單復習下CAP的概念吧,如下:
- 一致性(C):在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)
- 可用性(A):在集群中一部分節點故障后,集群整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)
- 分區容錯性(P):以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在C和A之間做出選擇。
一般分布式系統中,肯定是優先保證P,剩下的就是C和A的取舍。
當然不同的注冊中心遵循的CAP也是不同的,如下:
- Zookeeper:保證CP,放棄可用性;一旦zookeeper集群中master節點宕了,則會重新選舉leader,這個過程可能非常漫長,在這過程中服務不可用。
- Eureka:保證AP,放棄一致性;Eureka集群中的各個節點都是平等的,一旦某個節點宕了,其他節點正常服務(一旦客戶端發現注冊失敗,則將會連接集群中其他節點),雖然保證了可用性,但是每個節點的數據可能不是最新的。
- Nacos:同時支持CP和AP,默認是AP,可以切換;AP模式下以臨時實例注冊,CP模式下服務永久實例注冊。
寫在最后
Spring Cloud 進階這個專欄已經蘊量很久了,前段時間一直忙着工作,鐵粉都知道陳某已經完成了兩個專欄文章,分別是Spring Boot 進階、Mybatis 進階;總之原創不易,且看且珍惜,隨手一個贊是美德哦!!!
以上源碼已經上傳GitHub,需要的公號回復關鍵詞
9528
獲取。