分佈式動態配置後浪推前浪 -- Nacos

🌴 前言


Nacos 是阿里巴巴的開源的項目,全稱 Naming Configuration Service ,專注於服務發現和配置管理領域。

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。

客戶端語言方面目前支持 Java,go 、python、 C# 和 C++ 等主流語言

開源地址:https://github.com/alibaba/nacos

目前 Github 上已經有近 18K 的 start,又有阿里巴巴複雜的業務做背書,在開源市場非常受歡迎。最近一次 commits 時間在 2021 年 5 月 6 日,社區維護投入力度很大,一些 bug 也能及時修復。

🌴 核心功能

1、動態配置服務

動態配置服務讓您能夠以中心化、外部化和動態化的方式管理所有環境的配置。動態配置消除了配置變更時重新部署應用和服務的需要。配置中心化管理讓實現無狀態服務更簡單,也讓按需彈性擴展服務更容易。

2、服務發現及管理

動態服務發現對以服務爲中心的(例如微服務和雲原生)應用架構方式非常關鍵。Nacos 支持 DNS-Based 和 RPC-Based(Dubbo、gRPC)模式的服務發現。Nacos 也提供實時健康檢查,以防止將請求發往不健康的主機或服務實例。藉助 Nacos,您可以更容易地爲您的服務實現斷路器。

3、動態 DNS 服務

通過支持權重路由,動態 DNS 服務能讓您輕鬆實現中間層負載均衡、更靈活的路由策略、流量控制以及簡單數據中心內網的簡單 DNS 解析服務。動態 DNS 服務還能讓您更容易地實現以 DNS 協議爲基礎的服務發現,以消除耦合到廠商私有服務發現 API 上的風險。

🌴 Nacos 2.x 優點

在 Nacos 1.X 基礎上,對通訊層做了優化,目前採用了gRPC實現了長連接和配置推動,使用長鏈接的好處大幅度減少了 1.x 輪詢心跳頻繁導致 JVM Full GC。

1、客戶端不再需要定時發送實例心跳,只需要有一個維持連接可用 keepalive 消息即可。重複 TPS 可以大幅降低。

2、TCP 連接斷開可以被快速感知到,提升反應速度。

3、長連接的流式推送,比 UDP 更加可靠;nio 的機制具有更高的吞吐量,而且由於可靠推送,可以加長客戶端用於對賬服務列表的時間,甚至刪除相關的請求。重複的無效 QPS 可以大幅降低。

4、長連接避免頻繁連接開銷,可以大幅緩解 TIME_WAIT 問題。

5、真實的長連接,解決配置模塊 GC 問題。

6、更細粒度的同步內容,減少服務節點間的通信壓力。

🌴 Show me the code

外部依賴:

Spring Boot 已經爲 Nacos 封裝了 starter 組件,只需在 pom.xml 文件中添加 jar 版本依賴即可:

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-actuator</artifactId>
    <version>0.2.1</version>
</dependency>

配置文件:

在配置文件 application.yaml 中配置 Nacos 的相關參數,具體內容如下:

nacos:
  config:
    server-addr: 127.0.0.1:8848

就像 Maven 用groupIdartifactIdversion三者來定位一個jar包在倉庫中的位置一樣。Nacos 也提供了 Namespace (命名空間) 、Data ID (配置集 ID)、 Group (組) 來確定一個配置文件。

StartApplication 啓動類,添加 dataId:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class})
@NacosPropertySource(dataId = "bulking-nacos-example"autoRefreshed = true)
public class StartApplication {

    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }
}

nacos 提供了註解方式,實時動態獲取配置項最新值

@Controller
@RequestMapping("config")
public class ConfigController {

    @NacosValue(value = "${useLocalCache}"autoRefreshed = true)
    private boolean useLocalCache;

    @RequestMapping(value = "/get"method = GET)
    @ResponseBody
    public boolean get() {
        return useLocalCache;
    }
}

🌴 操作演示

管理後臺:

Nacos 是一個用 Java 語言編寫的 web 項目,Tomcat 默認端口是 8848,訪問 8848 端口可以打開 Nacos 管理臺。訪問地址:http://localhost:8848/nacos/#/login

用戶名和密碼:nacos/nacos

新增動態配置

當應用啓動時,會將當前節點註冊到 nacos 中

首次訪問:http://localhost:9071/config/get

返回結果:

true

將 nacos 中 Data Idbulking-nacos-example 中的 useLocalCache 設置成false

演示工程在不重啓的情況下,能實時感知配置項的變化。

🌴 工程代碼

https://github.com/aalansehaiyang/spring-boot-bulking  

模塊:spring-boot-bulking-naco


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