圖解Nacos,註冊中心演變 + Nacos核心功能

帶你聊技術發表於2023-03-01


大家好,我是哪吒。

本系列為SpringCloud微服務系列,上一篇學習了圖解Nginx,系統架構演變 + Nginx反向代理與負載均衡,讀哪吒程式設計,品技術人生。

一、什麼是Nacos?

一個更易於構建雲原生應用的動態服務發現、服務配置和服務管理平臺。

圖解Nacos,註冊中心演變 + Nacos核心功能

Nacos的關鍵特性:

圖解Nacos,註冊中心演變 + Nacos核心功能

二、註冊中心演變及其設計思想

1、RestTemplate呼叫遠端服務

如果此時,服務端介面介面名或引數或請求方式更改了,那麼就得同步修改此restTemplate方法,感覺很麻煩

圖解Nacos,註冊中心演變 + Nacos核心功能
@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)

圖解Nacos,註冊中心演變 + Nacos核心功能

透過Nginx維護服務列表(upStream),如果服務較多的話,在Nginx透過upStream的方式去配置的話,Nginx配置檔案會變得非常的難以維護。

3、透過Nacos實現註冊中心

圖解Nacos,註冊中心演變 + Nacos核心功能

這種是最簡單的Nacos註冊中心,有若干個服務,都註冊到Nacos註冊中心,呼叫之前,先到Nacos獲取對應介面,然後進行實際的呼叫。

但是,思考一個問題,如果Nacos當機了,怎麼辦?如果從Nacos獲取到介面後,呼叫服務2時,服務2當機了,怎麼辦?

4、心跳版Nacos


圖解Nacos,註冊中心演變 + 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,註冊中心演變 + Nacos核心功能

四、Nacos核心功能

圖解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分割槽容錯性


NacosEurekaZookeeperConsul
一致性協議CP + APCPAPCP
訪問協議HTTP/DNSHTTPTCPHTTP/DNS
健康檢查TCP/HTTP/MYSQL/Client BeatClient BeatKeep LiveTCP/HTT[/gRPC/Cmd
負載均衡策略權重/metadata/SeletorRibbon-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.classargs);
        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.classargs);
        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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章