圖解Nacos,註冊中心演變 + Nacos核心功能
大家好,我是哪吒。
本系列為SpringCloud微服務系列,上一篇學習了圖解Nginx,系統架構演變 + Nginx反向代理與負載均衡,讀哪吒程式設計,品技術人生。
一、什麼是Nacos?
一個更易於構建雲原生應用的動態服務發現、服務配置和服務管理平臺。
Nacos的關鍵特性:
二、註冊中心演變及其設計思想
1、RestTemplate呼叫遠端服務
如果此時,服務端介面介面名或引數或請求方式更改了,那麼就得同步修改此restTemplate方法,感覺很麻煩。
@SpringBootTest
class Test {
@Resource
private RestTemplate restTemplate;
@Test
void testSimple() {
// 請求地址
String url = ";
// 要傳送的資料物件
User user = new User();
user.setUserId(1);
user.setName("哪吒程式設計");
user.setMsg("讀哪吒程式設計,品技術人生");
// 傳送post請求
User result = restTemplate.postForObject(url, user, User.class);
System.out.println(result);
}
}
2、透過Nginx維護服務列表(upStream)
透過Nginx維護服務列表(upStream),如果服務較多的話,在Nginx透過upStream的方式去配置的話,Nginx配置檔案會變得非常的難以維護。
3、透過Nacos實現註冊中心
這種是最簡單的Nacos註冊中心,有若干個服務,都註冊到Nacos註冊中心,呼叫之前,先到Nacos獲取對應介面,然後進行實際的呼叫。
但是,思考一個問題,如果Nacos當機了,怎麼辦?如果從Nacos獲取到介面後,呼叫服務2時,服務2當機了,怎麼辦?
4、心跳版Nacos
心跳版Nacos,服務1和服務2和Nacos之間維護一個心跳關係,每5秒跳一次,頻率不能太快或者太慢,否者會嗝屁的。
如果Nacos在5秒內沒有收到心跳,則表示服務掛了,Nacos會下線此服務。
對於超過15秒沒有收到客戶端心跳的服務例項,會將它的healthy屬性置為false,客戶端無法呼叫healthy為false的服務。
如果超過30秒沒有收到心跳,Nacos會直接將此服務剔除。
也可以透過服務端主動登出的方式,停止註冊。
服務1呼叫服務2時,服務1會透過定時任務到Nacos中獲取線上的服務,保證所呼叫的服務一直都是健康線上的狀態。
獲取到之後,用快取將其儲存起來,然後透過負載均衡器呼叫服務2,此時,將不再使用服務端的負載均衡Nginx了。
三、Nacos Discovery
SpringBoot中引入Nacos Discovery,實現與Nacos的無縫連線,Nacos Discovery可以將服務自動註冊到Nacos服務端,並且能夠動態感知此服務,並重新整理服務列表。並將服務的host、port、URL等資訊註冊到Nacos。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Nacos 的配置項資訊:
四、Nacos核心功能
1、服務註冊
Nacos Client會透過傳送REST請求向Nacos Server註冊自己的服務,提供自身的後設資料,比如host、port、url等資訊,Nacos Server在收到註冊請求後,會將這些資料資訊儲存在一個雙層的記憶體map中。
2、服務心跳
服務註冊後,服務消費者和Nacos Server之間會維護一個心跳,定時通知server,此服務還活著,防止被剔除掉。
3、服務同步
Nacos Server叢集之間會互相同步已註冊的服務,用來保證服務列表的一致性。
4、服務發現
服務消費者在呼叫服務提供者的服務時,會傳送一個REST請求到Nacos Server,獲取健康的服務列表,然後將其快取到本地,同時開啟一個定時任務,定時訪問Nacos Server,然後更新本地快取。
5、服務健康檢查
Nacos Server會開啟一個定時任務用來檢查註冊服務例項的健康情況,對於超過15秒沒有收到客戶端心跳的服務例項,會將它的healthy屬性置為false,客戶端無法呼叫healthy為false的服務,如果超過30秒沒有收到心跳,Nacos會直接將此服務剔除。
五、作為註冊中心
1、Nacos目前功能最全,用的也最多;
2、Eureka,因為挺更的緣故,比較新的技術都不支援了,目前很多公司都將Eureka換成Nacos了,不推薦使用;
3、Zookeeper,用的最多的地方就是和Dubbo一起使用,不支援負載均衡策略,但可以透過其它元件實現;
4、Consul支援的也很多;
CAP,C一致性,A可用性,P分割槽容錯性
Nacos | Eureka | Zookeeper | Consul | |
---|---|---|---|---|
一致性協議 | CP + AP | CP | AP | CP |
訪問協議 | HTTP/DNS | HTTP | TCP | HTTP/DNS |
健康檢查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | Keep Live | TCP/HTT[/gRPC/Cmd |
負載均衡策略 | 權重/metadata/Seletor | Ribbon | - | Fabio |
雪崩保護 | 有 | 有 | 無 | 無 |
自動登出 | 支援 | 支援 | 支援 | 支援 |
監聽 | 支援 | 支援 | 支援 | 支援 |
多資料中心 | 支援 | 支援 | 支援 | 不支援 |
跨註冊中心同步 | 支援 | 不支援 | 不支援 | 支援 |
Spring Cloud整合 | 支援 | 支援 | 支援 | 支援 |
Dubbo整合 | 支援 | 不支援 | 支援 | 支援 |
K8S整合 | 支援 | 不支援 | 支援 | 不支援 |
六、作為配置中心
1、SpringBoot整合Nacos
Nacos使用key/value形式儲存配置資訊,為分散式系統中的外部化配置提供服務支援。
(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: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+"; 擅長技術: "+language);
}
}
2、支援配置的動態更新
一秒重新整理一次。
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
//當動態配置重新整理時,會更新到 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 的配置
開發測試環境和生產環境的資源(如配置、服務)隔離等,比如dev和prod。
5、支援自定義 Group 的配置
在沒有明確指定 ${spring.cloud.nacos.config.group}
配置的情況下, 預設使用的是 DEFAULT_GROUP 。如果需要自定義自己的 Group,可以透過以下配置來實現:
spring.cloud.nacos.config.group=DEVELOP_GROUP
6、配置優先順序
profile > 預設配置檔案 > extension-configs(下標越大優先順序越高) > shared-configs(下標越大優先順序越高)
7、@RefreshScope
一般都是透過@Value的形式讀取配置檔案中的資訊,但是無法感知修改後的值,需要利用@RefreshScope動態重新整理。
8、Spring Cloud Config 橫向對比Nacos
(1) Spring Cloud Config需要結合Git使用,動態變更需要配合Bus 訊息匯流排來通知所有的客戶端變化;
(2)Spring Cloud Config沒有視覺化介面;
(3)Nacos使用長輪詢更新配置,速度上秒殺Spring Cloud Config;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2937610/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Dubbo使用Nacos註冊中心
- Nacos註冊中心+配置管理
- SpringBoot整合Dubbo,註冊中心nacosSpring Boot
- Dubbo:Nacos作為註冊中心
- 整合 nacos註冊中心配置使用
- springboot整合nacos註冊中心和配置中心Spring Boot
- Spring Cloud Alibaba(4)---Nacos(註冊中心)SpringCloud
- nacos註冊中心原始碼流程分析原始碼
- Nacos註冊與配置中心:使用詳講
- SpringCloud入門(五)Nacos註冊中心(上)SpringGCCloud
- SpringCloud入門(六)Nacos註冊中心(下)SpringGCCloud
- springcloud/springboot整合NACOS 做註冊和配置中心以及nacos原始碼分析GCCloudSpring Boot原始碼
- Dubbo使用nacos作為註冊中心原理剖析
- Nacos配置中心和服務的註冊發現
- SpringCloud-Alibaba之Nacos服務註冊中心SpringGCCloud
- 保姆教程系列二、Nacos實現註冊中心
- 微服務架構 | 3.2 Alibaba Nacos 註冊中心微服務架構
- 阿里 Nacos 註冊中心 配置啟動說明阿里
- SpringCloud Alibaba Nacos註冊中心原始碼淺析SpringGCCloud原始碼
- Nacos(一)原始碼分析Nacos註冊示例流程原始碼
- Spring Cloud Alibaba:Nacos 作為註冊中心和配置中心使用SpringCloud
- 微服務註冊中心 Nacos 比 Eureka的優勢微服務
- 普通springcloud eureka 和 spring cloud Alibaba nacos 註冊中心SpringGCCloud
- nacos 服務註冊原理
- Nacos - 客戶端註冊客戶端
- SpringBoot使用Nacos作為配置中心服務和服務註冊中心Spring Boot
- Dubbo與SpringCloud Alibaba使用Nacos作為配置中心和註冊中心SpringGCCloud
- 手動造輪子——為Ocelot整合Nacos註冊中心
- 微服務實戰系列(四)-註冊中心springcloud alibaba nacos微服務SpringGCCloud
- nacos原理三-註冊中心原理&原始碼啟動.md原始碼
- Spring Cloud Alibaba 使用Nacos作為服務註冊中心SpringCloud
- 手把手教你將Eureka升級Nacos註冊中心
- SpringCloud Alibaba實戰(7:nacos註冊中心管理微服務)SpringGCCloud微服務
- Spring Cloud 註冊Nacos註冊中心啟動報錯:failed to req API:/nacos/v1/ns/instance after all servers....SpringCloudAIAPIServer
- @EnableDiscoveryClient與Nacos自動註冊client
- SpringBoot與Dubbo整合報錯排查(Nacos作為註冊中心)Spring Boot
- nacos註冊中心單節點ap架構原始碼解析架構原始碼
- Nacos(二)原始碼分析Nacos服務端註冊示例流程原始碼服務端