文章目錄
1.簡介
為什么叫Nacos
前四個字母分別為Naming和Configuration的前兩個字母,最后的s為Service.
是什么
Nacos= Eureka +Config + Bus
功能
替代Eureka做服務注冊中心
替代Config做服務配置中心
官網
https://nacos.io/zh-cn/docs/what-is-nacos.html
下載地址:https://github.com/alibaba/nacos/releases
注冊中心對比

據說Nacolp在阿里巴巴內部有超過10萬的實例運行,已經過了類似雙十一等各種大型流量的考驗
安裝及運行

2.nacos作為服務注冊中心
和eureka和zookeeper類似如果要使用nacos注冊中心只需要在yml配置文件中進行配置即可。
1.nacos作為服務提供者
建立9001項目
- 建項目
項目名稱:cloudalibaba-provider-payment9001 - 寫pom
- 寫yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 暴露端口,方便監控服務
management:
endpoints:
web:
exposure:
include: "*"
- 主啟動
- 業務類
controller
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registry, serverPort: " + serverPort + "\t id" + id;
}
}
簡單的程序只輸出其端口
測試
啟動nacos和83項目,訪問http://localhost:8848/nacos

已經注冊入nacos
訪問http://localhost:9001/payment/nacos/3

可以正常訪問服務提供者搭建成功。
為了演示nacos的負載均衡功能參照9001,新建9002
2.nacos作為服務消費者替代Eureka
下面開始nacos作為服務中心項目的建立
建項目
若部分代碼沒有給出,請在遠程倉庫https://gitee.com/gyhdx/cloud2020查找
-
新建項目
項目名稱:cloudalibaba-consumer-nacos-Order83 -
寫pom
-
寫yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 不在項目啟動中起作用,僅作為一個公有配置,方便項目中使用
service-url:
nacos-user-service: http://nacos-payment-provider
- 主啟動
NacosConsumerMain83.class類 - 業務類
config
package wf.springcloudalibaba.config;
/** * @Description TODO * @Author gyhdx * @Date 2020/4/25 21:46 */
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemple(){
return new RestTemplate();
}
}
controller
package wf.springcloudalibaba.controller;
/** * @Description TODO * @Author gyhdx * @Date 2020/4/25 21:48 */
@RestController
@Slf4j
public class NacosController {
@Resource
private RestTemplate restTemplate;
//獲取yml中的相關配置值
@Value("${service-url.nacos-user-service}")
private String path;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
return restTemplate.getForObject(path+"/payment/nacos/"+id,String.class);
}
}
測試
啟動nacos和83項目,訪問http://localhost:8848/nacos

訪問http://localhost:83/consumer/payment/nacos/3
第一次訪問
刷新頁面
實現了輪詢訪問服務提供者,證明Nacos負載均衡起作用
nacos中的負載均衡

可以看到nacos依賴中已經自帶了負載均衡Ribbon。
3.nacos作為配置中心替代Config
nacos的cap


Nacos支持AP和CP模式的切換
C是所有節點在同一時間看到的數據是一致的; 而A的定義是所有的請求都會收到響應。
何時選擇使用何種模式?
一般來說,
如果不需要存儲服務級別的信息且服務實例是通過nacos- client注冊,並能夠保持心跳上報,那么就可以選擇AP模式。當前主流的服務如Spring cloud和Dubbo服務,都適用於AP模式,AP模式為了服務的可能性而減弱了一致性, 因此AP模式下只支持注冊臨時實例。
如果需要在服務級別編輯或者存儲配置信息,那么CP是必須,K8S服務和DNS服務則適用於CP模式。
CP模式下則支持注冊持久化實例,此時則是以Raft協議為集群運行模式,該模式下注冊實例之前必須先注冊服務,如果服務不存在,則會返回錯誤。
可以通過cmd執行
curl -XPUT ‘$NACOS_ SERVER:8848/nacos/v1/ns/operator/switches?ntry=serverMode&value=CP’
來實現nacos的CP模式切換
1.代碼演示nacos配置中心功能
新建項目
- 建項目
項目名稱:cloudalibaba-config-nacos-client3377 - 寫pom
- 寫yml
因為Nacos同springcloud-config一樣,在項目初始化時,要保證先叢配置中心進行配置拉取,
拉取配置之后,才能保證項目的正常啟動。springboot中配置文件的加載是存在優先級順序的,bootstrap優先級高於application
bootstrap.yml
此次先使用這的配置,不然直接使用倉庫中的會出問題
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
application.yml
該yml是為了支持DataId方案的開發
spring:
profiles:
# active: test
active: dev
- 主啟動
- 業務類
controller
@RestController
@RefreshScope
public class NacosController {
@Value("${config.info}")
String value;
@GetMapping(value = "/config/nacos/info")
public String info(){
return value;
}
}
注意在controller中@RefreshScope注解必須配置,為了實現動態刷新功能(Nacos的配置中心,配置發生改變,服務能感知到這種變化)
在nacos中添加配置信息
nacos中的匹配規則理論
Nacos中的dataid的組成格式及與SpringBoot配置文件中的匹配規則

簡單來說就是

故按照我們在項目中yml的配置,改目標Data Id為nacos-config-client-dev.yaml
在nacos中添加配置

配置完成下拉,點擊發布即可

配置成功后:

測試
啟動3377項目,訪問http://localhost:3377/config/nacos/info

配置成功。
點擊編輯修改配置

刷新http://localhost:3377/config/nacos/info

可以看到改變了,這就是上面yml的端口開放實現監控和@RefreshScope共同起作用。
2.Nacos的分類配置
多環境多項目的問題
- 問題1:
實際開發中,通常一個系統會准備
dev開發環境
test測試環境
prod生產環境。
如何保證指定環境啟動時服務能正確讀取到Nacos.上相應環境的配置文件呢? - 問題2:
一個大型分布式微服務系統會有很多微服務子項目,
每個微服務項目又都會有相應的開發環境、測試環境、預發環境、正式環境…
那怎么對這些微服務配置進行管理呢?
nacos的圖形化管理界面
- 配置管理

- 命名空間

Namespace+ Group+Data ID3者關系?為什么這么設計?
- 是什么
類似Java里面的package名和類名
最外層的namespace是可以用於區分部署環境的,Group和DatalD邏輯 上區分兩個目標對象。 - 三者關系

默認情況:
Namespace=public, Group=DEFAULT GROUP,默認Cluster是DEFAULT
Nacos默認的命名空間是public, Namespace主要用來實現隔離。
比方說我們現在有三個環境:開發、測試、生產環境,我們就可以創建三三個Namespace,不同的Namespace之間是隔離的。
Group默認是DEFAULT_ GROUP, Group可以把不同的微服務划分到同一個分組里面去
Service就是微服務;一個Service可以包含多個Cluster (集群),Nacos默認Cluster是DEFAULT, Cluster是對指定微服務的一個虛擬划分。
比方說為了容災,將Service微服務分別部署在了杭州機房和廣州機房,
這時就可以給杭州機房的Service微服務起一個集群名稱(HZ),
給廣州機房的Service微服務起一個集群名稱 (GZ) ,還可以盡量讓同一個機房的微服務互相調用,以提升性能。
最后是Instance,就是微服務的實例。
3.三種方案加載配置
DataId方案
指定spring.profile.active和配置文件的DatalD來使不同環境下讀取不同的配置
默認空間+默認分組+新建dev和test兩個DatalD
- 新建dev配置DatalD
nacos-config-client-dev.yaml - 新建test配置DatalD
nacos-config-client-test.yaml

我們開始配置的application.yml中為dev,此時修改為test

訪問http://localhost:3377/config/nacos/info

可以看到,該方案起作用了。
Group方案
通過group實現環境區分

在新建時直接修改Group即可

想讓項目成功訪問,需要在bootstrap.yml中修改一下配置

重啟項目,成功訪問http://localhost:3377/config/nacos/info

注意此處瀏覽器顯示的內容為nacos中配置的

是通過controller獲取

具體規則

namespace方案

可以自定義命名空間的名稱、描述和ID,新建dev(開發)、test(測試)兩個命名空間。
回到配置列表查看

在dev命名空間新建配置

然后,對項目的bootstrap.yml文件進行修改


此處我的命名空間為dev,group為DEV_GROUP,active環境為dev,說明訪問的是

重啟項目,成功訪問http://localhost:3377/config/nacos/info

namespace方案使用成功。
3.nacos集群架構說明
1.集群模式部署
這個快速開始手冊是幫忙您快速在你的電腦上,下載安裝並使用Nacos,部署生產使用的集群模式。
集群部署架構圖
因此開源的時候推薦用戶把所有服務列表放到一個vip下面,然后掛到一個域名下面
http://ip1:port/openAPI 直連ip模式,機器掛則需要修改ip才可以使用。
http://VIP:port/openAPI 掛載VIP模式,直連vip即可,下面掛server真實ip,可讀性不好。
http://nacos.com:port/openAPI 域名 + VIP模式,可讀性好,而且換ip方便,推薦模式

注意:VIP=virtue ip(虛擬ip,用來在集群環境映射Nacos的真實ip)


實現上述架構的一種方案

Nacos支持三種部署模式
單機模式 - 用於測試和單機試用。
集群模式 - 用於生產環境,確保高可用。
多集群模式 - 用於多數據中心場景。
2.nacos持久化
因為nacos具備注冊中心的功能,以及支持cp故nacos需要數據的持久化。
默認Nacos使用嵌入式數據庫實現數據的存儲。所以,如果啟動多個默認配置下的Nacos節點,數據存儲是存在一致性問題的。
為了解決這個問題,Nacos采用了集中式存儲的方式來支持集群化部署,目前只支持MySQL的存儲。
Nacos默認自帶的是嵌入式數據庫derby

