2017-04-19 105 views
2

我目前正在開發NodeJs中的微服務架構。我的第一種方法是每個服務一個package.json。儘管訪問公共區域(使用日誌記錄或數據庫實用程序)對於所有微服務來說可能非常棘手。例如:在NodeJs微服務架構中,我應該使用每個服務的package.json嗎?

common-area > 
    logger.js 
    package.json - install module typeorm 

service1 > 
    app.js - use logger.js 
    package.json - also install module typeorm 

當運行node app.js(服務1)我們最終加載,一旦我們做了兩個不同的裝置,一個在共同區域(由記錄器所使用)2個typeorm模塊和另一在服務1。

我應該只使用一個package.json,對於所有微服務,導致只有一個node_modules文件夾?

+0

我不是,如果你在這裏使用微服務。每個服務應該被隔離,並且通常通過隊列(RabbitMQ,Kafka)進行通信或者移除請求(HTTP,RPC)。這看起來像是你在'service1'里加載'logger'「服務」 - 這與這種做法背道而馳。我認爲你的'logger.js'是在其他服務中重用的模塊,而不是服務。也許發佈它作爲私人節點包? - 我可能完全誤解了,所以如果我錯了,請糾正我。 –

+0

你說得對。 'Logger.js'不是一個服務,只是一個公共模塊,被所有服務使用。作爲私人節點包發佈似乎是一個好主意:)感謝 – VBoss

回答

3

對於所有微服務,我應該只使用一個package.json,從而導致>在只有一個node_modules文件夾中?

你不應該擔心有,當你在做微服務,因爲微服務的要點之一是能夠把他們在不同的主機或在單獨的容器多node_modules目錄,他們將無法無論如何分享他們的依賴。

每個微服務應該是一個單獨的服務。您應該避免緊密耦合,以及可能因與微服務體系結構戰鬥並將它們結合在一起而導致的抽象漏洞。

當然微服務並不是唯一可以在實踐中使用的體系結構,但是您希望微服務,那麼每個微服務都應該是完全獨立的。否則,它不是微服務。

如果您可以在服務中共享任何通用代碼,然後將其放入所需的全部或部分服務所需的模塊中。您可以將私有模塊保留在npm上,您可以託管私人npm註冊表,也可以直接從GitHub或GitLab私有回購站安裝該模塊。所有你需要做補充託管在GitHub上的私人(或公共)模塊,可運行:

npm install user/repo --save 

其中user是你的用戶(或組織)在GitHub上的姓名和repo是庫的名稱。請記住,要安裝這樣的模塊(如果它位於私人回購站中),該機器上使用的ssh密鑰必須屬於具有讀取回購站權限的用戶。您也可以在GitHub上使用部署密鑰以獲得更大的靈活性。

您甚至可以通過創建一個包含所有依賴關係並將它們一次性公開給您的服務的獨立模塊來簡化在服務中加載外部依賴關係。例如。如果你創建一個名爲dependencies模塊,看起來像這樣:

module.exports = { 
    _: require('lodash'), 
    P: require('bluebird'), 
    fs: require('mz/fs'), 
    // ... 
}; 

然後你就可以使用所有這些模塊在你的微服務是這樣的:

const { _, P, fs } = require('dependencies'); 

當你有大量的小微服務的,特別是當這些文件被分割成多個文件時,這可以簡化很多事情。

+0

是的。這是我第一個嘗試實現服務之間鬆散耦合的方法。儘管遵循DRY原則,我加入了公共區域的共享代碼。正如@ Caffeinated.tech所建議的那樣,我會嘗試用它製作一個私有模塊。 – VBoss

+0

@VBoss是的,當然你可以使用私有模塊來分解任何常見的代碼。您可以在npm上擁有私有和範圍模塊,您可以直接從GitHub或GitLab或任何其他git倉庫安裝。看到我更新的答案。 – rsp

相關問題