對於所有微服務,我應該只使用一個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');
當你有大量的小微服務的,特別是當這些文件被分割成多個文件時,這可以簡化很多事情。
來源
2017-04-19 14:35:40
rsp
我不是,如果你在這裏使用微服務。每個服務應該被隔離,並且通常通過隊列(RabbitMQ,Kafka)進行通信或者移除請求(HTTP,RPC)。這看起來像是你在'service1'里加載'logger'「服務」 - 這與這種做法背道而馳。我認爲你的'logger.js'是在其他服務中重用的模塊,而不是服務。也許發佈它作爲私人節點包? - 我可能完全誤解了,所以如果我錯了,請糾正我。 –
你說得對。 'Logger.js'不是一個服務,只是一個公共模塊,被所有服務使用。作爲私人節點包發佈似乎是一個好主意:)感謝 – VBoss