天天看點

你應該知道的 Nacos 接入和避坑指南

每天早上七點三十,準時推送幹貨

你應該知道的 Nacos 接入和避坑指南

Photo by Lukas Leitner on Unsplash

Hello 大家好,我是阿粉,今天給大家分享微服務環境下必須要使用的一個強大的元件 Nacos。自從使用了 Nacos,阿粉的服務再也沒有擔心過服務注冊和發現以及配置管理混亂的問題了。

你應該知道的 Nacos 接入和避坑指南

背景

Nacos 緻力于幫助開發人員發現、配置和管理微服務,Nacos 提供了一組簡單易用的特性集,快速實作動态服務發現、服務配置、服務中繼資料及流量管理。

目前主流的網際網路服務都是基于微服務架構的,那服務與服務之間的互動是必不可少的,而且各個服務的上下線都是互相獨立的,而且服務的配置資訊也是會動态調整的,這就需要我們的服務更加靈活。Nacos 的出現就是幫助我們實作這些繁瑣的功能。

詳細的 Nacos 介紹和部署可以參考官方網站 Nacos.io。這裡隻介紹一下在 SpringBoot 項目中如何快速接入以及接入和使用過程中可能會遇到的坑。

接入

第一步在 pom 配置檔案中加入下面的依賴,用于實作服務注冊發現和配置中心功能。

第二步在 SpringBoot 項目的啟動類上增加如下注解 <code>@EnableDiscoveryClient</code> 用于啟動服務注冊發現功能。

增加配置檔案,對應的配置資訊需要修改成适合自己的,為了友善管理,應用的分組名稱,命名空間以及相關的配置都需要合理的設定。多個業務使用同一個 nacos 叢集的時候,需要根據各個的業務設定各自的命名空間。所有的配置檔案都需要在對應的命名空間下設定,避免多個業務混用,另外業務需要根據用到的元件或者配置,設定獨立的配置檔案,例如資料庫的配置,Redis 的配置等都需要單獨設定,這樣是為了同一個應用其他的其他服務也可以使用,而且再有位址變更的時候可以隻修改一個檔案就好,不會忘記。

代碼中可以使用注解 <code>@Value()</code> 來直接讀取 Nacos 配置中的屬性參數,也可以使用 <code>@ConfigurationProperties(prefix = "spring.datasource")</code> 讀取批量參數。

<code>spring.cloud.nacos.config.ext-config[0].refresh=true</code> 該參數表示是否開啟自動更新,根據是否需要自動更新覺得是否配置,如果需要自動更新,加上這個配置後還需要在需要自動更新配置的 Bean 上面增加<code>@RefreshScop</code> 注解。然後對應的 Bean 内部的屬性就可以實作自動更新了。增加了<code>spring.cloud.nacos.config.ext-config[0].refresh=true</code> 配置後在修改了 Nacos 中的配置過後日志會出現下面資訊,會重新加載配置,并且輸出變更的 key 資訊。

你應該知道的 Nacos 接入和避坑指南

當所有的服務都接入 Nacos 過後,我們在 Nacos 的背景就可以看到每個服務的情況,如下圖,可以看到服務狀态。

你應該知道的 Nacos 接入和避坑指南

然後我們在服務 A 裡面如果要調用服務 B 的時候,就可以直接在 FeginClient 中配置服務 B 的名稱,不需要填寫 URL 了。這樣我們就不用考慮服務 B 是否位址和端口會不會變。服務 B 的執行個體增加還是減少,端口是否變了,對服務 A 來說都不關心,隻要有個服務名稱就可以了。

你應該知道的 Nacos 接入和避坑指南

避坑

Nacos 有一個預設的名為 <code>public</code> 的命名空間,這個命名空間是無法删除的,所有未指定命名空間的配置都會放在該命名空間下;同樣的 Nacos 有一個預設的名為 <code>DEFAULT_GROUP</code>  的分組,在沒有指定分組名稱的時候預設的配置都是在該分組下。

對于我們應用程式來說,由于很多情況下一個 Nacos 叢集是多個團隊共同使用的,是以為了友善管理,我們需要根據自己的業務設定自己的命名空間,用于存放本業務的配置檔案。本命名空間下的配置檔案,根據各個的子產品決定是否需要重新分組。

要知道在沒有清晰的命名空間劃分的時候,要想修改一個配置的内容,是很難受的一件事情。線上的配置調整,一個不小心就是事故。如果還是自動更新配置的話,那連後悔的機會都沒有。

配置檔案應該專一,一個配置檔案就設定一個内容,比如 MySQL 的資料源單獨一個配置,Redis 的資料源單獨一個配置,如果多個 Redis 服務,根據功能建議分開配置,因為并不是所有的服務都需要每個 Redis 的連結配置。各自的服務根據需要單獨引用對應的配置檔案即可。

将所有的配置獨立成一個配置檔案友善後續修改配置,隻要修改一個配置檔案就好,不用擔心其他還有未修改的地方。

合理的規劃配置檔案的内容,往往很多時候可以事半功倍,極大的節約時間和減少出錯的機率。

前面介紹了如何設定配置自動重新整理,不過服務是否需要自動更新配置,這個根據自身的業務去決定。

我這裡一般不建議設定自動更新,因為現在都是微服務部署,有時候我們上線一個新功能的時候都是灰階釋出,如果配置自動更新,再調整配置過後,全部執行個體都會生效,這樣會有風險。不設定自動更新的話,我們可以單獨重新開機個别執行個體,觀察線上情況,等穩定了再釋出所有服務,這樣會安全很多。

當然對于沒有那麼多服務,不需要灰階,影響不大的場景下,配置自動更新會友善很多,再修改配置後不需要重新開機服務。

總結

Nacos 作為服務的注冊發現和配置的統一管理确實十分出色,除了能快速接入 SpringBoot 項目之外,其他的架構都能快速的接入,更多使用可以參考官網。

最後希望大家都能解放雙手快速接入玩起來!

寫在最後

最後邀請你加入我們的知識星球,這裡有 1800+ 優秀的人與你一起進步,如果你是小白那你是穩賺了,很多業内經驗和幹貨分享給你;如果你是大佬,那可以進來我們一起交流分享你的經驗,說不定日後我們還可以有合作,給你的人生多一個可能。

最近大家應該發現微信公衆号資訊流改版了吧,再也不是按照時間順序展示了。這就對阿粉這樣的堅持的原創小号主,可以說非常打擊,閱讀量直線下降,正回報持續減弱。

是以看完文章,哥哥姐姐們給阿粉來個在看吧,讓阿粉擁有更加大的動力,寫出更好的文章,拒絕白嫖,來點正回報呗~。

如果想在第一時間收到阿粉的文章,不被公号的資訊流影響,那麼可以給Java極客技術設為一個星标。

你應該知道的 Nacos 接入和避坑指南

最後感謝各位的閱讀,才疏學淺,難免存在纰漏,如果你發現錯誤的地方,由于本号沒有留言功能,還請你在背景留言指出,我對其加以修改。

&lt; END &gt;

你應該知道的 Nacos 接入和避坑指南

本文分享自微信公衆号 - Java極客技術(Javageektech)。

如有侵權,請删除。