1. 程式人生 > >深入淺出高效能服務發現、配置框架Nacos系列 2: Nacos專案結構介紹

深入淺出高效能服務發現、配置框架Nacos系列 2: Nacos專案結構介紹

今天,我們分析一下Nacos工程的包模組結構,都是負責什麼功能的,從全域性看一下整個工程,從整體到細節,還沒下載原始碼的同學,趕緊動起來!https://github.com/alibaba/nacos,這個是github程式碼地址,開始之前先start關注一下,加上watch,後續Nacos的郵件列表也會通知到你,可以關注到Nacos的最新實時訊息,及各大牛之間的精彩討論。

加入阿里巴巴中介軟體開發者群,微信新增“zjjxg2018”,並備註公司-城市資訊。

截止本文發出,程式碼最新是master分支上0.2.0版本的,新開源版迭代會比較頻繁,很可能某個類,或者模組依賴關係,下個版本就不一樣了,請不要疑惑。

通過分析Nacos原始碼工程中的pom模組依賴,畫出瞭如下每個模組的依賴關係,每個component就對應者工程裡面的一個maven module,我們重點關注一下工程程式碼相關的模組的依賴關係,依賴關係從上往下,下圖右邊部分:

image | center | 554x425

接下來,將介紹一下每個模組在Nacos工程中的職責及依賴關係。

console模組:

目前裡面是空的,根據Nacos的版本規劃,預計在0.3.0版本里面,會在這個模組裡面放入Nacos控制檯相關程式碼,及前端資源,它依賴config和naming模組,由此可以看出,consule前端依賴的api,將直接由這2個模組進行提供

config模組:

大家知道,Nacos目前有3大核心功能,其中一個是動態配置發現,這個包裡面,放的就是配置中心的程式碼,開啟模組,內部的包結構如下圖:

基本上從名字都能猜出個大概,這裡就不詳細講解裡面的具體實現了,後續有章節介紹。工程是基於spring boot構建的,所以會有一個入口類Config,裡面開啟就是Spring boot玩家熟悉的spring boot載入入口方法了,SpringApplication.run(Config.class, args)

naming:

這個是Nacos的另外一個核心功能的程式碼模組,動態服務發現,內部的包結構如下:

image | center | 482x413 和config模組類似,NamingApp是spring boot的入口類,其他的都通過包隔離了,各個包的名字,大家也可以猜出大概是承擔什麼功能的

core模組

從上圖可以看出,由config直接依賴,目前裡面是空的,看來還是屬於規劃之中,從core上裡面,這裡可能會抽取出一些核心服務,供多個功能模組使用,例如資料層,一致性協議等

common模組

目前由config通過core間接依賴到,翻開了裡面的程式碼,是一些公用的工具類,如下圖所示:

目前只有這些工具類,naming目前沒有依賴到,但是後續和config模組進行融合時,這裡面後續會放入共同依賴的一些類,例如請求物件,異常,協議結構等

client模組

這個裡面放的是Nacos客戶端的程式碼,服務發現和配置管理2個功能的客戶端,目前在工程模組上已經做了統一,但是,在程式碼包上面,還是分離到,可以從包結構裡面看出,如下:

image | center | 507x643

很明顯分了2個模組,配置和naming,後續隨著整合到深度,這些都會陸續合併掉,真正做到統一

api模組

這個裡面,主要是把naming和config的api進行了抽取,從結構上看更清晰一些,api的具體實現,都還在client模組裡面,它包結構如下:

image | center | 535x477

Nacos的使用手冊中,使用到的工廠類,NacosFactory在構建對應例項時,呼叫的就是api裡面的,根據不同的方法,再通過反射構造出對應的例項:


public static ConfigService createConfigService(String serverAddr) throws NacosException {
   Properties properties = new Properties();
   properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
   try {
      Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService");
      Constructor constructor = driverImplClass.getConstructor(Properties.class);
      ConfigService vendorImpl = (ConfigService) constructor.newInstance(properties);
      return vendorImpl;
   } catch (Throwable e) {
      throw new NacosException(-400, e.getMessage());
   }
}
  • 其他非工程原始碼的模組,是用來放測試用例,文件,打包檔案,啟動指令碼的,這個就不詳細講了,大家有興趣可以翻開來看看。

總結

Nacos的工程,包含了Nacos Server和Nacos Client2個工程的程式碼,後續會再console的程式碼也放入總工程中,這些程式碼都放在一起,對使用和學習者來說,是非常方便的,其中,Nacos Server,由配置和服務發現2個大功能,分別由config和naming承載,client和naming模組的程式碼,都沒有共同依賴的類,由此可以看出,client與server之間的協議,是和語言沒有關係,沒有涉及到自己的私有應用層協議,這樣的話,多語言客戶端的接入,會簡單很多,在客戶端的模組裡面,這2個功能就統一到了NacosClient模組裡面,server目前還是不同的模組,後續這塊需要看Nacos的架構融合演進。

總的來說,目前Nacos的工程,將框架都搭好了,但是一些整合的實現和優化,都還未清晰,好幾個包都是空的,功能和系統架構,還在規劃之中,因此大家多參與進來,有很多的機會和空間給你們發揮,你的提議很可能會成為Nacos的標準,服務於世界級工程應用!

加入阿里巴巴中介軟體開發者群,微信新增“zjjxg2018”,並備註公司-城市資訊。