PS
: 本篇博客為作者學(xué)習(xí)筆記實(shí)際技術(shù)參考意義不大,小編將持續(xù)更新完善本篇文章。
Nacos服務(wù)注冊(cè)配置中心,一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn),配置管理和服務(wù)管理平臺(tái),屬于Springcloud Alibaba 體系中的組件之一,也是目前企業(yè)開發(fā)中最流行的服務(wù)注冊(cè)與配置中心。
更多詳細(xì)信息各位小伙伴可以參照Springcloud Alibaba官網(wǎng): 點(diǎn)擊跳轉(zhuǎn)官網(wǎng)
Nacos源碼地址: 點(diǎn)擊跳轉(zhuǎn)源碼地址
Nacos官網(wǎng)地址: 點(diǎn)擊跳轉(zhuǎn)官網(wǎng)
一些注冊(cè)中心特性對(duì)比:
Nacos既可以在Windows上使用,也可以在Linux上面使用,下面兩種系統(tǒng)的Nacos安裝小編都會(huì)介紹到,首先我們要準(zhǔn)備好Nacos的安裝包,點(diǎn)進(jìn)入Nacos的倉庫 點(diǎn)擊跳轉(zhuǎn)。
點(diǎn)擊 【發(fā)行版】就可以看到Nacos的全部歷史版本
點(diǎn)擊 【標(biāo)簽】可以選擇想要的版本下載
選擇好版本點(diǎn)擊最右邊的【下載】后翻到最下面就可以看到對(duì)應(yīng)的下載文件,【zip】則是windows版本 【tar.gz】就是Linux使用的版本。
準(zhǔn)備好Windows環(huán)境下的安裝包后,就可以開始Windows環(huán)境下Nacos的安裝了。
將準(zhǔn)備好的安裝包解壓到任意目錄下(最好是全英文的路徑)解壓后文件夾內(nèi)結(jié)構(gòu)如下:
bin目錄是存放啟動(dòng)腳本的目錄 conf目錄是存放Nacos配置文件的目錄。
關(guān)于端口配置,Nacos的默認(rèn)端口是8848
,如果你電腦上的其它進(jìn)程占用了8848端口,請(qǐng)先嘗試關(guān)閉該進(jìn)程。如果無法關(guān)閉占用8848端口的進(jìn)程,也可以進(jìn)入nacos的conf目錄,修改配置文件中Nacos默認(rèn)啟動(dòng)占用的端口:
確認(rèn)端口沒有問題后就可以進(jìn)入bin目錄啟動(dòng)cmd窗口,使用下面的命令啟動(dòng)Nacos:
startup.cmd -m standalone
也可以直接雙擊startup.cmd文件啟動(dòng)Nacos
看到上面這個(gè)樣子就是啟動(dòng)成功了,也標(biāo)明了啟動(dòng)占用的端口和后臺(tái)的訪問地址。
我們用瀏覽器直接訪問http://127.0.0.1:8848/nacos
即可,正常情況下會(huì)看到下面的內(nèi)容:
默認(rèn)的用戶名和密碼都是 nacos 直接登錄即可,至此Windows環(huán)境下安裝Nacos就完成了
對(duì)于Linux環(huán)境下Nacos安裝相對(duì)于Windows環(huán)境下的安裝要復(fù)雜一點(diǎn),首先要準(zhǔn)備好Linux版本的Nacos安裝包,其次Nacos依賴于JDK運(yùn)行,索引Linux上也需要安裝JDK才行。
沒有安裝java環(huán)境的小伙伴可以參考小編這篇文章 點(diǎn)擊跳轉(zhuǎn) 配置好java環(huán)境后就可以開始我們的安裝了。
首先將我們準(zhǔn)備好的安裝包上傳到任意目錄,列如/usr/local/
然后使用下面的命令進(jìn)行解壓:
tar -xvf nacos-server-1.4.1.tar.gz
然后執(zhí)行下面的命令刪除安裝包:
rm -rf nacos-server-1.4.1.tar.gz
1. 單擊模式啟動(dòng)首先進(jìn)入到已經(jīng)解壓好的Nacos目錄的bin目錄下:
cd /usr/local/nacos/bin
執(zhí)行下面的命令啟動(dòng)Nacos:
sh startup.sh -m standalone
下面的情況是正常啟動(dòng)了
停止Nacos的命令:
sh shutdown.sh
2. 集群模式啟動(dòng)集群模式的啟動(dòng)需要先創(chuàng)建數(shù)據(jù)庫,腳本位置:/usr/local/nacos/conf/nacos-mysql.sql
利用該腳本創(chuàng)建數(shù)據(jù)庫。
緊接著我們需要配置一下Nacos的配置文件:
cd /usr/local/nacos/conf
vim application.properties
修改下面的內(nèi)容(將原來的注釋放開,)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.114.12.177:3306/nacos?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
注意:此處的ip地址、端口號(hào)、數(shù)據(jù)庫名、賬號(hào)和密碼都需要按照自己的實(shí)際情況進(jìn)行修改
。
啟動(dòng):
cd /usr/local/nacos/bin
sh startup.sh
查看啟動(dòng)日志:
cd /usr/local/nacos/logs
vim start.out
3. 遠(yuǎn)程web控制我們可以執(zhí)行下面的命令放行當(dāng)前主機(jī)的8848端口,以便我們?cè)L問遠(yuǎn)程的web控制臺(tái):
firewall-cmd --zone=public --add-port=8848/tcp --permanent
放行完端口再執(zhí)行下面的命令重啟一下當(dāng)前主機(jī)的防火墻:
firewall-cmd --reload
緊接著我們就可以訪問http://當(dāng)前主機(jī)地址:8848/nacos
就會(huì)出現(xiàn)下面的情況:
默認(rèn)的用戶名是: nacos 默認(rèn)的密碼也是: nacos
為了更加方便的管理Nacos,最好是將其注冊(cè)為系統(tǒng)服務(wù)
首先使用下面的命令修改 /usr/local/nacos/bin/startup.sh 啟動(dòng)文件
vim /usr/local/nacos/bin/startup.sh
將路徑修改為當(dāng)前系統(tǒng)中存放jdk的路徑:
使用下面的命令創(chuàng)建并編輯nacos.service
文件:
vim /lib/systemd/system/nacos.service
向文件中添加下面的內(nèi)容:
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
保存退出后執(zhí)行下面的命令重載一下系統(tǒng)服務(wù):
systemctl daemon-reload
就完成了Nacos的系統(tǒng)服務(wù)注冊(cè),服務(wù)名就叫nacos
。
之后我們就可以使用操作系統(tǒng)服務(wù)的命令對(duì)Nacos進(jìn)行操作了,下面是一些常用命令:
systemctl start nacos.service // 啟動(dòng)nacos服務(wù)
systemctl stop nacos.service // 停止nacos服務(wù)
systemctl status nacos.service // 查看nacos服務(wù)狀態(tài)
systemctl enable nacos.service // 設(shè)置為開機(jī)自啟
systemctl restart nacos.service // 重啟nacos服務(wù)
systemctl reload nacos.service // 重載nacos服務(wù) (推薦使用)
三. 基本使用
1. 添加依賴要想使用Nacos首先要在父工程
的POM文件中添加下面的依賴:
com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.5.RELEASE pom import
然后修改子工程的POM文件,將下面的依賴加入其中:
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
2. 服務(wù)注冊(cè)spring:
application:
name: orderservice # 服務(wù)名
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服務(wù)地址
再啟動(dòng)服務(wù)就可以在后臺(tái)管理界面中的【服務(wù)列表】選項(xiàng)卡的子選項(xiàng)卡 【服務(wù)列表】中找到我們注冊(cè)的服務(wù)。
在消費(fèi)者進(jìn)行服務(wù)調(diào)用的時(shí)候也就可以通過服務(wù)名進(jìn)行調(diào)用了(orderservice代替id地址和端口),且Nacos自帶了負(fù)載均衡。
配置當(dāng)前服務(wù)的實(shí)例歸屬于哪個(gè)集群
修改模塊的Yml配置文件:
spring:
application:
name: orderservice # 服務(wù)名 可以通過相同的服務(wù)名部署多個(gè)實(shí)例
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服務(wù)地址
discovery:
cluster-name: hangzhou # 集群名
在web控制臺(tái)中可以看到集群的信息,再編輯Yml配置文件設(shè)置負(fù)載均衡的1Rule為NacosRule,這個(gè)規(guī)則優(yōu)先會(huì)尋找與自己同集群的服務(wù),本地集群找不到提供者,才去其它集群尋找,并且會(huì)報(bào)警告。
確定了可用實(shí)例列表后,再采用隨機(jī)負(fù)載均衡挑選實(shí)例。
userservice:
ribbon:
# 優(yōu)先請(qǐng)求同集群的實(shí)例
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
4. 實(shí)例權(quán)重負(fù)載均衡實(shí)際部署中會(huì)出現(xiàn)這樣的場(chǎng)景:服務(wù)器設(shè)備性能有差異,部分實(shí)例所在機(jī)器性能較好,另一些較差,我們希望性能好的機(jī)器承擔(dān)更多的用戶請(qǐng)求。
Nacos提供了權(quán)重配置來控制訪問頻率,權(quán)重越大則訪問頻率越高。
默認(rèn)權(quán)重都是1,在服務(wù)升級(jí)和優(yōu)化時(shí)可以將該服務(wù)權(quán)重設(shè)置成0,該服務(wù)就不會(huì)再收到請(qǐng)求。
Nacos中服務(wù)存儲(chǔ)和數(shù)據(jù)存儲(chǔ)的最外層都是一個(gè)名為namespacel的東西,用來做最外層隔離。
修改實(shí)例的命名空間需要修改服務(wù)的配置文件,默認(rèn)都是存儲(chǔ)在public(保留空間中):
spring:
application:
name: orderservice # 服務(wù)名 可以通過相同的服務(wù)名部署多個(gè)實(shí)例
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服務(wù)地址
discovery:
cluster-name: hangzhou # 集群名
namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # dev環(huán)境 命名空間Id
注意
: 只有相同命名空間的服務(wù)實(shí)例才可以相互調(diào)用
默認(rèn)在Nacos中注冊(cè)的實(shí)例都是臨時(shí)實(shí)例,那么臨時(shí)實(shí)例與非臨時(shí)實(shí)例有什么區(qū)別呢?
臨時(shí)實(shí)例: 采用心跳檢測(cè)(服務(wù)每隔一段時(shí)間就會(huì)發(fā)送一次請(qǐng)求給注冊(cè)中心Nacos確保實(shí)例的可用性)當(dāng)長(zhǎng)時(shí)間沒有向Nacos發(fā)送心跳請(qǐng)求Nacos就會(huì)在服務(wù)列表中將該實(shí)例剔除。
非臨時(shí)實(shí)例: 不會(huì)擁有心跳檢測(cè)機(jī)制,而是由Nacos主動(dòng)發(fā)送請(qǐng)求詢問實(shí)例,如果檢測(cè)到非臨時(shí)實(shí)例Nacos不會(huì)將其剔除,而是標(biāo)記為不健康狀態(tài)除非手動(dòng)刪除,否則會(huì)一直等待其恢復(fù)健康狀態(tài)。
對(duì)于配置實(shí)例是否為臨時(shí)實(shí)例需要配置實(shí)例的YAM配置文件:
spring:
application:
name: orderservice # 服務(wù)名 可以通過相同的服務(wù)名部署多個(gè)實(shí)例
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服務(wù)地址
discovery:
cluster-name: hangzhou # 集群名
namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # dev環(huán)境 命名空間Id
ephemeral: false # 是否為臨時(shí)實(shí)例 默認(rèn)是true
四. Nacos配置管理
1. Nacos實(shí)現(xiàn)配置熱更新Nacos處理可以擔(dān)任服務(wù)注冊(cè)中心,還可以擔(dān)任服務(wù)的配置中心,首先我們需要在模塊的POM文件中添加Nacos的配置管理依賴:
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
然后我們?cè)诤笈_(tái)管理界面中點(diǎn)擊【配置管理】的【配置列表】模塊右上角的加號(hào)先添加一個(gè)。
【Data ID】其實(shí)就是配置文件名 (必須唯一) 一般以“服務(wù)名-運(yùn)行環(huán)境.后綴
” 作為文件名列如
:userservice-dev.yaml
【Group】組ID 這個(gè)自定義
【配置格式】一般都是使用YAML,根據(jù)后綴自定義
【配置內(nèi)容】根據(jù)選擇的文件格式書寫有熱更新需求的配置
修改完成后點(diǎn)擊右下角的【發(fā)布】即可,由于在讀取Nacos中的配置文件之前我們實(shí)例就需要知道Nacos的服務(wù)地址等信息,所以我們一般將Naocs的配置放在加載優(yōu)先級(jí)更高的bootstrap.yml
文件中注
: bootstrap.yml又叫引導(dǎo)文件,加載優(yōu)先級(jí)比application.yml要高
可以在resources目錄中添加一個(gè)bootstrap.yml,需要添加的配置如下:
spring:
application:
name: userservice # 服務(wù)名
profiles:
active: dev # 環(huán)境
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos地址
config:
file-extension: yaml # 文件后綴名
其中“服務(wù)名
”、“環(huán)境
”、“文件后綴名
” 其實(shí)就是我們上面在后臺(tái)創(chuàng)建的配置文件名,相應(yīng)的就會(huì)讀取后臺(tái)相應(yīng)配置文件內(nèi)容,在項(xiàng)目中我們也可以使用value注解讀取配置文件中的內(nèi)容,列如:
@Value("${pattern.dateformat}")
private String dateformat;
要想實(shí)現(xiàn)配置熱更新還差最后一步,Ncos中的配置文件變更后,微服務(wù)無需重啟就可以感知。不過需要通過下面兩種配置實(shí)現(xiàn):
需要 prefix指定的前綴名跟變量名拼接和后臺(tái)管理系統(tǒng)中的屬性一致才可生效,一般第一種方式用的比較多。
假設(shè)一個(gè)業(yè)務(wù)場(chǎng)景,一個(gè)配置在開發(fā)環(huán)境,生產(chǎn)環(huán)境都需要用到,那么每份配置都配置一次顯然是相當(dāng)麻煩的。
這樣無論是生產(chǎn)還是測(cè)試相同的配置都寫在userservice.yaml中,這樣給我們帶來了極大的便利
spring:
application:
name: userservice # 服務(wù)名
profiles:
active: dev # 環(huán)境
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos地址
config:
file-extension: yaml # 文件后綴名
這樣即可以讀取到userservice-dev.yaml 配置文件的內(nèi)容,也可以讀取到userservice.yaml配置文件中的內(nèi)容,即使環(huán)境為test環(huán)境也可以讀取到userservice.yaml配置文件的內(nèi)容。
如果兩個(gè)文件中有一個(gè)相同的屬性,或者說application.yml也有一個(gè)屬性相同,那么文件的加載優(yōu)先級(jí)是:
userservice-dev.yaml >userservice.yaml >application.yml
五. Nacos集群搭建官方給出的Nacos集群圖:
其中包含3個(gè)nacos節(jié)點(diǎn),然后一個(gè)負(fù)載均衡器代理3個(gè)Nacos。這里負(fù)載均衡器可以使用nginx。
我們計(jì)劃的集群結(jié)構(gòu):
三個(gè)nacos節(jié)點(diǎn)的地址:
節(jié)點(diǎn) | ip | port |
---|---|---|
nacos1 | 192.168.150.1 | 8845 |
nacos2 | 192.168.150.1 | 8846 |
nacos3 | 192.168.150.1 | 8847 |
搭建集群的基本步驟:
Nacos默認(rèn)數(shù)據(jù)存儲(chǔ)在內(nèi)嵌數(shù)據(jù)庫Derby中,不屬于生產(chǎn)可用的數(shù)據(jù)庫,官方推薦的最佳實(shí)踐是使用帶有主從的高可用數(shù)據(jù)庫集群
這里我們以單點(diǎn)的數(shù)據(jù)庫為例來講解。
將Nacos解壓后,首先啟動(dòng)本機(jī)mysql,創(chuàng)建nacos數(shù)據(jù)庫,并在nacos_config數(shù)據(jù)庫下執(zhí)行nacos-mysql.sql腳本 (腳本存放位置nacos/cont/nacos-mysql.sql):
mysql>source /opt/nacos/cont/nacos-mysql.sql;
進(jìn)入nacos的conf目錄,修改配置文件cluster.conf.example,重命名為cluster.conf:
然后添加內(nèi)容:
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
然后修改application.properties文件,添加數(shù)據(jù)庫配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
2. 啟動(dòng)將nacos文件夾復(fù)制三份,分別命名為:nacos1、nacos2、nacos3
然后分別修改三個(gè)文件夾中的application.properties,
nacos1:
server.port=8845
nacos2:
server.port=8846
nacos3:
server.port=8847
然后我們就可以分別將他們都啟動(dòng)起來
3. 安裝Nginx關(guān)于Nginx的安裝小編的專欄里面有對(duì)應(yīng)的文章。
修改conf/nginx.conf文件,配置如下:
upstream nacos-cluster {server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {listen 80;
server_name localhost;
location /nacos {proxy_pass http://nacos-cluster;
}
}
而后在瀏覽器訪問:http://localhost/nacos即可。
代碼中application.yml文件配置如下:
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址
實(shí)際部署時(shí),需要給做反向代理的nginx服務(wù)器設(shè)置一個(gè)域名,這樣后續(xù)如果有服務(wù)器遷移nacos的客戶端也無需更改配置,Nacos的各個(gè)節(jié)點(diǎn)應(yīng)該部署到多個(gè)不同服務(wù)器,做好容災(zāi)和隔離。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧