Nacos 服務(wù)注冊(cè)和配置中心
簡(jiǎn)介
全名NamingConfiguration,一個(gè)更易于構(gòu)建云原生的動(dòng)態(tài)服務(wù)發(fā)現(xiàn),配置管理和服務(wù)管理平臺(tái).Nacos就是注冊(cè)中心+配置中心的組合,替代Eureka做服務(wù)注冊(cè)中心,替代Config做服務(wù)配置中心
注冊(cè)進(jìn)Nacos
- maven
父工程
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
啟動(dòng)類
@EnableDiscoveryClientyml
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #配置nacos地址
Nacos默認(rèn)集成了ribbon,所以服務(wù)提供者實(shí)現(xiàn)負(fù)載的情況下,調(diào)用方會(huì)自動(dòng)使用默認(rèn)策略來(lái)進(jìn)行選擇
服務(wù)注冊(cè)中心對(duì)比
| 服務(wù)注冊(cè)與發(fā)現(xiàn)框架 | CAP模型 | 控制臺(tái)管理 | 社區(qū)活躍度 |
|---|---|---|---|
| Eureka | AP | 支持 | 低(2.x版本閉源) |
| Zookeeper | CP | 不支持 | 中 |
| Consul | CP | 支持 | 高 |
| Nacos | AP/CP | 支持 | 高 |
據(jù)說(shuō) Nacos 在阿里巴巴內(nèi)部有超過(guò)10萬(wàn)的實(shí)例運(yùn)行,已經(jīng)過(guò)了累死雙十一等各種大型流量的考驗(yàn)
- Nacos與其他注冊(cè)中心特性對(duì)比
| >> | Nacos | Eureka | Consul | CoreDNS | Zookeeper |
|---|---|---|---|---|---|
| 一致性協(xié)議 | CP+AP | AP | CP | / | CP |
| 健康檢查 | TCP/HTTP/Mysql/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | / | Client Beat |
| 負(fù)載均衡 | 權(quán)重/DSL/metadata/CMDB | Ribbon | Fabio | RR | / |
| 雪崩保護(hù) | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
| 自動(dòng)注銷實(shí)例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
| 訪問(wèn)協(xié)議 | HTTP/DNS/UDP | HTTP | HTTP/DNS | DNS | TCP |
| 監(jiān)聽(tīng)支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
| 多數(shù)據(jù)中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 跨注冊(cè)中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
| SpringCloud | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
| K8s集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
總之我很欣賞阿里的一點(diǎn),野心很大!網(wǎng)上可以搜到他的Nacos全景圖,幾乎所有的覆蓋面他都要去做,包括他的官網(wǎng)建議拋棄zookeeper直接Nacos整合Dubbo,也就誕生了唯一一個(gè)AP,CP都支持的注冊(cè)中心
注: C是所有節(jié)點(diǎn)在同一時(shí)間看到的數(shù)據(jù)時(shí)一致的;而A的定義是所有的請(qǐng)求都會(huì)受到響應(yīng)
何時(shí)選擇使用何種模式?
一般來(lái)說(shuō)如果不需要存儲(chǔ)服務(wù)級(jí)別的信息且服務(wù)實(shí)例是從nacos-client注冊(cè),并能夠保持心跳上報(bào),那么就可以選擇AP模式.當(dāng)前主流的服務(wù)如Spring Cloud和Dubbo服務(wù),都適用于AP模式,AP模式為了服務(wù)的可能性而減弱了一致性,因此AP模式下只支持注冊(cè)臨時(shí)實(shí)例
如果需要在服務(wù)級(jí)別編輯或者存儲(chǔ)配置信息,那么CP是必須,K8s服務(wù)和DNS服務(wù)則適用于CP模式,CP模式下則支持注冊(cè)持久化實(shí)例,此時(shí)則是以Raft協(xié)議為集群模式運(yùn)行,該模式下注冊(cè)實(shí)例之前必須先注冊(cè)服務(wù),如果服務(wù)不存在則會(huì)返回錯(cuò)誤.
Nacos切換CAP選擇
curl -X PUT "$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP"
分布式配置中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
config 的yml要區(qū)分于出來(lái)的bootstrap.yml,Nacos同Springcloud-config一樣,在項(xiàng)目初始化時(shí),要保證先從配置中心進(jìn)行配置拉取之后,才能保證項(xiàng)目的正常啟動(dòng)
bootstrap.yml
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.10.63:8848
config:
server-addr: 192.168.10.63:8848
file-extension: yaml #指定yaml格式的配置
application.yml
server:
port: 3377
spring:
profiles:
active: dev
在控制臺(tái)添加對(duì)應(yīng)DataId的配置文件,具體規(guī)則我們?cè)诠倬W(wǎng)可以查看Nacos Config gitHub
也就是分為三部分組成,實(shí)例名稱+profile級(jí)別+后綴名
感興趣的也可以看我以前的文章Spring Cloud Config,原理就是用SpringCloudConfig做的,也同時(shí)支持動(dòng)態(tài)刷新
發(fā)布之后我們就可以用配置中心的文件來(lái)進(jìn)行項(xiàng)目配置了
具體原理是怎么通知到項(xiàng)目,以及項(xiàng)目是怎么以配置中心為基準(zhǔn)的我也整理過(guò)
Spring Cloud Bus,Nacos 也是參照Cloud一步一步整合升級(jí)來(lái)的
分類配置
Nacos已經(jīng)干翻了eureka+config+bus,并且他們沒(méi)有的他也有,介紹點(diǎn)新功能
- Namespace 命名空間
Nacos默認(rèn)的命名空間是public,Namespace主要用來(lái)實(shí)現(xiàn)隔離
比如說(shuō)我們現(xiàn)在有三個(gè)環(huán)境:開(kāi)發(fā),測(cè)試和生產(chǎn)環(huán)境,我們就可以創(chuàng)建三個(gè)Namespace.不同的Namespace之間是隔離的
- Group 組
Group默認(rèn)DEFAULT_GROUP,Group可以把不同的微服務(wù)劃分到同一個(gè)分組里面去
- Cluster 集群 默認(rèn)DEFAULT
集群配置&持久化
在單機(jī)版啟動(dòng)的情況下,Nacos默認(rèn)是采用內(nèi)嵌式數(shù)據(jù)庫(kù)derby,所以在我們重啟或斷點(diǎn)的情況下,只要重啟就可以保證我們配置的文件還在,但在我們集群的環(huán)境下不可能每個(gè)服務(wù)去單獨(dú)配置一遍,并且還不共享,所以官網(wǎng)就推薦我們必須要配置集群環(huán)境,并且支持mysql數(shù)據(jù)庫(kù)來(lái)持久化,官網(wǎng)推薦使用linux環(huán)境
修改conf文件里的application.properties,添加數(shù)據(jù)庫(kù)對(duì)應(yīng)項(xiàng)和配置,詳細(xì)看官網(wǎng)
修改啟動(dòng)命令,添加 -p命令
while getopts ":m:f:s:p:" opt
do
case $opt in
m)
MODE=$OPTARG;;
f)
FUNCTION_MODE=$OPTARG;;
s)
SERVER=$OPTARG;;
p)
PORT=$OPTARG;;
修改luster.conf, 配置指定的集群端口
修改啟動(dòng)命令,添加port指定
nohup $JAVA -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
重啟nacos,并端口形式,例: `./startup.sh -p 8849
配置nginx代理