Node js 微服務架構:如何構建靈活的應用程序
由于對現(xiàn)代和可擴展應用程序的需求激增,微服務的流行也獲得了同樣的動力。這一切都歸功于使之成為可能的高效編程語言。一些組織已經利用Node js 微服務來構建應用程序,例如 Netflix、沃爾瑪、PayPal 和 Trello。
現(xiàn)在,為什么這些組織選擇使用 Node.js 的微服務,以及它如何使您受益,本文將助您一臂之力。
此博客展示了使用 NodeJs 為您的應用程序構建微服務的好處。在進入 node js 微服務教程之前,讓我們先了解一下微服務。
了解 Node js 微服務架構及其工作原理
微服務是一種應用程序架構,可將復雜的應用程序分解為單一的、可管理的服務。它是一種軟件架構方法,其中獨立的組件相互通信以提供高效的功能。
每個服務都通過定義明確的 API 與其他服務交互。每個微服務都與使構建和管理應用程序更易于訪問的明確目的松散耦合。
微服務允許敏捷地開發(fā)、測試和部署服務,使每個服務獨立運行。
NodeJs 中的單體服務與微服務
此外,微服務作為舊的單體系統(tǒng)的解決方案出現(xiàn)。單體系統(tǒng)與微服務相反,因為它是一個具有所有功能的單元。簡單來說,它是一個單一的程序,負責執(zhí)行應用程序的所有部分和服務。
因此,單體應用程序修改起來既費時又復雜,而微服務可以輕松修改。
在開發(fā)強大的應用程序時,Node js 通常是一個不錯的選擇。NodeJs 是一個事件驅動的 JavaScript 框架,旨在處理異步 I/O 和管理大量流量。
通過集成Node.js 微服務架構,您可以創(chuàng)建快速、易于管理且靈活的動態(tài)應用程序。
為什么在 Node.js 中使用微服務?
Node Js 的快速、響應能力和彈性使其成為構建需要快速響應請求和處理錯誤的微服務的絕佳選擇。此外,通過利用微服務和 Node js 的優(yōu)勢,您可以有效地匹配您的用戶和業(yè)務需求。
使用 Node js 和微服務的好處
以下是將 Nodejs 微服務架構用于軟件或應用程序開發(fā)服務的眾多好處。
?? 增強的可擴展性
使用微服務 NodeJs 通過將應用程序分解為小而獨立的組件來提高應用程序的可擴展性。Node js 是一種理想的技術,因為它是事件驅動架構和非阻塞 I/O 模型。使用 Nodejs 中的微服務,您可以同時管理大量大型請求。
?? 多樣化的技術
微服務架構允許高效的技術多樣性,從而為復雜應用程序的構建和管理增加價值。在 Node Js 中使用微服務,您可以通過實現(xiàn)不同的服務和方法來進行快速更改。通過不同的技術和小組件,它更容易與其他系統(tǒng)集成。
?? Increase Resilience
微服務可以獨立開發(fā)和部署,因此您可以修改和更新單個服務而不會影響應用程序的其余部分。此外,每個服務都會處理故障并立即恢復。Nodejs 具有內置的錯誤處理機制,有助于開發(fā)更具彈性的微服務。
?? 資源分配
使用 Node js 微服務,您可以根據項目或服務的特定要求輕松分配資源。例如,如果服務需要更多的處理內存或進程,您可以在那個時候分配它。此外,這將有助于節(jié)省資源、優(yōu)化資源并降低成本。
?? 更好的性能
通過分解和使用強大的技術,您可以為應用程序利用高效的性能。在不影響其余應用程序的情況下,更容易推出更改、修復錯誤和更快地優(yōu)化服務。達到特定要求將改善整體響應時間和應用程序性能。
帶有 Node.js 示例的微服務
在此演示應用程序中,我們將使用連接到外部 API 的 NodeJS 構建微服務。
該應用程序將提供三種服務:Book、Customer 和 Order 服務。每個服務都將有單獨的服務器在不同的端口上運行。這些服務將通過 REST API 相互通信。我們都知道,如果不是微服務架構,我們將只有一臺服務器在運行。但是,在微服務架構中,情況有所不同。
所以,這就是我們在本教程中構建的內容,讓我們從編碼部分開始吧。
準備好簡化您的運營并提高您的底線了嗎?
立即聯(lián)系我們聘請 Node js 開發(fā)人員,開始構建能夠處理最繁忙工作負載的微服務。
在 Node.js 中構建微服務
第 1 步:初始設置
確保安裝了 Node.js。如果您的系統(tǒng)沒有 Node.js,請訪問Nodejs.org下載最新的 Node 版本。
跑步npm 初始化在項目根文件夾中。這將創(chuàng)建一個 package.json 文件,該文件將創(chuàng)建有關包的某些問題,如果您不確定如何響應,可以使用默認值。
我們將使用四個包,Express、mongoose、axios 和 dotenv,它們可以按如下方式安裝:
$ npm install express mongoose axios dotenv --save
項目結構
項目結構請參考下圖。結構因人而異。
第 2 步:創(chuàng)建數(shù)據庫連接
讓我們從建立數(shù)據庫連接的基本步驟開始。在db文件夾下,創(chuàng)建一個db.js來編碼連接數(shù)據庫。這只是一個小的演示應用程序,但大型復雜的應用程序也有用于各個服務的不同數(shù)據庫。
// 數(shù)據庫.js
const mongoose = require('貓鼬');mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
使用統(tǒng)一拓撲:真,
使用查找和修改:錯誤,
使用創(chuàng)建索引:true}).then(() => {
console.log('連接成功!');}).catch((e) => {
console.log('連接失敗!');})
在db.js中,我們需要一個mongoose包來連接 MongoDB 數(shù)據庫。
函數(shù)connect()將接受兩個參數(shù)—— uri 和 options。
第 3 步:創(chuàng)建圖書服務
為 Book 服務創(chuàng)建一個 Book 文件夾,在 Book 文件夾中,我們將創(chuàng)建Book.js來創(chuàng)建 Book 模型。
// 圖書.js
const mongoose = require('貓鼬');const bookSchema = mongoose.Schema({
標題: {
類型:字符串,
要求:真實
},
作者: {
類型:字符串,
要求:真實
},
頁數(shù):{
類型:數(shù)字,
要求:假
},
出版商:{
類型:字符串,
要求:假
}})const Book = mongoose.model("book", bookSchema);module.exports = 書;
現(xiàn)在我們需要為 Book 服務創(chuàng)建一個服務器。
為圖書服務創(chuàng)建服務器
在 Book 文件夾中創(chuàng)建books.js 。由于我們正在學習構建微服務,因此我們將擁有不同的服務服務器。
// 書籍.js
要求(“dotenv”).config();const express = require('快遞');// 連接要求('../db/db');const Book = require('./Book');const app = express();常量端口= 3000;app.use(express.json())app.post('/book', (req, res) => {
const newBook = new Book({...req.body});
newBook.save().then(() => {
res.send('新書添加成功!')
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
})})app.get('/books', (req, res) => {
Book.find().then((books) => {
如果(書籍。長度!== 0){
res.json(書籍)
} 別的 {
res.status(404).send('找不到書');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});})app.get('/book/:id', (req, res) => {
Book.findById(req.params.id).then((book) => {
如果(書){
res.json(書籍)
} 別的 {
res.status(404).send('找不到書');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});})app.delete('/book/:id', (req, res) => {
Book.findOneAndRemove(req.params.id).then((book) => {
如果(書){
res.json('圖書刪除成功!')
} 別的 {
res.status(404).send('找不到書!');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});});app.listen(端口, () => {
console.log(`在端口 ${port} 上啟動并運行 - 這是圖書服務`);})
我們已經使用 express 來創(chuàng)建服務器,制作了連接數(shù)據庫所需的 db 文件,以及 Book 模型來存儲數(shù)據以提高Node 性能。
圖書服務有四種路線:
添加書籍
從數(shù)據庫中獲取所有書籍
得到一本特定的書
刪除一本書
在3000 端口運行 book 服務。
第 4 步:創(chuàng)建客戶服務
為客戶服務創(chuàng)建一個 Customer 文件夾,在 Customer 文件夾中,我們將有Customer.js作為模型,就像我們在上一節(jié)中為 Book 服務所做的那樣。
// 客戶.js
const mongoose = require('貓鼬');const CustomerSchema = mongoose.Schema({
姓名: {
類型:字符串,
要求:真實
},
年齡: {
類型:數(shù)字,
要求:真實
},
地址: {
類型:字符串,
要求:真實
}})const Customer = mongoose.model("客戶", CustomerSchema);module.exports = 客戶;
現(xiàn)在我們需要為客戶服務創(chuàng)建一個服務器。
為客戶服務創(chuàng)建服務器
我們還將為客戶服務提供單獨的服務器。創(chuàng)建一個名為customer.js的文件。
// 客戶.js
要求(“dotenv”).config();const express = require('快遞');// 連接要求('../db/db');const Customer = require('./Customer');const app = express();常量端口= 5000;app.use(express.json())app.post('/customer', (req, res) => {
const newCustomer = new Customer({...req.body});
newCustomer.save().then(() => {
res.send('新客戶創(chuàng)建成功!');
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
})})app.get('/customers', (req, res) => {
Customer.find().then((客戶) => {
如果(客戶){
res.json(客戶)
} 別的 {
res.status(404).send('未找到客戶');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});})app.get('/customer/:id', (req, res) => {
Customer.findById(req.params.id).then((客戶)=>{
如果(客戶){
res.json(客戶)
} 別的 {
res.status(404).send('未找到客戶');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});})app.delete('/customer/:id', (req, res) => {Customer.findByIdAndRemove(req.params.id).then((customer) => {
如果(客戶){
res.json('客戶刪除成功!')
} 別的 {
res.status(404).send('找不到客戶!');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});});app.listen(端口, () => {
console.log(`在端口 ${port} 上啟動并運行 - 這是客戶服務`);})
為客戶服務創(chuàng)建與我們?yōu)閳D書服務所做的相同的四個路由
在端口 5000運行客戶服務。
第五步:創(chuàng)建訂單服務
在模型的 Order 文件夾中創(chuàng)建一個Order.js 文件,就像我們?yōu)?Book 和 Customer service 所做的那樣。
// 訂單.js
const mongoose = require('貓鼬');const orderSchema = mongoose.Schema({
客戶ID: {
類型:mongoose.SchemaTypes.ObjectId,
要求:真實
},
書號:{
類型:mongoose.SchemaTypes.ObjectId,
要求:真實
},
初始日期:{
類型:日期,
要求:真實
},
交貨日期: {
類型:日期,
要求:假
}})const Order = mongoose.model("order", orderSchema);module.exports = 訂單;
現(xiàn)在我們需要為訂單服務創(chuàng)建一個服務器。
為訂單服務創(chuàng)建服務器
在 Order 文件夾中創(chuàng)建 order.js。
// 訂單.js
要求(“dotenv”).config();const express = require('快遞');const mongoose = require("貓鼬");const axios = require('axios');// 連接要求('../db/db');const Order = require('./Order');const app = express();常量端口= 9000;app.use(express.json())app.post('/order', (req, res) => {
const newOrder = 新訂單({
customerID: mongoose.Types.ObjectId(req.body.customerID),
bookID: mongoose.Types.ObjectId(req.body.bookID),
初始日期:req.body.initialDate,
交貨日期:req.body.deliveryDate});newOrder.save().then(() => {
res.send('新訂單添加成功!')
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
})})app.get('/訂單', (req, res) => {
Order.find().then((訂單) => {
如果(訂單){
res.json(訂單)
} 別的 {
res.status(404).send('未找到訂單');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});})app.get('/order/:id', (req, res) => {
Order.findById(req.params.id).then((order) => {
如果(訂單){
axios.get(`http://localhost:5000/customer/${order.customerID}`).then((response) => {
讓 orderObject = {
客戶名稱:response.data.name,
書名: ''
}
axios.get(`http://localhost:3000/book/${order.bookID}`).then((response) => {
orderObject.BookTitle = response.data.title
res.json(orderObject);
})
})
} 別的 {
res.status(404).send('未找到訂單');
}
}).catch((錯誤) => {
res.status(500).send('內部服務器錯誤!');
});})app.listen(端口, () => {
console.log(`在端口 ${port} 上啟動并運行 - 這是訂單服務`);})
在端口 9000運行客戶服務。
我們將在訂單服務中創(chuàng)建三個路由:
添加訂單。您需要為其傳遞bookId、customerId、initialDate 和 deliveryDate 。
從數(shù)據庫中獲取所有訂單
獲取特定訂單的客戶和預訂詳細信息。
要運行最后一條路線,請確保所有服務都在后臺運行。因為我們也從圖書服務和客戶服務中獲取詳細信息。
因此,這是使用 Node.js 構建微服務的分步指南。完整的源代碼可以在這里找到:nodejs-microservices-example
結論
因此,NodeJ 中的微服務非常適合開發(fā)應用程序。此外,它是理想的,因為兩者具有相同的方法和目的:增長更快和更具可擴展性的應用程序。
在微服務中使用 Node js 允許您以多種方法和技術開發(fā)軟件應用程序。在微服務中使用 Nodejs,您可以修改和更新任何更改,而不會影響任何進程。
我們希望您訪問本教程的目的達到了您的預期。如果您想在下一個項目中利用 Nodejs 微服務的優(yōu)勢,您可以聘請 Nodejs 開發(fā)人員來開發(fā)靈活的應用程序。