Nacos服務注冊和配置中心
- 一、Nacos簡介
- 二、安裝并運作Nacos
- 三、Nacos作為服務注冊中心示範
-
- 1、基于Nacos的服務提供者
- 2、基于Nacos的服務消費者
- 3、服務注冊中心對比
- 四、Nacos作為服務配置中心示範
-
- 1、基礎配置
- 2、分類配置
-
- ①、DataID方案
- ②、Group方案
- ③、Namespace方案
一、Nacos簡介
Nacos:
前四個字母分别是 Naming和Configuration的前兩個字母,最後的s是Service。
一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台。
Nacos:Dynamic Naming and Configuration Service
Nacos就是注冊中心 + 配置中心的組合
等價于: Nacos = Eureka + Config + Bus
官網: https://github.com/alibaba/Nacos
各注冊中心比較:
服務注冊與發現架構 | CPA 模型 | 控制台管理 | 社群活躍度 |
---|---|---|---|
Eureka | AP | 支援 | 底(2.X 版本閉源) |
Zookeeper | CP | 不支援 | 中 |
Consul | CP | 支援 | 高 |
Nacos | AP(同時也支援CP) | 支援 | 高 |
- C:Consistency(強一緻性)
- A:Available(可用性)
- P:Partition tolerance(分區容錯性)
據說Nacos在阿裡巴巴内部有超過10萬的執行個體運作,已經過了類似雙十一等各種大型流量的考驗
二、安裝并運作Nacos
本地有 java8+ Maven環境
官網下載下傳網址: https://github.com/alibaba/nacos/tags
下載下傳本地并解壓檔案
目錄結構
進入bin目錄,啟動startup.sh
浏覽器通路: http://localhost:8848/nacos
進入頁面
三、Nacos作為服務注冊中心示範
父pom檔案依賴:
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
1、基于Nacos的服務提供者
建立Module: cloudalibaba-provider-payment-9001作為服務提供方微服務
pom檔案添加nacos依賴:
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml檔案配置:
server:
port: 9001
spring:
application:
name: nacos-payment-provider # 微服務名稱
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 配置Nacos位址
# 暴露監控端點 ‘*’ 全部打開
management:
endpoints:
web:
exposure:
include: '*'
啟動類:添加@EnableDiscoveryClient 使微服務能夠被注冊中心發現
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
控制層:
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "alibaba nacos, serverPort:" + serverPort + ", id:" + id;
}
}
先啟動nacos,啟動9001
在nacos控制台的服務清單可以發現nacos-payment-provider已被注冊進去了
請求: http://localhost:9001/payment/nacos/2
怎麼建立虛拟端口映射
在PaymentMain9001啟動後拷貝
name: PaymentMain9011 CopyOf 9001 (命名啟動類)
VM options: -DServer.port=9011 (設定端口号)
服務出現映射啟動類
啟動:PaymentMain9011 CopyOf 9001
檢視nacos面闆:
請求: http://localhost:9011/payment/nacos/2
參考 cloudalibaba-provider-payment-9001建立Module:cloudalibaba-provider-payment-9002作為服務提供方微服務
啟動9002:
2、基于Nacos的服務消費者
建立Module:cloudalibaba-consumer-nacos-order-83作為服務消費方微服務
pom檔案添加nacos依賴:
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml檔案配置:
server:
port: 83
spring:
application:
name: nacos-order-cosumer # 微服務名稱
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 配置Nacos位址
# 消費者将要去通路的微服務名稱(注冊成功進的nacos的微服務提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
啟動類:
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
RestTemplate配置類:添加@LoadBalanced注解實作負載均衡
package com.zzp.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author zzp
* @create
*/
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
控制類:
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id,String.class);
}
}
@Value("${service-url.nacos-user-service}")
private String serverUrl;
讀取yml配置檔案的位址
啟動83服務:
請求測試:http://localhost:83/consumer/payment/nacos/2
83通路9001/9002,實作負載均衡ok
nacos依賴包自帶ribbbon負載均衡
3、服務注冊中心對比
Nacos全景圖
Nacos和CAP
事實上,Nacos可以AP模式和CP模式中進行切換,也就是說Nacos不僅僅支援AP(可用性和分區容錯性),它同樣支援CP(一緻性和分區容錯性)。
切換
Nacos支援AP和PC模式切換
C是所有節點在同一時間看到的資料是一緻的,而A是所有的請求都會受到響應(A可以了解為高可用)。
一般來說,
如果不需要存儲服務級别的資訊且服務執行個體是通過nacos-client注冊的,并且能保持心跳上報,那麼就可以選擇AP模式。目前主流的服務如 Spring Cloud 和 Dubbo 服務,都适用于AP模式,AP模式為了服務的可能性而減弱了一緻性,是以AP模式下隻支援注冊臨時執行個體。
如果需要在服務級别編輯或者存儲配置資訊,那麼 CP 是必須的,K8s服務和DNS服務則适用于CP模式。
CP模式下則支援注冊持久化執行個體,此時則是以 Raft 協定為叢集運作模式,該模式下注冊執行個體之前必須先注冊服務,如果服務不存在,則會傳回錯誤。
如果需要讓Nacos服務從AP模式切換到CP模式的話,隻需要向服務注冊中心發送POST請求即可
curl -X PUT ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’
四、Nacos作為服務配置中心示範
1、基礎配置
建立Module:cloudalibaba-config-nacos-client-3377作為服務配置中心的微服務
pom檔案添加nacos-config依賴
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
添加兩個配置檔案:bootstrap.yml (從配置中心拉取配置) 和 application.yml (寫自己的配置)
Nacos同springcloud-config一樣,在項目初始化時,要保證先從配置中心進行拉取,來取配置之後,才能保證項目的正常啟動。
springboot中配置檔案的加載是存在優先級順序的,bootstrap優先級高于application
我們配置 bootstrap.yml 以使3377服務從Nacos上拉取配置資訊:
bootstrap.yml
# Nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos服務注冊中心位址
config:
server-addr: 127.0.0.1:8848 # Nacos服務配置中心位址
file-extension: yaml # 指定yaml格式的配置
# ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# nacos配置檔案名: nacos-config-client-dev.yaml
application.yml
spring:
profiles:
active: dev # 表示開發環境
表示在注冊nacos注冊中心并拉取開發環境的配置檔案資訊
啟動類:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClinetMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClinetMain3377.class, args);
}
}
控制類,添加注解@RefreshScope(通過 spring cloud 原生注解
@RefreshScope
實作配置自動更新)
@RestController
@RefreshScope //支援Nacos的動态重新整理功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
在Nacos控制台添加配置資訊:
Nacos中的比對規則
Nacos中的dataId的組成格式及與SpringBoot配置檔案中的比對規則
檢視官網文檔配置資訊: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
-
預設為prefix
的值,也可以通過配置項spring.application.name
來配置。spring.cloud.nacos.config.prefix
-
即為目前環境對應的spring.profiles.active
,詳情可以參考 Spring Boot文檔。 注意:當profile
為空時,對應的連接配接符 - 也将不存在,dataId 的拼接格式變成spring.profiles.active
${prefix}.${file-extension}
-
為配置内容的資料格式,可以通過配置項file-exetension
來配置。目前隻支援spring.cloud.nacos.config.file-extension
和properties
類型。yaml
最後公式
在nacos界面配置對應的檔案
nacos-config-client-dev.yaml
配置内容:
config:
info: nacos config center, version = 1
查找
配置檔案圖形說明:
啟動3377服務
通路: http://localhost:3377/config/info
自帶的動态重新整理:
修改Nacos中yaml配置檔案,再次調用接口檢視配置資訊,就會發現配置已經更新
請求:
2、分類配置
多環境項目管理
問題1:
實際開發中,通常一個系統會準備
dev開發環境
test測試環境
prod生成環境
如何保證指定環境啟動時服務能夠正确讀取到Nacos上相對應環境的配置檔案?
問題2:
一個大型分布式微服務系統會有很多微服務子項目,
每個微服務項目又都會有相對應的開發環境、測試環境、預發環境、正式環境…
那怎麼對這些微服務配置進行管理?
Nacos的圖形化管理界面
命名空間設計是: Namespace + Group + Data ID
1、是什麼
類似Java裡面的package名和類名
最外層的Namespace 是可以用于區分部署環境的,Group 和 Data ID邏輯上區分兩個目标對象。
2、三者情況
預設情況是:
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微服務起一個叢集名稱(SZ),
給廣州機房的Service微服務也起一個名稱(GZ),還可以盡量讓同一個機房的微服務互相調用,以提升性能。
最後是Instance,就是微服務的執行個體。
三種方案加載配置:
①、DataID方案
指定 spring.profile.active 配置屬性和配置檔案的 dataId 來使不同環境下讀取不同的配置,
也就是說我們現在用預設的命名空間 namespace (即 public),預設的分組 Group (即 DEFAULT_GROUP),然後在Nacos配置中心中建立兩個 分别為 dev 環境和 test 環境 的 DataID
建立dev/test的DataID:
然後通過application.yml配置檔案的 spring.profile.active屬性就能進行多環境下配置檔案的讀取
啟動,測試通路:
再切換到開發模式
啟動,測試通路:
②、Group方案
通過 Group實作環境區分
在Nacos圖形界面控制台上面建立配置檔案DataID
建立Group
DEV_GROUP(開發環境組)
TEST_GROUP(測試環境組)
修改3377微服務的 bootstrap.yml + application.yml 配置檔案進行操作
在bootstrap.yml 配置檔案添加 spring.cloud.nacos.config.group 屬性,設定為響應的組名即可,比如我們現在的 DEV_GROUP(開發環境組)/TEST_GROUP(測試環境組)
重新開機通路:
修改bootstrap.yml 配置檔案group 為DEV_GROUP
重新開機通路:
③、Namespace方案
建立 dev/test 的Namespace空間
建立成功
在配置列界面點dev,添加配置:
檢視dev配置清單:
在添加 dev Group分組
DEV_GROUP組
TEST_GROUP 組
在bootstrap.yml 配置檔案添加 spring.cloud.nacos.config.namespace屬性,設定為我們建立的命名空間id
重新開機通路: