什么是 Nacos?
Nacos 是阿里巴巴推出來的開源項目Spring-Cloud-Alibaba中的一個子項目,這是一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺。
Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。
Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務范式、云原生范式) 的服務基礎設施。
源碼:https://github.com/alibaba/nacos
下載Nacos服務端壓縮包:https://github.com/alibaba/nacos/releases
全景圖:
架構及概念:
服務 (Service)
服務是指一個或一組軟件功能(例如特定信息的檢索或一組操作的執行),其目的是不同的客戶端可以為不同的目的重用(例如通過跨進程的網絡調用)。Nacos 支持主流的服務生態,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
服務注冊中心 (Service Registry)
服務注冊中心,它是服務,其實例及元數據的數據庫。服務實例在啟動時注冊到服務注冊表,并在關閉時注銷。服務和路由器的客戶端查詢服務注冊表以查找服務的可用實例。服務注冊中心可能會調用服務實例的健康檢查 API 來驗證它是否能夠處理請求。
服務元數據 (Service Metadata)
Nacos數據(如配置和服務)描述信息,如服務版本、權重、容災策略、負載均衡策略、鑒權配置、各種自定義標簽 (label),從作用范圍來看,分為服務級別的元信息、集群的元信息及實例的元信息。
服務提供方 (Service Provider)
是指提供可復用和可調用服務的應用方
服務消費方 (Service Consumer)
是指會發起對某個服務調用的應用方
配置 (Configuration)
在系統開發過程中通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理運行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成這個步驟。配置變更是調整系統運行時的行為的有效手段之一。
配置管理 (Configuration Management)
在數據中心中,系統中所有配置的編輯、存儲、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動統稱為配置管理。
名字服務 (Naming Service)
提供分布式系統中所有對象(Object)、實體(Entity)的“名字”到關聯的元數據之間的映射管理服務,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服務發現和 DNS 就是名字服務的2大場景。
配置服務 (Configuration Service)
在服務或者應用運行過程中,提供動態配置或者元數據以及配置管理的服務提供者。
Nacos VS Spring Cloud Eureka
相對于 Spring Cloud Eureka 來說,Nacos 更強大。
Nacos = Spring Cloud Eureka + Spring Cloud Config
Nacos 可以與 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。
通過 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 實現配置的動態變更。
通過 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 實現服務的注冊與發現。
安裝Nacos
配置數據持久化
目前Nacos僅支持Mysql數據庫,且版本要求:5.6.5+
Nacos的數據庫腳本文件在我們下載Nacos-server時的壓縮包中就有
進入nacos-server-1.1.3\nacos\conf目錄,初始化文件:nacos-mysql.sql
此處我創建一個名為 mynacos 的數據庫,然后執行初始化腳本,成功后會生成 11 張表
這里是需要修改Nacos-server的配置文件
Nacos-server其實就是一個Java工程或者說是一個Springboot項目,他的配置文件在nacos-server-1.1.3\nacos\conf目錄下,名為 application.properties,在文件底部添加數據源配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
啟動與關閉服務
#linux平臺
[root@nacos-71 nacos]# /usr/local/nacos/bin/startup.sh -m standalone
[root@nacos-71 nacos]# /usr/local/nacos/bin/shutdown.sh
# windows平臺
startup.cmd -m standalone
shutdown.cmd
將應用注冊到Nacos
- 引入maven依賴:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--Nacos服務發現與注冊相關-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--整合Spring Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--整合Spring Cloud Alibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.9.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 引入application.yml配置
server:
port: 9060
spring:
application:
name: orderServer
cloud:
nacos:
discovery:
server-addr: localhost:8848
Nacos服務發現的領域模型
- Namespace:實現各環境的隔離(如開發、測試、預發、線上),默認public
- Group:不同服務可以分到同一個組,默認DEFAULT_GROUP
- Service:微服務
- Cluster:對指定微服務的一個虛擬劃分,默認DEFAULT
- Instance:微服務實例
指定Namespace:
首先在控制臺上新建Namespace
spring
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 指定namespace 這個可以做到開發環境,預發環境,線上環境的隔離,同環境才可以調用
namespace: cede430e-9610-42ba-9a1e-11bd98ab747e
#指定集群名稱
cluster-name: shanghai
Nacos通過Namespace實現了各環境的隔離,永遠只能調用相同Namespace下的實例,而不能夸Namespace調用
Cluster的作用:
指定集群名稱,為異地災備考慮,如用戶中心集群同時部署在了上海和深圳機房,同城同一集群會優先調用,如果當同城同一集群服務不可用的時候可以進行跨城跨集群調用。
要實現Nacos注冊中心同一集群優先調用,必須擴展Ribbon,請點擊:Ribbon的負載均衡策略、原理和擴展
元數據作用:
提供服務的描述信息,讓服務調用更加靈活(如服務版本控制)
指定元數據:
spring
cloud:
nacos:
discovery:
server-addr: localhost:8848
metadata:
# 自己這個實例的版本
version: V1
# 允許調用的提供者版本
target-version: V1
目前,實現Nacos的元數據metadata的版本控制,就必須要對Ribbon進行改造,Spring Cloud Alibaba官方會在后續版本中加入此功能
對Ribbon的改造以及Ribbon的剖析請點擊:Ribbon的負載均衡策略、原理和擴展
參考: