Nacos集成
一、Nacos 服務(wù)搭建
1.1 環(huán)境準(zhǔn)備
- 騰訊云 Linux centos 7.5 64位
- 本地windows 64 bit JDK 1.8卫病;
- 本地 Maven 3.6.3割坠;
1.2 下載安裝
- 下載源碼并打包源碼包(PS,也可以直接下載源碼包)
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
- 上傳源碼包并解壓縮到云服務(wù)器
tar -xvf nacos-server-$version.tar.gz
1.3 運(yùn)行 nacos server
Nacos支持三種運(yùn)行模式:
- 單機(jī)模式:用于測(cè)試和單機(jī)試用
- 集群模式:用于生產(chǎn)環(huán)境速客,確保高可用
- 多集群模式:用于多數(shù)據(jù)中心場(chǎng)景
單機(jī)模式
cd nacos/bin
[root@VM-0-5-centos bin]# ll
total 32
-rw-r--r-- 1 root root 720 Sep 20 20:35 derby.log
drwxr-xr-x 2 root root 4096 Sep 22 19:04 logs
-rwxr-xr-x 1 root root 978 Sep 20 15:16 shutdown.cmd
-rwxr-xr-x 1 root root 979 Sep 20 15:16 shutdown.sh
-rwxr-xr-x 1 root root 3535 Sep 20 15:16 startup.cmd
-rwxr-xr-x 1 root root 5028 Sep 20 20:07 startup.sh
drwxr-xr-x 3 root root 4096 Sep 20 20:08 work
啟動(dòng)命令(standalone代表著單機(jī)模式運(yùn)行叠赐,非集群模式):
sh startup.sh -m standalone
ps:
1. 首次啟動(dòng)可能存在sh權(quán)限問(wèn)題欲账,需要對(duì)sh進(jìn)行賦權(quán)
chmod +x startup.sh
2. 首次啟動(dòng)可能報(bào).sh line 2 :$'\r': command not found
原因是 windows 下的換行符是 \r\n,而 linux 下的換行符是 \n
解決方案:
# 安裝 dos2unix
yum install dos2unix -y
# 執(zhí)行命令
dos2unix startup.sh
# 關(guān)閉頁(yè)面燎悍,后臺(tái)運(yùn)行
./startBatch.sh &
單機(jī)模式支持mysql
nacos 0.7 以后支持mysql數(shù)據(jù)源:
- 安裝mysql 5.6.5+
- 創(chuàng)建nacos database, 初始化nacos-mysql.sql
- 修改conf/application.properties文件敬惦,增加支持mysql數(shù)據(jù)源配置(目前只支持mysql)盼理,添加mysql數(shù)據(jù)源的url谈山、用戶名和密碼。
### Count of DB:
db.num=1
### Connect URL of DB:
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=root
db.password=root
再以單機(jī)模式啟動(dòng)nacos宏怔,nacos所有寫(xiě)嵌入式數(shù)據(jù)庫(kù)的數(shù)據(jù)都寫(xiě)到了mysql奏路。
訪問(wèn)nacos控制臺(tái)
遇到的坑畴椰,在首次啟動(dòng)后臺(tái)服務(wù)器報(bào)錯(cuò):jmenv.tbsite.net
aused by: com.alibaba.nacos.api.exception.NacosException: java.net.UnknownHostException: jmenv.tbsite.net
at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.run(AddressServerMemberLookup.java:110)
at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.start(AddressServerMemberLookup.java:66)
at com.alibaba.nacos.core.cluster.ServerMemberManager.initAndStartLookup(ServerMemberManager.java:156)
at com.alibaba.nacos.core.cluster.ServerMemberManager.init(ServerMemberManager.java:144)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:363)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:307)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
... 111 common frames omitted
解決辦法是,conf中只給了一個(gè)cluster.conf.example文件鸽粉,需要copy成一個(gè)cluster.conf即可斜脂。
集群模式
多集群模式
二、Spring Cloud nacos注冊(cè)中心和配置中心集成
- 通過(guò) Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)触机。
- 通過(guò) Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 實(shí)現(xiàn)配置的動(dòng)態(tài)管理帚戳。
Spring Cloud可以實(shí)現(xiàn)零代碼切換到Nacos注冊(cè)中心,只需要引入nacos依賴并增加配置nacos注冊(cè)中心儡首。
版本說(shuō)明:
<spring-boot-dependencies.version>2.2.9.RELEASE</spring-boot-dependencies.version>
<spring-cloud-dependencies.version>Hoxton.SR8</spring-cloud-dependencies.version>
<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
截止2020.09.22 spring-cloud-alibaba 僅支持Spring Boot 2.2.x
2.1 Nacos 快速集成
- 引入Nacos client 依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 通過(guò)Spring Cloud 原生注解開(kāi)啟注冊(cè)服務(wù)以及自動(dòng)刷新配置功能
package com.qt.mall;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@RefreshScope
@SpringBootApplication
public class NacosServiceApplication {
public static void main(String[] args) {
SpringApplication.run(NacosServiceApplication.class, args);
}
}
- 在配置中增加nacos地址片任、注冊(cè)應(yīng)用名稱、配置中心配置
bootstrap.yml
# mvn 命令啟動(dòng)添加--spring.profiles.active=test
spring:
application:
name: nacos-service
profiles:
active: dev
bootstrap-dev.yml
spring:
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 120.53.121.130
namespace: 180d5ec1-9253-4c55-a018-e27e609b83f3
#ip: 192.168.128.41
config:
server-addr: 120.53.121.130
file-extension: yml
group: nacos-service
namespace: 180d5ec1-9253-4c55-a018-e27e609b83f3
-
登錄nacos控制臺(tái)蔬胯,增加配置
-
啟動(dòng)服務(wù)对供,驗(yàn)證注冊(cè)服務(wù)和配置中心結(jié)果
2.2 配置說(shuō)明
nacos除了核心注冊(cè)中心、配置中心連接配置外氛濒,可以實(shí)現(xiàn)代碼零配置解決方案产场。
nacos動(dòng)態(tài)配置服務(wù)可以讓系統(tǒng)以中心化、外部化和動(dòng)態(tài)化的方式管理所有環(huán)境的應(yīng)用配置和服務(wù)配置舞竿。
- spring.application.name:注冊(cè)服務(wù)名稱京景,也是構(gòu)成 Nacos 配置管理 dataId字段的一部分。
# 在 Nacos Spring Cloud 中骗奖,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默認(rèn)為spring.application.name
的值醋粟,也可以通過(guò)配置項(xiàng)spring.cloud.nacos.config.prefix
來(lái)配置。spring.profiles.active
即為當(dāng)前環(huán)境對(duì)應(yīng)的 profile重归,詳情可以參考 Spring Boot文檔米愿。 注意:當(dāng)spring.profiles.active
為空時(shí),對(duì)應(yīng)的連接符-
也將不存在鼻吮,dataId 的拼接格式變成${prefix}.${file-extension}
file-exetension
為配置內(nèi)容的數(shù)據(jù)格式育苟,可以通過(guò)配置項(xiàng)spring.cloud.nacos.config.file-extension
來(lái)配置。目前只支持properties
和yaml
類型椎木。
2.3 Nacos數(shù)據(jù)隔離模式
Nacos提供四層的數(shù)據(jù)隔離模式:
- Company:用戶賬號(hào)對(duì)應(yīng)的可能是一個(gè)企業(yè)或者獨(dú)立的個(gè)體违柏,這個(gè)數(shù)據(jù)一般情況下不會(huì)透?jìng)鞯椒?wù)注冊(cè)中心。
- Namespace: 一個(gè)用戶賬號(hào)可以新建多個(gè)命名空間香椎,每個(gè)命名空間對(duì)應(yīng)一個(gè)客戶端實(shí)例漱竖,這個(gè)命名空間對(duì)應(yīng)的注冊(cè)中心物理集群是可以根據(jù)規(guī)則進(jìn)行路由的,這樣可以讓注冊(cè)中心內(nèi)部的升級(jí)和遷移對(duì)用戶是無(wú)感知的畜伐,同時(shí)可以根據(jù)用戶的級(jí)別馍惹,為用戶提供不同服務(wù)級(jí)別的物理集群。Namespace常用于進(jìn)行租戶粒度的配置隔離。不同的命名空間下万矾,可以存在相同的 Group 或 Data ID 的配置悼吱。Namespace 的常用場(chǎng)景之一是不同環(huán)境的配置的區(qū)分隔離,例如開(kāi)發(fā)測(cè)試環(huán)境和生產(chǎn)環(huán)境的資源(如配置良狈、服務(wù))隔離等后添。
- Group:Nacos 中的一組配置集,是組織配置的維度之一薪丁。通過(guò)一個(gè)有意義的字符串(如 Buy 或 Trade )對(duì)配置集進(jìn)行分組遇西,從而區(qū)分 Data ID 相同的配置集。當(dāng)您在 Nacos 上創(chuàng)建一個(gè)配置時(shí)严嗜,如果未填寫(xiě)配置分組的名稱努溃,則配置分組的名稱默認(rèn)采用 DEFAULT_GROUP 。配置分組的常見(jiàn)場(chǎng)景:不同的應(yīng)用或組件使用了相同的配置類型阻问,如 database_url 配置和 MQ_topic 配置梧税。
- Service:服務(wù)是指一個(gè)或一組軟件功能(例如特定信息的檢索或一組操作的執(zhí)行),其目的是不同的客戶端可以為不同的目的重用(例如通過(guò)跨進(jìn)程的網(wǎng)絡(luò)調(diào)用)称近。Nacos 支持主流的服務(wù)生態(tài)第队,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
三刨秆、高級(jí)應(yīng)用
3.1 基于Namespace命名空間的資源隔離
根據(jù)Nacos不同的Namespace下凳谦,可以存在相同的 Group 或 Data ID 的配置的數(shù)據(jù)隔離特性,我們可以很好的實(shí)現(xiàn)同一Nacos Server集群統(tǒng)一管理項(xiàng)目不同環(huán)境的資源(注冊(cè)服務(wù)實(shí)例衡未、配置等)
-
定義各個(gè)環(huán)境命名空間
命名空間管理 -
多環(huán)境配置支持
基于spring.profile.active尸执,增加應(yīng)用的多環(huán)境配置支持,不同環(huán)境配置對(duì)應(yīng)的Nacos命名空間缓醋,根據(jù)應(yīng)用啟動(dòng)的環(huán)境變量參數(shù)自動(dòng)識(shí)別對(duì)應(yīng)的Nacos配置
多環(huán)境支持
# dev配置
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.128.20
namespace: 1c53b59e-9f3d-44a4-b2d7-5faaea25b3c6 # dev 環(huán)境的命名空間
ip: 192.168.128.20
config:
server-addr: 192.168.128.20
file-extension: yml
group: ds-user-center-server
namespace: 1c53b59e-9f3d-44a4-b2d7-5faaea25b3c6 # dev 環(huán)境的命名空間
shared-configs:
- data-id: mqclient-config-share.yml
group: MQCLIENT_GROUP
refresh: true
extension-configs:
- data-id: global-public-share.yml
group: share
refresh: true
- data-id: resource-service-public-share.yml
group: share
refresh: true
test如失、qa、prod配置類似送粱。
3.2 Nacos自定義配置
Nacos除了支持file-extension模式的data-id.yml或data-id.properties的配置外褪贵, 自0.2.1版本以后還支持自定義的data-id的配置。目前主要支持shared-configs模式和extension-configs模式抗俄,配置示例:
shared-configs:
- data-id: mqclient-config-share.yml
group: MQCLIENT_GROUP
refresh: true
extension-configs:
- data-id: global-public-share.yml
group: share
refresh: true
- data-id: resource-service-public-share.yml
group: share
refresh: true
3.2.1 配置優(yōu)先級(jí)
綜上脆丁,Spring Cloud Alibaba Nacos Config 提供了三種配置能力從 Nacos 拉取相關(guān)的配置。
A: 通過(guò) spring.cloud.nacos.config.shared-configs[n].data-id 支持多個(gè)共享 Data Id 的配置
B: 通過(guò) spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多個(gè)擴(kuò)展 Data Id 的配置
C: 通過(guò)內(nèi)部相關(guān)規(guī)則(應(yīng)用名动雹、應(yīng)用名+ Profile )自動(dòng)生成相關(guān)的 Data Id 配置
當(dāng)三種方式共同使用時(shí)槽卫,他們的一個(gè)優(yōu)先級(jí)關(guān)系是:A < B < C
Nacos-config
3.3 Nacos配置灰度發(fā)布
Nacos 1.1.0版本以后,支持灰度配置胰蝠。Nacos配置的灰度發(fā)布是基于Nacos配置中心Beta發(fā)布功能進(jìn)行實(shí)現(xiàn)歼培,默認(rèn)不勾選該功能震蒋。
灰度配置流程如下:
- 預(yù)備同一應(yīng)用兩個(gè)節(jié)點(diǎn):
192.168.132.49
192.168.128.20
- 在Nacos配置中心執(zhí)行Beta發(fā)布,指定只發(fā)布到49節(jié)點(diǎn)機(jī)器丐怯,將配置suffixurl 和 shortSuffixurl
suffixurl: http://%s.easymall-dev01.com
shortSuffixurl: all.easymall-dev01.com
灰度發(fā)布
查看日志,可以驗(yàn)證到49機(jī)器配置發(fā)布生效:
而20機(jī)器翔横,無(wú)任何反應(yīng)读跷,說(shuō)明配置未發(fā)布到20:
進(jìn)一步通過(guò)接口驗(yàn)證灰度發(fā)布是否生效,可以看到49發(fā)布的配置已經(jīng)生效禾唁,而20機(jī)器接口仍是灰度發(fā)布前配置內(nèi)容效览。
灰度驗(yàn)證通過(guò)后,關(guān)閉灰度荡短,將配置正式發(fā)布丐枉,再次驗(yàn)證20機(jī)器接口,可以發(fā)現(xiàn)配置也生效
3.4 基于Nacos元數(shù)據(jù)實(shí)現(xiàn)Spring Cloud 微服務(wù)灰度發(fā)布實(shí)踐
應(yīng)用迭代過(guò)程中會(huì)不斷有新版本API發(fā)布掘托,在新版本正式發(fā)布前瘦锹,可以使用灰度流量控制先進(jìn)行小規(guī)模驗(yàn)證,將升級(jí)帶來(lái)的影響限定在指定的用戶范圍內(nèi)可以最大程度上保障線上業(yè)務(wù)的穩(wěn)定運(yùn)行闪盔,通過(guò)收集使用體驗(yàn)的數(shù)據(jù)弯院,對(duì)應(yīng)用新版本的功能、性能泪掀、穩(wěn)定性等指標(biāo)進(jìn)行評(píng)判听绳,然后再全量升級(jí)。
這里主要參考了Nepxion 灰度框架异赫。
3.4.1 調(diào)用鏈分析
外部調(diào)用
web請(qǐng)求 ==> Gateway ==> 服務(wù)
GateWay 轉(zhuǎn)發(fā)請(qǐng)求時(shí)椅挣,會(huì)根據(jù)Ribbon(目前采用輪詢策略)從服務(wù)實(shí)例選擇對(duì)應(yīng)服務(wù)進(jìn)行轉(zhuǎn)發(fā)
內(nèi)部調(diào)用
請(qǐng)求 ==> Feign調(diào)用==> 服務(wù)
目前內(nèi)部服務(wù)間調(diào)用沒(méi)有經(jīng)過(guò)網(wǎng)關(guān),而是直接根據(jù)Ribbon(目前采用輪詢策略)從服務(wù)實(shí)例選擇對(duì)應(yīng)服務(wù)進(jìn)行接口調(diào)用塔拳。
3.4.2 預(yù)備知識(shí)
Nacos元數(shù)據(jù)
Nacos數(shù)據(jù)(如配置和服務(wù))描述信息鼠证,如服務(wù)版本、權(quán)重靠抑、容災(zāi)策略名惩、負(fù)載均衡策略、鑒權(quán)配置孕荠、各種自定義標(biāo)簽 (label)娩鹉,從作用范圍來(lái)看,分為服務(wù)級(jí)別的元信息稚伍、集群的元信息及實(shí)例的元信息弯予。
設(shè)置Nacos元數(shù)據(jù)
# Nacos config for qt
spring.cloud.nacos.discovery.metadata.group=qt-service-group #定義所屬組,也可以通過(guò)服務(wù)名前綴來(lái)自動(dòng)產(chǎn)生服務(wù)組名
spring.cloud.nacos.discovery.metadata.version=1.0 #定義版本號(hào) 也可以通過(guò)Git插件方式自動(dòng)產(chǎn)生版本號(hào)
spring.cloud.nacos.discovery.metadata.region=dev 定義區(qū)域
spring.cloud.nacos.discovery.metadata.env=env1 定義環(huán)境
spring.cloud.nacos.discovery.metadata.zone=zone1 #定義所屬可用區(qū)
3.4.3 實(shí)現(xiàn)方案
實(shí)現(xiàn)思路
- 根據(jù)應(yīng)用注冊(cè)的實(shí)例元數(shù)據(jù)來(lái)實(shí)現(xiàn)灰度个曙,比如選擇version來(lái)標(biāo)記灰度版本:
spring.cloud.nacos.discovery.metadata.version=1.1
- 基于網(wǎng)關(guān)為灰度觸點(diǎn)锈嫩,自定義Gate Way Filter, 實(shí)現(xiàn)從Spring Cloud Gateway發(fā)起的調(diào)用都走版本為x.x的服務(wù)或者Spring Cloud Gateway發(fā)起的調(diào)用按照配置的的灰度策略受楼,如A:1.1 ==> 網(wǎng)關(guān) B:1.2 ==> 網(wǎng)關(guān)==>C:1.3。
- 基于Ribbon權(quán)重負(fù)責(zé)均衡呼寸,實(shí)現(xiàn)從Spring Cloud Gateway發(fā)起的調(diào)用1.0版本流量調(diào)用為90%艳汽,1.1流量調(diào)用為10%
元數(shù)據(jù)動(dòng)態(tài)指定
外部系統(tǒng)(例如:運(yùn)維發(fā)布平臺(tái))在遠(yuǎn)程啟動(dòng)微服務(wù)的時(shí)候,可以通過(guò)參數(shù)傳遞來(lái)動(dòng)態(tài)改變?cè)獢?shù)據(jù)或者增加運(yùn)維特色的參數(shù)对雪,最后注冊(cè)到遠(yuǎn)程配置中心河狐。有如下兩種方式
- 通過(guò)Program arguments來(lái)傳遞,它的用法是前面加“--”瑟捣,支持Nacos的增量覆蓋馋艺。例如:
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=1100 --spring.cloud.nacos.discovery.metadata.version=1.0"
- 通過(guò)VM arguments來(lái)傳遞,它的用法是前面加“-D”迈套。推薦使用該方式捐祠。例如:-Dmetadata.version=1.0
- 兩種方式盡量避免同時(shí)用
實(shí)現(xiàn)流程
實(shí)現(xiàn)場(chǎng)景
通過(guò)外部參數(shù)動(dòng)態(tài)指定A、B桑李、C服務(wù)灰度版本為2.0踱蛀。
基于Header傳遞的灰度路由模式,通過(guò)http工具贵白,傳遞Http Header星岗,比如version=2.0,網(wǎng)關(guān)根據(jù)header動(dòng)態(tài)路由到灰度服務(wù)戒洼,而不帶header的依舊請(qǐng)求到初始版本俏橘。
前后端灰度,當(dāng)前端(例如:APP)和后端微服務(wù)同時(shí)存在多個(gè)版本時(shí)圈浇,可以采用“前端灰度&網(wǎng)關(guān)灰度路由組合式策略”寥掐,前端調(diào)用網(wǎng)關(guān)時(shí),傳入前端app版本號(hào)磷蜀,網(wǎng)關(guān)根據(jù)路由策略召耘,路由要相關(guān)的灰度服務(wù)。
- APP v1.0 -> 網(wǎng)關(guān) -> A服務(wù) v1.0 -> B服務(wù) v1.0
- APP v1.1 -> 網(wǎng)關(guān) -> A服務(wù) v1.1 -> B服務(wù) v1.1
- 基于Nacos配置中心的全局訂閱的灰度策略褐隆,基于header的灰度策略污它,在全鏈路下,實(shí)現(xiàn)可能比較復(fù)雜庶弃,Nacos全局訂閱實(shí)現(xiàn)方式提供了簡(jiǎn)單的方式規(guī)避了header傳遞衫贬。
3.4.4 主要的功能點(diǎn)
- Nacos服務(wù)實(shí)例元數(shù)據(jù)相關(guān),支持從外部參數(shù)動(dòng)態(tài)獲取元數(shù)據(jù)歇攻。
- 自定義網(wǎng)關(guān)Filter固惯,實(shí)現(xiàn)請(qǐng)求header偵測(cè),灰度路由解析缴守、灰度動(dòng)態(tài)路由等功能
- 自定義Ribbon負(fù)載均衡策略葬毫,實(shí)現(xiàn)灰度流量控制策略