[英]Architecture for microservices
我最近開始使用node.js,並且我必須構建一個應該使用多個express.js服務的體系結構。 其中一些服務必須位於一台服務器上,而另一台則位於其他服務器上。 我想構建一個基本服務(例如API網關),但是我不知道在此網關和微服務之間或兩個微服務之間進行通信的正確方法是什么。
目前,我正在基於以下解決方案:
# inside Gateway server I call another service:
http.get('http://127.0.0.1:5001/users', (service_res) ->
data = ''
service_res.on 'data', (chunk) ->
data += chunk
service_res.on 'end', ->
# some logic on data
).end()
我強烈認為這種方法不正確。 在API網關和微服務之間建立通信邏輯的正確方法是什么?
您所擁有的邏輯不是不正確的,但是可能更好的方法是在向另一個服務發出請求的基礎上構建一個抽象層。 通往另一個微服務的API網關。 讓我們僅為此實例調用該微服務B(API網關向B發出請求)。
在這種情況下,B應該提供自己的客戶端,說明另一服務應如何與之交互(無論是通過HTTP還是WebSockets進行交互),因此協議取決於B,因為B知道應如何與之通信。 客戶和服務一起實現的觀點是,這兩個組件應具有較高的凝聚力,因為從技術上講,它們受合同約束。 如果需要對服務提出要求,則需要遵守服務要求的合同。
在帶有Express的簡單偽代碼中:
// implemented elsewhere, ideally next to the service that it communicates with
function BServiceClient() {
// ...
}
// the API gateway's calling code
app.get('...', function(request, response, next) {
// create an instance of the service client
var bServiceClient = new BServiceClient();
// retrieving the users from an abstracted endpoint
bServiceClient.GetUsers();
// do some processing and then render a response or call next
});
為了使其更具可測試性,您可能必須在app
程序周圍編寫自己的包裝app
以進行適當的依賴注入,以注入客戶端以使路由更可測試。 否則,您可能能夠創建另一個可以注入客戶端的函數,並在調用新創建的函數的處理程序級別創建客戶端。 然后可以測試新創建的功能。 但是,我更喜歡使用包裝器的前一種方法。 希望這可以幫助!
我會做的是
express()
的實例中。 示例+無恥的插件-https: //github.com/swarajgiri/express-bootstrap/blob/master/core/index.js
免責聲明 -以上解決方案是解決問題的一種自以為是的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.