哲學(xué)專業(yè)特色建設(shè)網(wǎng)站谷歌搜索廣告優(yōu)化
目錄
- 專欄導(dǎo)讀
- 一、什么是Nacos?
- 二、注冊(cè)中心演變及其設(shè)計(jì)思想
- 1、RestTemplate調(diào)用遠(yuǎn)程服務(wù)
- 2、通過Nginx維護(hù)服務(wù)列表(upStream)
- 3、通過Nacos實(shí)現(xiàn)注冊(cè)中心
- 4、心跳版Nacos
- 三、Nacos Discovery
- 四、Nacos核心功能
- 1、服務(wù)注冊(cè)
- 2、服務(wù)心跳
- 3、服務(wù)同步
- 4、服務(wù)發(fā)現(xiàn)
- 5、服務(wù)健康檢查
- 五、作為注冊(cè)中心
- 六、作為配置中心
- 1、SpringBoot集成Nacos
- 2、支持配置的動(dòng)態(tài)更新
- 3、可支持profile粒度的配置
- 4、支持自定義 namespace 的配置
- 5、支持自定義 Group 的配置
- 6、配置優(yōu)先級(jí)
- 7、@RefreshScope
- 8、Spring Cloud Config 橫向?qū)Ρ萅acos
專欄導(dǎo)讀
🏆作者簡(jiǎn)介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多屆新星計(jì)劃導(dǎo)師?、博客專家💪 ,專注Java硬核干貨分享,立志做到Java賽道全網(wǎng)Top N。
🏆本文收錄于Java基礎(chǔ)教程系列(進(jìn)階篇),本專欄是針對(duì)大學(xué)生、初級(jí)Java工程師精心打造,針對(duì)Java生態(tài),逐個(gè)擊破,不斷學(xué)習(xí),打通Java技術(shù)棧。
🏆訂閱后,可以閱讀Java基礎(chǔ)教程系列(進(jìn)階篇)中全部文章,包含Java基礎(chǔ)、Java高并發(fā)、Spring、MySQL等Java進(jìn)階技術(shù)棧。
🏆還可以訂閱其姐妹篇,Java基礎(chǔ)教程系列,包含全部Java基礎(chǔ)知識(shí)點(diǎn)、Java8新特性、Java集合、Java多線程、Java代碼實(shí)例,理論結(jié)合實(shí)戰(zhàn),實(shí)現(xiàn)Java的輕松學(xué)習(xí)。
🏆哪吒多年工作總結(jié):Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師。
🏆面試福音:10萬字208道Java經(jīng)典面試題總結(jié)(附答案)
大家好,我是哪吒。
本系列為SpringCloud微服務(wù)系列,上一篇學(xué)習(xí)了Spring Cloud Alibaba 微服務(wù)1,系統(tǒng)架構(gòu)演變 + Nginx反向代理與負(fù)載均衡,讀哪吒編程,品技術(shù)人生。
一、什么是Nacos?
一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置和服務(wù)管理平臺(tái)。
Nacos的關(guān)鍵特性:
二、注冊(cè)中心演變及其設(shè)計(jì)思想
1、RestTemplate調(diào)用遠(yuǎn)程服務(wù)
如果此時(shí),服務(wù)端接口接口名或參數(shù)或請(qǐng)求方式更改了,那么就得同步修改此restTemplate方法,感覺很麻煩。
@SpringBootTest
class Test {@Resourceprivate RestTemplate restTemplate;@Testvoid testSimple() {// 請(qǐng)求地址String url = "http://www.nzbc.com/updateUser";// 要發(fā)送的數(shù)據(jù)對(duì)象User user = new User();user.setUserId(1);user.setName("哪吒編程");user.setMsg("讀哪吒編程,品技術(shù)人生");// 發(fā)送post請(qǐng)求User result = restTemplate.postForObject(url, user, User.class);System.out.println(result);}
}
2、通過Nginx維護(hù)服務(wù)列表(upStream)
通過Nginx維護(hù)服務(wù)列表(upStream),如果服務(wù)較多的話,在Nginx通過upStream的方式去配置的話,Nginx配置文件會(huì)變得非常的難以維護(hù)。
3、通過Nacos實(shí)現(xiàn)注冊(cè)中心
這種是最簡(jiǎn)單的Nacos注冊(cè)中心,有若干個(gè)服務(wù),都注冊(cè)到Nacos注冊(cè)中心,調(diào)用之前,先到Nacos獲取對(duì)應(yīng)接口,然后進(jìn)行實(shí)際的調(diào)用。
但是,思考一個(gè)問題,如果Nacos宕機(jī)了,怎么辦?如果從Nacos獲取到接口后,調(diào)用服務(wù)2時(shí),服務(wù)2宕機(jī)了,怎么辦?
4、心跳版Nacos
心跳版Nacos,服務(wù)1和服務(wù)2和Nacos之間維護(hù)一個(gè)心跳關(guān)系,每5秒跳一次,頻率不能太快或者太慢,否者會(huì)嗝屁的。
如果Nacos在5秒內(nèi)沒有收到心跳,則表示服務(wù)掛了,Nacos會(huì)下線此服務(wù)。對(duì)于超過15秒沒有收到客戶端心跳的服務(wù)實(shí)例,會(huì)將它的healthy屬性置為false,客戶端無法調(diào)用healthy為false的服務(wù),如果超過30秒沒有收到心跳,Nacos會(huì)直接將此服務(wù)剔除。
也可以通過服務(wù)端主動(dòng)注銷的方式,停止注冊(cè)。
服務(wù)1調(diào)用服務(wù)2時(shí),服務(wù)1會(huì)通過定時(shí)任務(wù)到Nacos中獲取在線的服務(wù),保證所調(diào)用的服務(wù)一直都是健康在線的狀態(tài)。獲取到之后,用緩存將其保存起來,然后通過負(fù)載均衡器調(diào)用服務(wù)2,此時(shí),將不再使用服務(wù)端的負(fù)載均衡Nginx了。
三、Nacos Discovery
SpringBoot中引入Nacos Discovery,實(shí)現(xiàn)與Nacos的無縫連接,Nacos Discovery可以將服務(wù)自動(dòng)注冊(cè)到Nacos服務(wù)端,并且能夠動(dòng)態(tài)感知此服務(wù),并刷新服務(wù)列表。并將服務(wù)的host、port、URL等信息注冊(cè)到Nacos。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Nacos 的配置項(xiàng)信息:
四、Nacos核心功能
1、服務(wù)注冊(cè)
Nacos Client會(huì)通過發(fā)送REST請(qǐng)求向Nacos Server注冊(cè)自己的服務(wù),提供自身的元數(shù)據(jù),比如host、port、url等信息,Nacos Server在收到注冊(cè)請(qǐng)求后,會(huì)將這些數(shù)據(jù)信息存儲(chǔ)在一個(gè)雙層的內(nèi)存map中。
2、服務(wù)心跳
服務(wù)注冊(cè)后,服務(wù)消費(fèi)者和Nacos Server之間會(huì)維護(hù)一個(gè)心跳,定時(shí)通知server,此服務(wù)還活著,防止被剔除掉。
3、服務(wù)同步
Nacos Server集群之間會(huì)互相同步已注冊(cè)的服務(wù),用來保證服務(wù)列表的一致性。
4、服務(wù)發(fā)現(xiàn)
服務(wù)消費(fèi)者在調(diào)用服務(wù)提供者的服務(wù)時(shí),會(huì)發(fā)送一個(gè)REST請(qǐng)求到Nacos Server,獲取健康的服務(wù)列表,然后將其緩存到本地,同時(shí)開啟一個(gè)定時(shí)任務(wù),定時(shí)訪問Nacos Server,然后更新本地緩存。
5、服務(wù)健康檢查
Nacos Server會(huì)開啟一個(gè)定時(shí)任務(wù)用來檢查注冊(cè)服務(wù)實(shí)例的健康情況,對(duì)于超過15秒沒有收到客戶端心跳的服務(wù)實(shí)例,會(huì)將它的healthy屬性置為false,客戶端無法調(diào)用healthy為false的服務(wù),如果超過30秒沒有收到心跳,Nacos會(huì)直接將此服務(wù)剔除。
五、作為注冊(cè)中心
- Nacos目前功能最全,用的也最多;
- Eureka,因?yàn)橥Ω木壒?#xff0c;比較新的技術(shù)都不支持了,目前很多公司都將Eureka換成Nacos了,不推薦使用;
- Zookeeper,用的最多的地方就是和Dubbo一起使用,不支持負(fù)載均衡策略,但可以通過其它組件實(shí)現(xiàn);
- Consul支持的也很多;
- CoreDNS不推薦使用;
CAP,C一致性,A可用性,P分區(qū)容錯(cuò)性
Nacos | Eureka | Zookeeper | Consul | |
---|---|---|---|---|
一致性協(xié)議 | CP + AP | CP | AP | CP |
訪問協(xié)議 | HTTP/DNS | HTTP | TCP | HTTP/DNS |
健康檢查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | Keep Live | TCP/HTT[/gRPC/Cmd |
負(fù)載均衡策略 | 權(quán)重/metadata/Seletor | Ribbon | - | Fabio |
雪崩保護(hù) | 有 | 有 | 無 | 無 |
自動(dòng)注銷 | 支持 | 支持 | 支持 | 支持 |
監(jiān)聽 | 支持 | 支持 | 支持 | 支持 |
多數(shù)據(jù)中心 | 支持 | 支持 | 支持 | 不支持 |
跨注冊(cè)中心同步 | 支持 | 不支持 | 不支持 | 支持 |
Spring Cloud集成 | 支持 | 支持 | 支持 | 支持 |
Dubbo集成 | 支持 | 不支持 | 支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 不支持 |
六、作為配置中心
1、SpringBoot集成Nacos
Nacos使用key/value形式存儲(chǔ)配置信息,為分布式系統(tǒng)中的外部化配置提供服務(wù)支持。
(1)maven文件
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(2)配置文件
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848blog.name=哪吒編程
blog.language=java
(3)主方法啟動(dòng)類
@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);String name = applicationContext.getEnvironment().getProperty("blog.name");String language = applicationContext.getEnvironment().getProperty("blog.language");System.err.println("名字 :"+name+"; 擅長(zhǎng)技術(shù): "+language);}
}
2、支持配置的動(dòng)態(tài)更新
一秒刷新一次。
@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);while(true) {//當(dāng)動(dòng)態(tài)配置刷新時(shí),會(huì)更新到 Enviroment中,因此這里每隔一秒中從Enviroment中獲取配置String name = applicationContext.getEnvironment().getProperty("blog.name");String language = applicationContext.getEnvironment().getProperty("blog.language");System.err.println("名字 :"+name+"; 擅長(zhǎng)技術(shù): "+language);TimeUnit.SECONDS.sleep(1);}}
}
3、可支持profile粒度的配置
4、支持自定義 namespace 的配置
開發(fā)測(cè)試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務(wù))隔離等,比如dev和prod。
5、支持自定義 Group 的配置
在沒有明確指定 ${spring.cloud.nacos.config.group}
配置的情況下, 默認(rèn)使用的是 DEFAULT_GROUP 。如果需要自定義自己的 Group,可以通過以下配置來實(shí)現(xiàn):
spring.cloud.nacos.config.group=DEVELOP_GROUP
6、配置優(yōu)先級(jí)
profile > 默認(rèn)配置文件 > extension-configs(下標(biāo)越大優(yōu)先級(jí)越高) > shared-configs(下標(biāo)越大優(yōu)先級(jí)越高)
7、@RefreshScope
一般都是通過@Value的形式讀取配置文件中的信息,但是無法感知修改后的值,需要利用@RefreshScope動(dòng)態(tài)刷新。
8、Spring Cloud Config 橫向?qū)Ρ萅acos
- Spring Cloud Config需要結(jié)合Git使用,動(dòng)態(tài)變更需要配合Bus 消息總線來通知所有的客戶端變化;
- Spring Cloud Config沒有可視化界面;
- Nacos使用長(zhǎng)輪詢更新配置,速度上秒殺Spring Cloud Config;
上一篇:Spring Cloud Alibaba 微服務(wù)1,系統(tǒng)架構(gòu)演變 + Nginx反向代理與負(fù)載均衡
下一篇:Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師
Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師
10萬字208道Java經(jīng)典面試題總結(jié)(附答案)
Java基礎(chǔ)教程系列
Java基礎(chǔ)教程系列(進(jìn)階篇)