Nacos初體驗

最近項目中用到了Nacos注冊中心,所以簡單做了下研究和實踐,在這里跟大家分享一下。本文主要介紹Nacos特性,快速使用,并對Nacos配置更新做了簡單實踐應用。


Nacos屬于Spring Cloud Alibaba體系,代碼已經(jīng)開源了近兩年,中文文檔豐富,開源社區(qū)也很很活躍。


image.png

Java主流注冊中心對比

image.png

從上圖可以看出Nacos的功能強大,支持監(jiān)聽、多數(shù)據(jù)中心,Dubbo和SpringCloud集成,還可以上云。Nacos是不僅支持注冊中心還支持動態(tài)配置,是Spring Cloud注冊中心+Spring Cloud配置中心的集合體。所以Nacos在企業(yè)應用中越來越常見。

Nacos關(guān)鍵特性如下

服務發(fā)現(xiàn)和服務健康監(jiān)測

Nacos支持基于DNS和基于RPC的服務發(fā)現(xiàn)。服務提供者使用原生SDK、OpenAPI、或一個獨立的Agent TODO注冊Service后,服務消費者可以使用DNS TODO或HTTP&API查找和發(fā)現(xiàn)服務。

Nacos提供對服務的實時的健康檢查,阻止向不健康的主機或服務實例發(fā)送請求。Nacos支持傳輸層(PING或TCP)和應用層(如HTTP、MySQL、用戶自定義)的健康檢查。對于復雜的云環(huán)境和網(wǎng)絡拓撲環(huán)境中(如VPC、邊緣網(wǎng)絡等)服務的健康檢查,Nacos提供了agent上報模式和服務端主動檢測2種健康檢查模式。Nacos還提供了統(tǒng)一的健康檢查儀表盤,幫助用戶根據(jù)健康狀態(tài)管理服務的可用性及流量。

動態(tài)配置服務

動態(tài)配置服務可以以中心化、外部化和動態(tài)化的方式管理所有環(huán)境的應用配置和服務配置。

動態(tài)配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。

配置中心化管理讓實現(xiàn)無狀態(tài)服務變得更簡單,讓服務按需彈性擴展變得更容易。

此外,Nacos提供了一個簡潔易用的UI幫助用戶管理所有的服務和應用的配置。Nacos還提供包括配置版本跟蹤、金絲雀發(fā)布、一鍵回滾配置以及客戶端配置更新狀態(tài)跟蹤在內(nèi)的一系列開箱即用的配置管理特性,可以更安全地在生產(chǎn)環(huán)境中管理配置變更和降低配置變更帶來的風險。

動態(tài)DNS服務

動態(tài)DNS服務支持權(quán)重路由,讓開發(fā)者更容易地實現(xiàn)中間層負載均衡、更靈活的路由策略、流量控制以及數(shù)據(jù)中心內(nèi)網(wǎng)的簡單DNS解析服務。動態(tài)DNS服務還能更容易地實現(xiàn)以DNS協(xié)議為基礎(chǔ)的服務發(fā)現(xiàn),以消除耦合到廠商私有服務發(fā)現(xiàn)API上的風險。

服務及其元數(shù)據(jù)管理

Nacos能讓開發(fā)者從微服務平臺建設(shè)的視角管理數(shù)據(jù)中心的所有服務及元數(shù)據(jù),包括管理服務的描述、生命周期、服務的靜態(tài)依賴分析、服務的健康狀態(tài)、服務的流量管理、路由及安全策略、服務的SLA以及最首要的metrics統(tǒng)計數(shù)據(jù)。

附一張Nacos地圖,就是香,用就對了

image.png

Nacos快速搭建

預備環(huán)境準備

Nacos依賴Java環(huán)境來運行。如果是從代碼開始構(gòu)建并運行Nacos,還需要為此配置Maven環(huán)境,請確保是在以下版本環(huán)境中安裝使用:

  1. 64 bit OS,支持Linux/Unix/Mac/Windows,推薦選用Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;下載&配置。
  3. Maven 3.2.x+;下載&配置。

下載源碼或者安裝包

可以從最新穩(wěn)定版本下載nacos-server-version.zip包。 unzip nacos-server-version.zip
或者
tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

啟動服務器

1、Linux/Unix/Mac:

啟動命令(standalone代表著單機模式運行,非集群模式):
sh startup.sh -m standalone

如果是ubuntu系統(tǒng),或者運行腳本報錯提示:符號找不到,可嘗試如下運行:
bash startup.sh -m standalone

2、Windows:

啟動命令(standalone代表著單機模式運行,非集群模式):
cmd startup.cmd -m standalone

服務注冊&發(fā)現(xiàn)和配置管理

服務注冊

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?
serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

服務發(fā)現(xiàn)

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?
serviceName=nacos.naming.serviceName'

發(fā)布配置

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?
dataId=nacos.cfg.dataId&group=test&content=HelloWorld"

獲取配置

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?
dataId=nacos.cfg.dataId&group=test"

關(guān)閉服務器

1、Linux/Unix/Mac:
sh shutdown.sh

2、Windows:
cmd shutdown.cmd
或者雙擊shutdown.cmd運行文件。

SpringCloud集成

啟動了Nacos server后,就可以參考以下示例代碼,為SpringBoot應用啟動Nacos配置管理服務了。

1、添加依賴。

<dependency
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>${latest.version}</version>
</dependency>

2、在application.properties中配置Nacos server的地址:

spring:
    application:
        name: example
    cloud:
        nacos:
            discovery:
                server-addr: 127.0.0.1:8848

3、通過SpringCloud原生注解@RefreshScope實現(xiàn)配置自動更新:

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}

4、訪問http://localhost:8848/nacos用戶名密碼均是nacos
新增/修改配置然后發(fā)布

image.png

useLocalCache:false

5、然后訪問http://localhost:8080/config/get就能看到useLocalCache的變化了。

項目實踐

在我們使用Nacos的過程中,發(fā)現(xiàn)動態(tài)更新有一定的局限性,我們需要將所有nacos的配置加載到內(nèi)存中,以方便我們的使用,但是Nacos無法滿足。

我們就翻閱源碼和官方文檔,實現(xiàn)了下面這個監(jiān)聽器,實現(xiàn)了動態(tài)監(jiān)聽Nacos的配置,并且對配置進行個性化處理,代碼如下:

@Component
public class SampleListener implements ApplicationRunner {

    @Autowired
    private NacosConfigManager nacosConfigManager;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        nacosConfigManager.getConfigService().addListener(//在程序開始的時候添加監(jiān)聽器,監(jiān)聽Nacos動態(tài)配置更新
                "example.yaml", "DEFAULT_GROUP", new Listener() {

                    @SneakyThrows
                    @Override
public void receiveConfigInfo(String configInfo) {
//當配置更新的時候該方法會收到更新。
//configInfo會把Nacos配置轉(zhuǎn)為字符串,你可以在此處進行你想要的處理,比如存到Map,或者對象中等等。
                        Properties properties = new Properties();
                        try {
                            properties.load(new StringReader(configInfo));
                        }
                        catch (IOException e) {
                            e.printStackTrace();
                        }
                        System.out.println("config changed: " + properties);
                    }

                    @Override
                    public Executor getExecutor() {
                        return null;
                    }
                });
    }
}

至此本文結(jié)束,希望看完本篇文章大家能有所收獲,沒玩過Nacos的同學可以嘗試自己動手實踐一下。如果本文有紕漏之處還希望大家踴躍指出,歡迎大家積極交流討論,謝謝。

參考文獻

《SpringCloudAlibaba微服務原理與實踐》

Nacos官方文檔:
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

官方Github示例:
https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-config-example

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容