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