新聞中心

成都服務(wù)器托管,創(chuàng)新互聯(lián)公司提供包括服務(wù)器租用、聯(lián)通服務(wù)器托管、帶寬租用、云主機(jī)、機(jī)柜租用、主機(jī)租用托管、CDN網(wǎng)站加速、域名注冊等業(yè)務(wù)的一體化完整服務(wù)。電話咨詢:18982081108
大家好,我是哪吒。
一、什么是Nacos?
一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置和服務(wù)管理平臺。
Nacos的關(guān)鍵特性:
Nacos的關(guān)鍵特性
二、注冊中心演變及其設(shè)計思想
1、RestTemplate調(diào)用遠(yuǎn)程服務(wù)
如果此時,服務(wù)端接口接口名或參數(shù)或請求方式更改了,那么就得同步修改此restTemplate方法,感覺很麻煩。
RestTemplate調(diào)用遠(yuǎn)程服務(wù)
@SpringBootTest
class Test {
@Resource
private RestTemplate restTemplate;
@Test
void testSimple() {
// 請求地址
String url = "http://www.nzbc.com/updateUser";
// 要發(fā)送的數(shù)據(jù)對象
User user = new User();
user.setUserId(1);
user.setName("哪吒編程");
user.setMsg("讀哪吒編程,品技術(shù)人生");
// 發(fā)送post請求
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配置文件會變得非常的難以維護(hù)。
3、通過Nacos實現(xiàn)注冊中心
Nacos注冊中心
這種是最簡單的Nacos注冊中心,有若干個服務(wù),都注冊到Nacos注冊中心,調(diào)用之前,先到Nacos獲取對應(yīng)接口,然后進(jìn)行實際的調(diào)用。
但是,思考一個問題,如果Nacos宕機(jī)了,怎么辦?如果從Nacos獲取到接口后,調(diào)用服務(wù)2時,服務(wù)2宕機(jī)了,怎么辦?
4、心跳版Nacos
心跳版Nacos
心跳版Nacos,服務(wù)1和服務(wù)2和Nacos之間維護(hù)一個心跳關(guān)系,每5秒跳一次,頻率不能太快或者太慢,否者會嗝屁的。
如果Nacos在5秒內(nèi)沒有收到心跳,則表示服務(wù)掛了,Nacos會下線此服務(wù)。
對于超過15秒沒有收到客戶端心跳的服務(wù)實例,會將它的healthy屬性置為false,客戶端無法調(diào)用healthy為false的服務(wù)。
如果超過30秒沒有收到心跳,Nacos會直接將此服務(wù)剔除。
也可以通過服務(wù)端主動注銷的方式,停止注冊。
服務(wù)1調(diào)用服務(wù)2時,服務(wù)1會通過定時任務(wù)到Nacos中獲取在線的服務(wù),保證所調(diào)用的服務(wù)一直都是健康在線的狀態(tài)。
獲取到之后,用緩存將其保存起來,然后通過負(fù)載均衡器調(diào)用服務(wù)2,此時,將不再使用服務(wù)端的負(fù)載均衡Nginx了。
三、Nacos Discovery
SpringBoot中引入Nacos Discovery,實現(xiàn)與Nacos的無縫連接,Nacos Discovery可以將服務(wù)自動注冊到Nacos服務(wù)端,并且能夠動態(tài)感知此服務(wù),并刷新服務(wù)列表。并將服務(wù)的host、port、URL等信息注冊到Nacos。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
Nacos 的配置項信息:
四、Nacos核心功能
Nacos核心功能
1、服務(wù)注冊
Nacos Client會通過發(fā)送REST請求向Nacos Server注冊自己的服務(wù),提供自身的元數(shù)據(jù),比如host、port、url等信息,Nacos Server在收到注冊請求后,會將這些數(shù)據(jù)信息存儲在一個雙層的內(nèi)存map中。
2、服務(wù)心跳
服務(wù)注冊后,服務(wù)消費者和Nacos Server之間會維護(hù)一個心跳,定時通知server,此服務(wù)還活著,防止被剔除掉。
3、服務(wù)同步
Nacos Server集群之間會互相同步已注冊的服務(wù),用來保證服務(wù)列表的一致性。
4、服務(wù)發(fā)現(xiàn)
服務(wù)消費者在調(diào)用服務(wù)提供者的服務(wù)時,會發(fā)送一個REST請求到Nacos Server,獲取健康的服務(wù)列表,然后將其緩存到本地,同時開啟一個定時任務(wù),定時訪問Nacos Server,然后更新本地緩存。
5、服務(wù)健康檢查
Nacos Server會開啟一個定時任務(wù)用來檢查注冊服務(wù)實例的健康情況,對于超過15秒沒有收到客戶端心跳的服務(wù)實例,會將它的healthy屬性置為false,客戶端無法調(diào)用healthy為false的服務(wù),如果超過30秒沒有收到心跳,Nacos會直接將此服務(wù)剔除。
五、作為注冊中心
1、Nacos目前功能最全,用的也最多;
2、Eureka,因為挺更的緣故,比較新的技術(shù)都不支持了,目前很多公司都將Eureka換成Nacos了,不推薦使用;
3、Zookeeper,用的最多的地方就是和Dubbo一起使用,不支持負(fù)載均衡策略,但可以通過其它組件實現(xiàn);
4、Consul支持的也很多;
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 |
|
負(fù)載均衡策略 |
權(quán)重/metadata/Seletor |
Ribbon |
- |
Fabio |
|
雪崩保護(hù) |
有 |
有 |
無 |
無 |
|
自動注銷 |
支持 |
支持 |
支持 |
支持 |
|
監(jiān)聽 |
支持 |
支持 |
支持 |
支持 |
|
多數(shù)據(jù)中心 |
支持 |
支持 |
支持 |
不支持 |
|
跨注冊中心同步 |
支持 |
不支持 |
不支持 |
支持 |
|
Spring Cloud集成 |
支持 |
支持 |
支持 |
支持 |
|
Dubbo集成 |
支持 |
不支持 |
支持 |
支持 |
|
K8S集成 |
支持 |
不支持 |
支持 |
不支持 |
六、作為配置中心
1、SpringBoot集成Nacos
Nacos使用key/value形式存儲配置信息,為分布式系統(tǒng)中的外部化配置提供服務(wù)支持。
(1)maven文件
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
(2)配置文件
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
blog.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+"; 擅長技術(shù): "+language);
}
}
2、支持配置的動態(tài)更新
一秒刷新一次。
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
//當(dāng)動態(tài)配置刷新時,會更新到 Enviroment中,因此這里每隔一秒中從Enviroment中獲取配置
String name = applicationContext.getEnvironment().getProperty("blog.name");
String language = applicationContext.getEnvironment().getProperty("blog.language");
System.err.println("公眾號 :"+name+"; 擅長技術(shù): "+language);
TimeUnit.SECONDS.sleep(1);
}
}
}
3、可支持profile粒度的配置
4、支持自定義 namespace 的配置
開發(fā)測試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務(wù))隔離等,比如dev和prod。
5、支持自定義 Group 的配置
在沒有明確指定 ${spring.cloud.nacos.config.group}配置的情況下, 默認(rèn)使用的是 DEFAULT_GROUP 。如果需要自定義自己的 Group,可以通過以下配置來實現(xiàn):
spring.cloud.nacos.config.group=DEVELOP_GROUP
6、配置優(yōu)先級
profile > 默認(rèn)配置文件 > extension-configs(下標(biāo)越大優(yōu)先級越高) > shared-configs(下標(biāo)越大優(yōu)先級越高)。
7、@RefreshScope
一般都是通過@Value的形式讀取配置文件中的信息,但是無法感知修改后的值,需要利用@RefreshScope動態(tài)刷新。
8、Spring Cloud Config 橫向?qū)Ρ萅acos
(1) Spring Cloud Config需要結(jié)合Git使用,動態(tài)變更需要配合Bus 消息總線來通知所有的客戶端變化。
(2)Spring Cloud Config沒有可視化界面。
(3)Nacos使用長輪詢更新配置,速度上秒殺Spring Cloud Config。
本文轉(zhuǎn)載自微信公眾號「哪吒編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系哪吒編程公眾號。
標(biāo)題名稱:圖解Nacos,注冊中心演變+Nacos核心功能
URL標(biāo)題:http://fisionsoft.com.cn/article/cdpciih.html


咨詢
建站咨詢
