1.什么是Nacos
Nacos的官網對這一問題進行了詳細的介紹,通俗的來說:
Nacos是一個服務發現組件,同時也是一個配置服務器,它解決了兩個問題:
1.服務A如何發現服務B
2.管理微服務的配置
2.搭建Nacos Server
2.1 環境准備
Nacos依靠java環境運行,搭建Nacos Server,需要配置maven環境,版本環境要求如下:
1、64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac
2、64 bit JDK 1.8+
3、Maven 3.2.x+
2.2 服務端獲取
Nacos提供了兩種方式獲取Nacos的服務端:
1、源碼下載編譯
2、下載 Release 包
2.2.1 源碼下載編譯
在你需要安裝的地址下,執行:git clone https://github.com/alibaba/nacos.git
將源碼下載到本地之后,進入源碼目錄:cd nacos
執行命令:mvn -Prelease-nacos clean install -U
進入啟動命令:cd distribution/target/nacos-server-1.1.3/nacos/bin/
2.2.2 下載 Release 包
從這個網址下載nacos-server-$version.zip 包,執行解壓縮命令:unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
進入命令執行頁面: cd nacos/bin
2.3 啟動服務器
Lunix系統:
啟動命令(standalone代表着單機模式運行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系統,或者運行腳本報錯提示[[符號找不到,可嘗試如下運行:
bash startup.sh -m standalone
Windows系統:
啟動命令:
cmd startup.cmd
或者雙擊startup.cmd運行文件
啟動成功后
打開瀏覽器輸入:http://127.0.0.1:8848/nacos,進入nacos可視化控制頁面,賬號密碼默認nacos。
3. 將應用注冊到Nacos
首先,在加依賴,在dependencies中添加
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
然后,修改配置(server-addr不要加http或者https前綴,直接主機名/IP/域名 + 端口號就可以了)
spring: cloud: nacos: discovery: # 指定nacos server地址 server-addr: localhost:8848 application: name: study01
啟動服務,打開Nacos Server控制台,可以看見剛剛啟動的服務已經注冊成功。
PS:對於Nacos Server版本與Nacos Client版本對應問題:
應用集成Nacos Client從而和Nacos Server通信,我們通過查看spring-cloud-alibaba-dependencies文件中使用了哪個Nacos Client版本,下載相同版本的Nacos Server版本即可。
可以看見我當前版本的Spring Cloud Alibaba使用的Nacos Client版本為1.1.1,由於Nacos沒有提供Nacos server1.1.1版本包,所以我直接使用了Nacos server1.1.3。
4.服務間調用
如何在服務A中調用服務B的請求,分為兩步進行:
1.獲取服務B的URL,因為考慮到服務B可能部署在多個服務器,或者更換升級服務器,所以不能夠直接寫死URL,我們利用DiscoveryClient接口動態的獲取服務B的URL
import org.springframework.cloud.client.discovery.DiscoveryClient; private final DiscoveryClient discoveryClient; // 服務B所有示例的信息 List<ServiceInstance> instances = discoveryClient.getInstances("服務B"); String targetURL = instances.stream() .map(instance -> instance.getUri().toString() + "/***/***") .findFirst() .orElseThrow(() -> new IllegalArgumentException("當前示例不存在"));
2.調用服務B的請求,我們使用RestTemplate接口完成這一操作
import org.springframework.web.client.RestTemplate; private final RestTemplate restTemplate; Demo forObject = restTemplate.getForObject(targetURL, Demo.class, "請求參數");
5.服務發現的領域模型
5.1 領域模型有哪些,有什么作用?
關於領域模型,可以通過上圖來理解:
最大的是Namespace(命名空間),Nacos默認的命名空間是public,Namespace主要用來實現隔離。比方說我們現在有三個環境:開發、測試、生產環境,我們就可以創建三個Namespace,不同的Namespace之間是隔離的。
Namespace之下是Group(分組),Nacos默認Group是DEFAULT_GROUP,Group可以把不同的微服務划分到同一個分組里面去,Group可以方便我們的管理。
Group之下是Service,就是我們所謂的微服務;一個Service可以包含多個Cluster(集群),Nacos默認Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬划分,比方說為了容災,將Service微服務分別部署在了杭州機房和廣州機房,這時就可以給杭州機房的Service微服務起一個集群名稱(HZ),給廣州機房的Service微服務起一個集群名稱(GZ),還可以盡量讓同一個機房的微服務互相調用,以提升性能。最后是Instance,就是微服務的示例。
5.2 如何指定領域模型
首先在控制台新建一個命名空間
創建成功之后得到了一個UUID,將此UUID配置在配置文件中(一定要配置UUID,而不是命名空間名稱),同時配置集群名稱:
spring:
cloud:
nacos:
discovery:
# 指定nacos server地址
server-addr: localhost:8848
namespace: ab9783a7-dade-4da3-9abf-5cb2f5c52d59
cluster-name: HZ
可以在控制台查看到,多出了一個dev命名空間
服務中也多出了一個HZ集群
6. 元數據
Nacos數據(如配置和服務)描述信息,如服務版本、權重、容災策略、負載均衡策略、鑒權配置、各種自定義標簽 (label),從作用范圍來看,分為服務級別的元信息、集群的元信息及實例的元信息。
6.1 元數據的作用
1、提供描述信息
2、讓微服務的調用更加靈活
微服務版本控制
6.2 如何配置元數據
1、控制台設置(key-value形式)
2、配置文件配置
spring:
cloud:
nacos:
discovery:
# 元數據
metadata:
target-version: v1