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

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

開始 最新 世界 微信 頻繁 throwable enter ica ice

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

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

通過分析Nacos源碼工程中的pom模塊依賴,畫出了如下每個模塊的依賴關系,每個component就對應者工程裏面的一個maven module,我們重點關註一下工程代碼相關的模塊的依賴關系,依賴關系從上往下,下圖右邊部分:

技術分享圖片

接下來,將介紹一下每個模塊在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的另外一個核心功能的代碼模塊,動態服務發現,內部的包結構如下:

技術分享圖片
和config模塊類似,NamingApp是spring boot的入口類,其他的都通過包隔離了,各個包的名字,大家也可以猜出大概是承擔什麽功能的

core模塊

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

common模塊

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

技術分享圖片

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

client模塊

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

技術分享圖片

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

api模塊

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

技術分享圖片

在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)

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