【Nacos】這篇Nacos詳解,我覺得可以看看
什么是微服務(wù)
在了解Nacos之前,我們先來了解一下,什么是微服務(wù)?在2014年的時(shí)候,一位叫Martin Fowler(馬丁·福勒 )的大神,提出了微服務(wù)的概念,定義:微服務(wù)是由單一應(yīng)用程序構(gòu)成的小小服務(wù),擁有獨(dú)立的進(jìn)程和輕量化處理,服務(wù)依據(jù)業(yè)務(wù)功能設(shè)計(jì),用全自動(dòng)的方式進(jìn)行部署,能夠和其他服務(wù)使用HTTP API 進(jìn)行通信,同時(shí)服務(wù)會(huì)使用最小的規(guī)模進(jìn)行集中管理,服務(wù)可以用不同的編程語言與數(shù)據(jù)庫等組件實(shí)現(xiàn)。
架構(gòu)的演變
記得小農(nóng)剛工作的時(shí)候,那時(shí)候的服務(wù)大多是單體應(yīng)用,可能完善一點(diǎn)的,會(huì)部署集群,就是一個(gè)完整的項(xiàng)目部署多臺機(jī)器,那么隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的承載量和規(guī)模也在不斷的擴(kuò)大,從而導(dǎo)致我們的系統(tǒng)架構(gòu)也在不斷的進(jìn)行變化,從互聯(lián)網(wǎng)早期到如今,系統(tǒng)架構(gòu)大體經(jīng)歷了(單體 ——> 垂直——>分布式——>SOA——>微服務(wù)),如下圖所示:
1、單體架構(gòu)
在最開始的時(shí)候,大多數(shù)服務(wù)都是單體架構(gòu),就是把所有的功能點(diǎn)集中在一個(gè)項(xiàng)目(應(yīng)用)里面,統(tǒng)一開發(fā)部署,這種開發(fā)、部署以及維護(hù)成本都比較低。
- 這種的好處,就是其項(xiàng)目架構(gòu)簡單,上手容易,適合用戶量少的項(xiàng)目,開發(fā)成本比較低,因?yàn)槎疾渴鹪谝粋€(gè)節(jié)點(diǎn)上,維護(hù)也方便
- 缺點(diǎn)就是,所有的功能都集中在一個(gè)項(xiàng)目工程里面,隨著業(yè)務(wù)的發(fā)展,代碼和功能會(huì)越來越多,難以支撐一個(gè)大的項(xiàng)目進(jìn)行開發(fā)和維護(hù),項(xiàng)目之間模塊耦合度高,容錯(cuò)性低,對于不同的功能模塊優(yōu)化和擴(kuò)展性低。
2、垂直應(yīng)用架構(gòu)
所謂的垂直應(yīng)用架構(gòu),就是從單體應(yīng)用變成多個(gè)應(yīng)用,用來提升效率,比如供應(yīng)鏈系統(tǒng)可以拆分為:商品系統(tǒng)、訂單系統(tǒng)、履約系統(tǒng)、門戶系統(tǒng)、采購系統(tǒng)等等。
- 其優(yōu)點(diǎn)就是,項(xiàng)目拆分后實(shí)現(xiàn)了流量的分擔(dān),一定程度上解決并發(fā)問題,針對不同的業(yè)務(wù)模塊可以進(jìn)行優(yōu)化和水平拓展,同時(shí)不同系統(tǒng)之間不會(huì)互相影響,提高容錯(cuò)率。
- 缺點(diǎn):系統(tǒng)之間互相存在,無法進(jìn)行相互調(diào)用,系統(tǒng)之間互相獨(dú)立,會(huì)造成一部分功能的冗余。
3、分布式系統(tǒng)
隨著業(yè)務(wù)的增加,在垂直應(yīng)用架構(gòu)中冗余的代碼越來越多,需要將冗余的代碼抽離出來,統(tǒng)一做成單獨(dú)的業(yè)務(wù)層進(jìn)行處理,變成一個(gè)單獨(dú)的服務(wù),控制層調(diào)用不用的業(yè)務(wù)層服務(wù)完成不同的業(yè)務(wù)功能。
具體可以理解為一個(gè)項(xiàng)目拆分成表現(xiàn)層和服務(wù)層兩個(gè)部分,服務(wù)層實(shí)現(xiàn)業(yè)務(wù)邏輯,表現(xiàn)層處理頁面交互。
- 優(yōu)點(diǎn):抽取公共的功能作為服務(wù)層,能夠提高代碼的復(fù)用率
- 缺點(diǎn): 系統(tǒng)之間的耦合度高,調(diào)用關(guān)系復(fù)雜
4、SOA架構(gòu)
分布式系統(tǒng)中的缺點(diǎn)就是其調(diào)用復(fù)雜,當(dāng)我們的服務(wù)越來越多或者當(dāng)某一個(gè)服務(wù)壓力過大需要進(jìn)行水平拓展和負(fù)載均衡,對于資源的調(diào)度和治理就需要用到SOA(Service Oriented Architecture)為核心來解決,治理中心還可以幫助我們解決服務(wù)之間協(xié)議不同的問題。
- 優(yōu)點(diǎn):使用治理中心(ESB\dubbo)能夠解決服務(wù)之間調(diào)用管理的自動(dòng)調(diào)用
- 缺點(diǎn):服務(wù)之間會(huì)有一定的依賴關(guān)系,如果說某個(gè)環(huán)節(jié)錯(cuò)誤會(huì)影響較大,服務(wù)關(guān)系復(fù)雜,運(yùn)維部署困難
5、微服務(wù)架構(gòu)
微服務(wù)架構(gòu)在某種程序上來說是SOA架構(gòu)往下發(fā)展的下一步,它更加強(qiáng)服務(wù)的“徹底拆分”,目的就是提高效率,微服務(wù)架構(gòu)中,每個(gè)服務(wù)必須獨(dú)立部署同時(shí)互不影響,微服務(wù)架構(gòu)更加輕巧、輕量級。
微服務(wù)架構(gòu)與SOA架構(gòu)的不同之處
- 微服務(wù)架構(gòu)處理更精細(xì),某個(gè)模塊只處理對應(yīng)的功能,讓專業(yè)的人做專業(yè)的事
- 每個(gè)服務(wù)都獨(dú)立部署,服務(wù)之間互相不影響
- 在SOA架構(gòu)中可能會(huì)數(shù)據(jù)庫存儲發(fā)生共享,而微服務(wù)強(qiáng)調(diào)每個(gè)服務(wù)都是獨(dú)立數(shù)據(jù)庫,保證每個(gè)服務(wù)之間的連接互不影響
- 微服務(wù)項(xiàng)目架構(gòu)比SOA架構(gòu)更適合互聯(lián)網(wǎng)公司(迅捷開發(fā)、更效率的版本迭代、更細(xì)粒度)
微服務(wù)在生活中的體驗(yàn)
都說藝術(shù)來源于生活,那么技術(shù)也同樣來自于生活!請舉例說明
例如:
我們?nèi)]串的時(shí)候,一般只有一兩個(gè)人,集收銀、招待、廚師于一體,而當(dāng)我們?nèi)ゾ频甑臅r(shí)候,會(huì)有專門的接待服務(wù)員、收銀員、廚師、洗碗工等等,讓專業(yè)的人做專業(yè)的事!
微服務(wù)的好處在于,能夠?qū)⒎?wù)進(jìn)行原子化拆分,獨(dú)立進(jìn)行打包、部署和升級,能夠保證微服務(wù)之間清晰的任務(wù)劃分,有利于擴(kuò)展,但是微服務(wù)分布式系統(tǒng)開發(fā)的技術(shù)成本比較高,比如要考慮容錯(cuò)、分布式鎖、分布式事務(wù)等等,復(fù)雜性更高。
Nacos 簡介
Nacos (Naming Configuration Service) 歸屬于 Spring Cloud Alibaba 技術(shù)棧下,集動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置和服務(wù)管理平臺,用于構(gòu)建元原生應(yīng)用程序。其中 服務(wù)發(fā)現(xiàn)是微服務(wù)架構(gòu)中的最關(guān)鍵的組件之一 ,Nacos提供了一組簡單易用的特性,可以幫助我們更快速的實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置、元數(shù)據(jù)及流量管理。
什么是Nacos
注冊中心 + 配置中心 = Nacos
為啥使用Nacos?
注冊中心對比
CAP模型
在這里我們不得不提到一個(gè)很重要的理論,就是CAP模型,這也是分布式系統(tǒng)設(shè)計(jì)中考慮的三個(gè)核心要素:
- 一致性(Consistency): 同一時(shí)刻的同一請求的實(shí)例返回結(jié)果相同,所有的數(shù)據(jù)要求具有強(qiáng)一致性
- 可用性(Availability): 所有實(shí)例的讀寫請求在一定時(shí)間內(nèi)可以得到正確的響應(yīng)
- 分區(qū)容錯(cuò)性(Partition tolerance): 在網(wǎng)絡(luò)異常(光纜斷裂、設(shè)備故障、宕機(jī))的情況下,系統(tǒng)任然能夠提供正常的服務(wù)
以上就是CAP原則(又稱CAP定理),但是以上三種情況不可能同時(shí)滿足,分布式系統(tǒng)設(shè)計(jì)在考慮滿足P(分區(qū)容錯(cuò)性)的前提下選擇C(一致性)還是A(可用性),也就是我們熟悉的 AP 和 CP
CP原則(分區(qū)容錯(cuò)性+一致性)
CP原則屬于強(qiáng)一致性原則,要求所有節(jié)點(diǎn)可以查詢的數(shù)據(jù)隨時(shí)都要保持一致,若干個(gè)節(jié)點(diǎn)形成一個(gè)邏輯的共享區(qū)域,某一個(gè)節(jié)點(diǎn)更新的數(shù)據(jù)都會(huì)立即同步到其他數(shù)據(jù)節(jié)點(diǎn)之中,當(dāng)數(shù)據(jù)同步完成之后才能返回成功的結(jié)果,但是在實(shí)際的運(yùn)行過程中網(wǎng)絡(luò)的故障在所難免,如果這個(gè)時(shí)候若干個(gè)服務(wù)節(jié)點(diǎn)之間無法通訊時(shí)就會(huì)出現(xiàn)錯(cuò)誤,犧牲可用性原則(A)
AP原則(分區(qū)容錯(cuò)性+可用性)
AP原則屬于弱一致性原則,在集群中只要有存活的節(jié)點(diǎn),那么所發(fā)來的所有請求都可以得到正確的詳情,在進(jìn)行數(shù)據(jù)同步處理操作中即便某些節(jié)點(diǎn)沒有成功的實(shí)現(xiàn)數(shù)據(jù)同步也返回成功,這樣就犧牲了一致性原則(C),可以應(yīng)用在網(wǎng)絡(luò)環(huán)境不是很好的場景當(dāng)中。
對于Nacos而言,支持CP和AP兩種模式的動(dòng)態(tài)切換,默認(rèn)為AP
切換命令:curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
Nacos 類似于我們酒店的前臺,首先酒店里面的房間打掃干凈以后并且符合入住條件的房間會(huì)注冊到服務(wù)臺,這樣當(dāng)有客人來就酒店住店,只需要通過前臺去查找到可以入駐的房間即可,不需要進(jìn)行等待,可以快速的入住到酒店
【房間 ——> 服務(wù)】
【服務(wù)臺 ——> Nacos】
【客人 ——> 用戶】
服務(wù)器提供的注冊和發(fā)現(xiàn)機(jī)制可以幫助客人更快速的找到合適的房間。
如果沒有一個(gè)沒有服務(wù)前臺的酒店,客人入駐的時(shí)候需要自己尋找合適的房間,因?yàn)榭腿瞬恢烂總€(gè)房間的情況,無法確定哪個(gè)房間是服務(wù)入住條件的房間,客人只能一個(gè)一個(gè)去找,費(fèi)時(shí)費(fèi)力,同時(shí)這也是不合理的
在微服務(wù)中,軟件服務(wù)各自獨(dú)立,但是最終是作為一個(gè)整體來服務(wù)于客戶,軟件之間也需要彼此通信和方法調(diào)用,微服務(wù)架構(gòu)內(nèi)部發(fā)起通訊調(diào)用方法的一方,我們稱之為 “服務(wù)消費(fèi)者”,提供遠(yuǎn)程方法的服務(wù)器稱之為 “服務(wù)提供者”,往往為了提高系統(tǒng)性能,會(huì)提供多個(gè)服務(wù)器作為 服務(wù)提供者 ,這個(gè)時(shí)候服務(wù)消費(fèi)者找服務(wù)提供者的過程,就類似于用戶在找房間的過程,為了幫助 服務(wù)消費(fèi)者 快速的發(fā)現(xiàn) 服務(wù)提供者,在微服務(wù)框架中都會(huì)引入注冊中心,注冊中心就類似于酒店的前臺,提供在軟件服務(wù)的注冊和發(fā)現(xiàn)功能,服務(wù)提供者 會(huì)先在注冊中心進(jìn)行注冊,聲明可以進(jìn)行對外提供服務(wù),而服務(wù)消費(fèi)者只需要通過注冊中心找到可以使用的服務(wù),就可以快速使用服務(wù)了,注冊中心實(shí)現(xiàn)了服務(wù)提供和服務(wù)消費(fèi)的快速配合的功能。
Nacos 搭建
官網(wǎng)地址:https://nacos.io/zh-cn/index.html
文檔地址:https://nacos.io/zh-cn/docs/quick-start.html
下載地址:https://github.com/alibaba/nacos/releases
一般推薦的是我們使用穩(wěn)定版,官方也會(huì)在文檔中說明
下載之后解壓后就可以使用
執(zhí)行命令:
linux/Mac:
sh startup.sh -m standalone
Windows:
startup.cmd -m standalone
PS:注意nacos的文件路徑一定要是英文,否則啟動(dòng)會(huì)報(bào)錯(cuò)
nacos默認(rèn)使用的數(shù)據(jù)庫為內(nèi)嵌的cmdb,我們也可以創(chuàng)建本地?cái)?shù)據(jù)庫并修改配置文件指向本地?cái)?shù)據(jù)庫即可(推薦)。
啟動(dòng)成功以后,我們訪問:http://localhost:8848/nacos
用戶名密碼默認(rèn)為:nacos/nacos
如下圖所示表示我們啟動(dòng)成功!
Nacos 服務(wù)端的搭建
Nacos注冊中心
服務(wù)發(fā)現(xiàn)是微服務(wù)架構(gòu)中的關(guān)鍵組件之一。在這樣的架構(gòu)中,手動(dòng)為每個(gè)客戶端配置服務(wù)列表可能是一項(xiàng)艱巨的任務(wù),并且使動(dòng)態(tài)擴(kuò)展變得極其困難。Nacos Discovery 幫助您將服務(wù)自動(dòng)注冊到 Nacos 服務(wù)器,Nacos 服務(wù)器會(huì)跟蹤服務(wù)并動(dòng)態(tài)刷新服務(wù)列表。此外,Nacos Discovery 將服務(wù)實(shí)例的一些元數(shù)據(jù),如主機(jī)、端口、健康檢查 URL、主頁等注冊到 Nacos
官方API文檔:https://spring.io/projects/spring-cloud-alibaba#learn
有的同學(xué)會(huì)說,小農(nóng)我english不太好,別擔(dān)心,現(xiàn)在瀏覽器上不是有翻譯嗎,直接翻譯!??!
創(chuàng)建項(xiàng)目
我們需要?jiǎng)?chuàng)建一個(gè)聚合工程,這樣如果需要添加新的Nacos服務(wù),直接添加子模塊就可以
新建父類項(xiàng)目:spring-cloud-alibaba
新建子類項(xiàng)目:cloud-alibaba-nacos-9001
POM
父類項(xiàng)目
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在子項(xiàng),引入 Nacos Discovery 進(jìn)行服務(wù)注冊/發(fā)現(xiàn)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
YML
server:
port: 9001
spring:
application:
name: nacos-provider
cloud:
discovery:
server-addr: localhost:8848
management:
endpoint:
web:
exposure:
include: '*'
啟動(dòng)類:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //需要添加這個(gè)注解
public class CloudAlibabaNacos9001Application {
public static void main(String[] args) {
SpringApplication.run(CloudAlibabaNacos9001Application.class, args);
}
}
測試類:
/**
* @program: spring-cloud-alibaba
* @ClassName DemoController
* @description:
* @author: 牧小農(nóng)
* @create: 2022-03-27 17:08
* @Version 1.0
**/
@RestController
public class DemoController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/muxiaonong")
public String getServerPort(){
return "hello Nacos Discovery"+serverPort;
}
}
當(dāng)我們啟動(dòng)服務(wù)以后,就可以看到在服務(wù)列表中,看到我們啟動(dòng)服務(wù)
參考 cloud-alibaba-nacos-9001 新建一個(gè)的服務(wù) cloud-alibaba-nacos-9002
Nacos消費(fèi)者負(fù)載均衡
新建子類項(xiàng)目:cloud-alibab-consumer-8083
Pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muxiaonong</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.muxiaonong</groupId>
<artifactId>cloud-alibab-consumer-8083</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-alibab-consumer-8083</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
</project>
同時(shí)我們也需要在父類項(xiàng)目中添加子類說明
<modules>
<module>cloudalibaba-nacos-9001</module>
<module>cloudalibaba-nacos-9002</module>
<module>cloudalibab-consumer-nacos-8083</module>
</modules>
yml
server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: localhost:8848
啟動(dòng)類
@SpringBootApplication
@EnableDiscoveryClient
public class CloudAlibabConsumer8083Application {
public static void main(String[] args) {
SpringApplication.run(CloudAlibabConsumer8083Application.class, args);
}
}
nacos-provider: 服務(wù)注冊者
nacos-consumer: 服務(wù)消費(fèi)者
服務(wù)間的調(diào)用
如果我們想要我們創(chuàng)建服務(wù)的消費(fèi)者去調(diào)用服務(wù)提供者,就需要通過Ribbon進(jìn)行調(diào)用。
什么是Ribbon
Spring Cloud Ribbon 是一個(gè)基于HTTP和TCP客戶端負(fù)載均衡器,基于Netflix Ribbon實(shí)現(xiàn),通過Spring Cloud的封裝,可以讓我們很方便的將面向服務(wù)的Rest模板請求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡服務(wù)調(diào)用,雖然它知識一個(gè)工具類庫,不需要進(jìn)行獨(dú)立部署,它幾乎存在于每一個(gè)Spring Cloud 構(gòu)建的微服務(wù)和基礎(chǔ)設(shè)施中,對于服務(wù)間的調(diào)用,AP網(wǎng)關(guān)的請求轉(zhuǎn)發(fā)都需要經(jīng)過Ribbon負(fù)載均衡來實(shí)現(xiàn),而Ribbon的主要作用是:從注冊服務(wù)器端拿到對應(yīng)的服務(wù)列表后用負(fù)載均衡的方式訪問對應(yīng)的服務(wù)
因?yàn)镹acos已經(jīng)整合了Ribbon,所以我們?nèi)绻胍褂茫恍枰獙?dǎo)入Spring Cloud Alibaba Nacos的依賴就可以直接使用了。
這個(gè)需要注意的是nacos自從2020版本之后不再整合的是Netflix,也就沒有ribbon了,如果報(bào)錯(cuò)說找不到服務(wù)是因?yàn)?,你使用了?fù)載均衡算法,但是沒有ribbon了,它不知道該使用哪個(gè)服務(wù)。
所以這里只需要導(dǎo)入spring-cloud-starter-loadbalancer依賴即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.0</version>
</dependency>
Ribbon的基礎(chǔ)使用
對于Ribbon進(jìn)行遠(yuǎn)程調(diào)用,我們通常使用 RestTemplate,其中g(shù)etForObject是最常用方法,我們只需要在啟動(dòng)類中添加 RestTemplate就可以正常使用
@Bean
@LoadBalanced //nacos集成了ribbon
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
當(dāng)body是一個(gè)對象時(shí),可以直接這樣實(shí)現(xiàn):
User result = restTemplate.getForObject(uri, User.class);
不需要關(guān)注請求響應(yīng)除body外的其他內(nèi)容時(shí),該函數(shù)就非常好用,可以少一個(gè)從Response中獲取body的步驟。提供了三種不同的重載實(shí)現(xiàn)
url: 表示被調(diào)用的目標(biāo)Rest接口位置,多個(gè)服務(wù)提供者注冊相同名稱,Ribbon會(huì)自動(dòng)尋找其中一個(gè)服務(wù)提供者,并且調(diào)用接口方法。這個(gè)就是負(fù)載均衡功能
responseType: 返回值類型,JavaBean類型或者JavaBean數(shù)組類型
urlVariables: 傳遞給url的動(dòng)態(tài)參數(shù),使用參數(shù)時(shí)候需要在url上需要使用{1}、{2}、{3}進(jìn)行參數(shù)占位,這樣傳遞的參數(shù)就會(huì)自動(dòng)替換占位符
getForObject(String url, Class responseType, Object … urlVariables)
getForObject(String url, Class responseType, Map urlVariables)
getForObject(URI url, Class responseType)
Nacos負(fù)載均衡
如果想讓我們的消費(fèi)者consuomer去調(diào)用服務(wù)提供者9001和9002,就是使用到我們的負(fù)載均衡了。
yml
server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: localhost:8848
# 服務(wù)提供者的名稱
service-url:
nacos-user-service: http://nacos-provider
啟動(dòng)類上配置restTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
測試類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @program: spring-cloud-alibaba
* @ClassName DemoController
* @description:
* @author: 牧小農(nóng)
* @create: 2022-04-04 16:11
* @Version 1.0
**/
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
//訪問服務(wù)名
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/nacos")
public String getDiscovery(){
System.out.println(serverURL);
return restTemplate.getForObject(serverURL+"/muxiaonong",String.class);
}
當(dāng)我們輸入:http://localhost:8083/consumer/nacos,
就可以看到9001和9002對應(yīng)的切換顯示了
Nacos配置中心
上面我們有講 注冊中心 + 配置中心 = Nacos ,前面我們將了注冊中心,現(xiàn)在我們來講一講如何使用Nacos作為他的配置中心
為什么使用Nacos配置中心
1、配置屬性的動(dòng)態(tài)刷新
2、配置文件的集中管理
我們新建一個(gè)子項(xiàng):cloud-alibaba-config-3377
pom文件:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
YML配置:
在這里我們需要配置兩個(gè),一個(gè)是讓當(dāng)前項(xiàng)目注冊到Nacos中,另外一個(gè)是去Nacos中讀取指定后綴的配置文件
bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服務(wù)注冊中心地址
config:
server-addr: localhost:8848 #Nacos作為配置中心地址
file-extension: yaml #指定yaml格式的配置
application.yml
spring:
profiles:
active: dev
啟動(dòng)類同樣添加@EnableDiscoveryClient
注解
測試類:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: spring-cloud-alibaba
* @ClassName DemoController
* @description:
* @author: 牧小農(nóng)
* @create: 2022-04-10 16:02
* @Version 1.0
**/
@RestController
@RefreshScope //支持Nacos的動(dòng)態(tài)刷新功能
public class DemoController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
Nacos的配置規(guī)則
官網(wǎng):https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
在Nacos Spring Cloud 中,dataId的完整格式如下
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默認(rèn)為 spring.application.name 的值,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置。
- spring.profiles.active 即為當(dāng)前環(huán)境對應(yīng)的 profile,詳情可以參考 Spring Boot文檔。 注意:當(dāng) spring.profiles.active 為空時(shí),對應(yīng)的連接符 - 也將不存在,dataId 的拼接格式變成
${prefix}.${file-extension}
- file-exetension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項(xiàng) spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。
${spring.application.name}-${spring.profiles.active}.${file-extension}
nacos-config-client-dev.yaml
微服務(wù)名稱-當(dāng)前環(huán)境-文件格式
接下來而我們只需要在Nacos平臺上去創(chuàng)建配置系項(xiàng)即可
修改Nacos配置,不需要重啟項(xiàng)目即可自動(dòng)刷新
通過鏈接訪問即可
文章轉(zhuǎn)載自: https://muxiaonong.blog.csdn.net
公眾號:牧小農(nóng),微信掃碼關(guān)注或搜索公眾號名稱