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

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

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

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

每個module的功能,分析如下:

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

  • config:大家知道,Nacos目前有3大核心功能,其中一個是動態配置發現,這個包裏面,放的就是配置中心的代碼,打開模塊,內部的包結構如下圖:

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

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

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

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

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

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

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

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

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

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

/**
 * Create Config
 * 
 * @param ServerAddr
 *            serverlist
 * @return Config
 * @throws NacosException
 *             Exception
 */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的標準,服務於世界級工程應用!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章