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

大家好,我是哪吒。

一、什麼是 Nacos?

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

Nacos 的關鍵特性:

Nacos 的關鍵特性

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

1、RestTemplate 調用遠程服務

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

RestTemplate 調用遠程服務

@SpringBootTest
class Test {

   @Resource
   private RestTemplate restTemplate;

   @Test
   void testSimple()  {
      // 請求地址
      String url = "http://www.nzbc.com/updateUser";

      // 要發送的數據對象
      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 宕機了,怎麼辦?如果從 Nacos 獲取到接口後,調用服務 2 時,服務 2 宕機了,怎麼辦?

4、心跳版 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 核心功能

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 分區容錯性

cOt5Ys

六、作爲配置中心

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;

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/S0NR5etSEQHh7VvVonAhpg