📍 Introduction
🙂 As we have discussed in our previous blog "Monolithic vs Microservices: A Practical Approach". But today we're going to implement Microservices Architecture in NodeJS.
👉 You can use any technology like Spring, Python, etc. But we are going to demonstrate using NodeJS.
📍 Directory Structure
🙂 You can find the GitHub Repo (Kindly run npm install in Order, Payment, and API-Gateway directories before running) Here. We have two services Order and Payment with API Gateway.
NodeJS_Microservices
|
---> Order
|
------> server.js (Running on PORT 8081)
|
---> Payment
|
------> server.js (Running on PORT 8082)
|
---> API-Gateway
|
------> server.js (Running on Port 9091)
🔥 The structure of our services looks like this:-
📍 Implementation
🙂 Whenever a client makes a request to the API-Gateway, We have defined some routes (Using prefixes) that redirect the request to the appropriate service (Depends which route is called). Payment and Order services are independent means If one fails other will not be affected.
🔥 Also we can add Auth or Middlewares so that no one can call the services directly or without Authentication. We have implemented a very basic architecture.
- Order Server.js
const express = require("express");
const app = express();
const port = 8081;
app.get("/order-list", (req,res)=>{
let response = {
data: {
item: [
{
id: 1,
name: 'order-1'
},
{
id: 2,
name: 'order-2'
}
]
}
};
res.status(200).json(response);
});
app.get("/", (req,res)=>{
res.send("Order called");
});
app.listen(port, ()=>{
console.log("Listening at localhost "+ port);
})
- Payment server.js
const express = require("express");
const app = express();
const port = 8082;
app.get("/payment-list", (req,res)=>{
let response = {
data: {
item: [
{
id: 1,
name: 'Payment-1'
},
{
id: 2,
name: 'Payment-2'
}
]
}
};
res.status(200).json(response);
});
app.get("/", (req,res)=>{
res.send("Payment called");
});
app.listen(port, ()=>{
console.log("Listening at localhost "+ port);
})
- API-Gateway
const gateway = require("fast-gateway");
const port = 9001;
const server = gateway({
routes: [
{
prefix: "/order",
target: "http://localhost:8081/",
hooks: {}
},
{
prefix: "/payment",
target: "http://localhost:8082/",
hooks: {}
}
]
});
server.get('/mytesting', (req,res)=> {
res.send("Gateway Called");
})
server.start(port).then(server=>{
console.log("Gateway is running "+port);
})
😌 Now, we can start the services including the gateway
📍 And we can request http://localhost:9001/order Or http://localhost:9001/payment
🙋 Follow for more in-depth tutorials. Right now, I am targeting beginners but soon more advanced things we'll discuss.
Drop your views in the Comment Box. Hope It helps.
Top comments (59)
Crisp and nice.
Nice! I used
node-http-proxy
in the past to create a gateway, didn't realize thatfast-gateway
existed, it looks very clean 👍Thanks Rense. Highly appreciate 😊
You are using prefix as "/order" so I think your order server.js will have:
app.get("/order"
And not:
app.get("/order-list"
Kindly correct me if I am wrong.
You'll type localhost:9091/order and it will redirect you to the localhost:8081/
When I call localhost:9091/order on my local, it I am getting 'page can’t be found' error. Am I doing something wrong?
Start all the services including order payment and gateway
Eu creio que não, ele vai ter as rotas com o /order como prefixo, ou seja:
/order
e/order/order-list
True
This is very crisp and well done.
If you don't want to spend a lot of time doing config, we at Snow Owl have enabled request-level routing, monitoring, and transformations for microservices without using Kubernetes. This is done by creating a reverse proxy + API gateway + rules engine.
It's also SaaS, no-code, serverless, and sits on the edge. , we set up in 15 minutes and scale easily. DM me if you want to beta test! Snowowl.co
Ok.
When will your site have docs, screenshots and info?
You can check out docs.snowowl.co for docs, screenshots, and video. Also if you drop your email in the homepage I'll send you an email with beta login!
what is the difference between
let
andconst
? 🤔const
is a signal that the identifier won't be reassigned.let
is a signal that the variable may be reassignedHelpful
Good demo! For simple routing/gateway it can also be done by setting up a reverse proxy with nginx.
Already done in the previous blog
Great read
Easy to Understand. Thanks for this
Thanks 🙂
Highly appreciated. Your posit is motivational. Thanks
Thanks man ☺😊
Some comments may only be visible to logged-in visitors. Sign in to view all comments.