1 什么是Nacos
官方:一個更易於構建雲原生應用的動態服務發現(Nacos Discovery)、配置管理(Nacos Config)和服務管理平台。
集注冊中心+配置中心+服務管理平台
Nacos 的關鍵特性包括:
-
服務發現和服務健康監測
Nacos 支持基於 DNS 和基於 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的Agent TODO注冊 Service 后,服務消費者可以使用DNS TODO 或HTTP&API查找和發現服務。
Nacos 提供對服務的實時的健康檢查,阻止向不健康的主機或服務實例發送請求。Nacos 支持傳輸層 (PING 或 TCP)和應用層 (如 HTTP、MySQL、用戶自定義)的健康檢查。 對於復雜的雲環境和網絡拓撲環境中(如 VPC、邊緣網絡等)服務的健康檢查,Nacos 提供了 agent 上報模式和服務端主動檢測2種健康檢查模式。Nacos 還提供了統一的健康檢查儀表盤,幫助您根據健康狀態管理服務的可用性及流量。
-
動態配置服務
動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。
動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。
配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。
Nacos 提供了一個簡潔易用的UI (控制台樣例 Demo) 幫助您管理所有的服務和應用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀發布、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,幫助您更安全地在生產環境中管理配置變更和降低配置變更帶來的風險。
-
動態 DNS 服務
動態 DNS 服務支持權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及數據中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以 DNS 協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。
Nacos 提供了一些簡單的 DNS APIs TODO 幫助您管理服務的關聯域名和可用的 IP:PORT 列表.
-
服務及其元數據管理
Nacos 能讓您從微服務平台建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命周期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計數據。
2 Nacos注冊中心
2.1 注冊中心的演變及其設計思想
2.2 Nacos注冊中心架構
2.3 核心功能
服務注冊:Nacos Client會通過發送REST請求的方式向Nacos Server注冊自己的服務,提供自身的元數據,比如ip地址、端口等信息。Nacos Server接收到注冊請求后,就會把這些元數據信息存儲在一個雙層的內存Map中。
服務心跳:在服務注冊后,Nacos Client會維護一個定時心跳來持續通知Nacos Server,說明服務一直處於可用狀態,防止被剔除。默認5s發送一次心跳。
服務同步:Nacos Server集群之間會互相同步服務實例,用來保證服務信息的一致性。 leader raft
服務發現:服務消費者(Nacos Client)在調用服務提供者的服務時,會發送一個REST請求給Nacos Server,獲取上面注冊的服務清單,並且緩存在Nacos Client本地,同時會在Nacos Client本地開啟一個定時任務定時拉取服務端最新的注冊表信息更新到本地緩存
服務健康檢查:Nacos Server會開啟一個定時任務用來檢查注冊服務實例的健康情況,對於超過15s沒有收到客戶端心跳的實例會將它的healthy屬性置為false(客戶端服務發現時不會發現),如果某個實例超過30秒沒有收到心跳,直接剔除該實例(被剔除的實例如果恢復發送心跳則會重新注冊)
主流的注冊中心
C : 數據一致性
A : 可用性
P : 分區容錯性
組件名 | 語言 | CAP | 對外暴露接口 |
---|---|---|---|
Zookeeper | Java | CP | 客戶端 |
Eureka | Java | AP (自我保護機制,保證高可用) | HTTP |
Consul | Go | CP | HTTP/DNS |
Nacos | Java | 支持 AP/CP 切換 | HTTP |
2.4 管理界面介紹
命名空間
用於進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
服務列表
服務:通過預定義接口網絡訪問的提供給客戶端的軟件功能。
服務名:服務提供的標識,通過該標識可以唯一確定其指代的服務。
服務分組:不同的服務可以歸類到同一分組。
保護閾值
作用:雪崩保護
為了防止因過多實例 (Instance) 不健康導致流量全部流向健康實例 (Instance) ,繼而造成流量壓力把健康實例 (Instance) 壓垮並形成雪崩效應,應將健康保護閾值定義為一個 0 到 1 之間的浮點數。當域名健康實例數 (Instance) 占總服務實例數 (Instance) 的比例小於該值時,無論實例 (Instance) 是否健康,都會將這個實例 (Instance) 返回給客戶端。這樣做雖然損失了一部分流量,但是保證了集群中剩余健康實例 (Instance) 能正常工作。
上圖中的臨時實例:spring.cloud.nacos.discovery.ephermeral=false,當服務宕機了也不會從服務列表中提出
健康實例、不健康實例:健康實例/總實例 < 保護閾值
權重
實例級別的配置。權重為浮點數。權重越大,分配給該實例的流量越大。
Nacos 為用戶提供了流量權重控制的能力,同時開放了服務流量的閾值保護,以幫助用戶更好的保護服務服務提供者集群不被意外打垮。如下圖所以,可以點擊實例的編輯按鈕,修改實例的權重。如果想增加實例的流量,可以將權重調大,如果不想實例接收流量,則可以將權重設為0。
元數據
Nacos提供多個維度的服務元數據的暴露,幫助用戶存儲自定義的信息。這些信息都是以K-V的數據結構存儲,在控制台上,會以k1=v1,k2=v2這樣的格式展示。類似的,編輯元數據可以通過相同的格式進行。例如服務的元數據編輯,首先點擊服務詳情頁右上角的“編輯服務”按鈕,然后在元數據輸入框輸入:version=1.0,env=prod。
3. Nacos Server部署
下載源碼編譯
源碼下載地址:https://github.com/alibaba/nacos
下載安裝包
下載地址:https://github.com/alibaba/nacos/releases/
3.1 單機模式
官方文檔:https://nacos.io/zh-cn/docs/deployment.html
解壓進入到nacos目錄
單機啟動nacos,執行命令:
./startup.sh -m standalone
也可以修改默認啟動方式:
export MODE="standalone"
訪問nacos的管理端:http://localhost:8848/nacos/#/login,默認的用戶名密碼是nacos/nacos
3.2 集群模式
集群模式部署
這個快速開始手冊是幫忙您快速在你的電腦上,下載安裝並使用Nacos,部署生產使用的集群模式。
集群部署架構圖
因此開源的時候推薦用戶把所有服務列表放到一個vip下面,然后掛到一個域名下面
http://ip1:port/openAPI 直連ip模式,機器掛則需要修改ip才可以使用。
http://SLB:port/openAPI 掛載SLB模式(內網SLB,不可暴露到公網,以免帶來安全風險),直連SLB即可,下面掛server真實ip,可讀性不好。
http://nacos.com:port/openAPI 域名 + SLB模式(內網SLB,不可暴露到公網,以免帶來安全風險),可讀性好,而且換ip方便,推薦模式
1. 預備環境准備
請確保是在環境中安裝使用:
- 64 bit OS Linux/Unix/Mac,推薦使用Linux系統。
- 64 bit JDK 1.8+;下載.配置。
- Maven 3.2.x+;下載.配置。
- 3個或3個以上Nacos節點才能構成集群。
2. 下載源碼或者安裝包
你可以通過兩種方式來獲取 Nacos。
從 Github 上下載源碼方式
unzip nacos-source.zip
cd nacos/
mvn -Prelease-nacos clean install -U
cd nacos/distribution/target/nacos-server-1.3.0/nacos/bin
下載編譯后壓縮包方式
下載地址
unzip nacos-server-1.3.0.zip 或者 tar -xvf nacos-server-1.3.0.tar.gz
cd nacos/bin
3. 配置集群配置文件
在nacos的解壓目錄nacos/的conf目錄下,有配置文件cluster.conf,請每行配置成ip:port。(請配置3個或3個以上節點)
# ip:port
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848
4. 確定數據源
使用內置數據源
無需進行任何配置
使用外置數據源
生產使用建議至少主備模式,或者采用高可用數據庫。
初始化 MySQL 數據庫
application.properties 配置
5. 啟動服務器
Linux/Unix/Mac
Stand-alone mode
sh startup.sh -m standalone
集群模式
使用內置數據源
sh startup.sh -p embedded
使用外置數據源
sh startup.sh
6. 服務注冊&發現和配置管理
服務注冊
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服務發現
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
發布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"
獲取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
7. 關閉服務器
Linux/Unix/Mac
sh shutdown.sh
4 Nacos Client搭建
4.2 搭建Nacos-client服務
1)引入依賴
父POM中支持Spring Cloud & Spring Cloud Alibaba,引入依賴
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
<spring.cloud.dependencies.version>Hoxton.SR9</spring.cloud.dependencies.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.dependencies.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
當前項目pom中引入依賴
<!-- nacos服務注冊發現 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件修改
#應用名稱(nacos會將該名稱當作服務名稱)
spring:
application:
name: order-service
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
namespace: public
啟動項目,從日志中發現已經注冊完成
2021-11-11 22:24:29.673 INFO 82966 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP order-service 192.168.31.41:8011 register finished
調用測試
此時調用的時候不需要再使用ip地址,可以直接使用服務名稱進行調用
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/add")
public String add() {
System.out.println("下單成功");
String msg = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
return MessageFormat.format("下單成功: {0}", msg);
}
}
⚠️注意:需要加上@LoadBalanced
注解
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
可以發現能夠通過服務名調用成功
配置參數
更多配置:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
更多關於 spring-cloud-starter-alibaba-nacos-discovery 的 starter 配置項如下所示:
配置項 | Key | 默認值 | 說明 |
---|---|---|---|
服務端地址 |
spring.cloud.nacos.discovery.server-addr |
無 |
Nacos Server 啟動監聽的ip地址和端口 |
服務名 |
spring.cloud.nacos.discovery.service |
${spring.application.name} |
給當前的服務命名 |
服務分組 |
spring.cloud.nacos.discovery.group |
DEFAULT_GROUP |
設置服務所處的分組 |
權重 |
spring.cloud.nacos.discovery.weight |
1 |
取值范圍 1 到 100,數值越大,權重越大 |
網卡名 |
spring.cloud.nacos.discovery.network-interface |
無 |
當IP未配置時,注冊的IP為此網卡所對應的IP地址,如果此項也未配置,則默認取第一塊網卡的地址 |
注冊的IP地址 |
spring.cloud.nacos.discovery.ip |
無 |
優先級最高 |
注冊的端口 |
spring.cloud.nacos.discovery.port |
-1 |
默認情況下不用配置,會自動探測 |
命名空間 |
spring.cloud.nacos.discovery.namespace |
無 |
常用場景之一是不同環境的注冊的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。 |
AccessKey |
spring.cloud.nacos.discovery.access-key |
無 |
當要上阿里雲時,阿里雲上面的一個雲賬號名 |
SecretKey |
spring.cloud.nacos.discovery.secret-key |
無 |
當要上阿里雲時,阿里雲上面的一個雲賬號密碼 |
Metadata |
spring.cloud.nacos.discovery.metadata |
無 |
使用Map格式配置,用戶可以根據自己的需要自定義一些和服務相關的元數據信息 |
日志文件名 |
spring.cloud.nacos.discovery.log-name |
無 |
|
集群 |
spring.cloud.nacos.discovery.cluster-name |
DEFAULT |
配置成Nacos集群名稱 |
接入點 |
spring.cloud.nacos.discovery.enpoint |
UTF-8 |
地域的某個服務的入口域名,通過此域名可以動態地拿到服務端地址 |
是否集成Ribbon |
ribbon.nacos.enabled |
true |
一般都設置成true即可 |
是否開啟Nacos Watch |
spring.cloud.nacos.discovery.watch.enabled |
true |
可以設置成false來關閉 watch |
4.3 Nacos注冊中心架構
默認的負載均衡方式為輪詢