Node.js-mikropalveluiden kehittäminen
Rakentakaa toisistaan riippumattomia Node.js-palveluita, jotka viestivät keskenään, keskittyen toimialalähtöiseen suunnitteluun.
Node.js-mikropalveluiden kehittäminen on ilmainen Node.js-taustakehityksen bootcamp-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Node.js-taustakehityksen bootcamp-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Node.js-taustakehityksen bootcamp-kurssilla on yhteensä 4 oppituntia.
Node.js-mikropalveluiden johdanto
Tervetuloa rakentamaan Node.js-mikropalveluita! Tutustumme siihen, miten luodaan pieniä, itsenäisiä palveluita, jotka toimivat yhdessä.
Mikropalvelu on arkkitehtuurityyli, jossa sovellus rakennetaan pienistä, itsenäisistä palveluista. Jokainen palvelu toimii omassa prosessissaan ja viestii muiden kanssa kevyiden mekanismien, usein HTTP API:n, avulla.

Mikropalveluiden keskeiset periaatteet
Mikropalvelut noudattavat seuraavia keskeisiä periaatteita:
- Itsenäinen käyttöönotto: Jokainen palvelu voidaan ottaa käyttöön itsenäisesti.
- Löyhä kytkentä: Palvelut eivät ole tiukasti riippuvaisia toisistaan.
- Yksi vastuu: Jokainen palvelu keskittyy tiettyyn liiketoimintaominaisuuteen eli toimialueeseen.
- Teknologioiden monipuolisuus: Eri palveluissa voidaan käyttää eri teknologioita, vaikka tässä käytämmekin Node.js:ää.
Domain-Driven Designin perusteet
Domain-Driven Design (DDD) on mikropalveluiden kannalta ratkaisevan tärkeä. Se tarkoittaa palveluiden jäsentämistä liiketoiminta-alueiden ympärille (esim. Users, Products ja Orders).
- Rajatut kontekstit: Jokainen mikropalvelu määrittää oman selkeän rajansa ja omistaa tietyn toimialueensa tiedot ja logiikan.
- Yhteinen kieli: Palvelun toimialueen käsitteistä käytetään sen sisällä yhteistä sanastoa.
Node.js-palvelun rakenne
Tyypillisellä Node.js-mikropalveluprojektilla voi olla esimerkiksi seuraavanlainen rakenne:
my-service/-
src/ -
controllers/(pyyntöjen käsittelylogiikka) -
models/(datan skeemat) -
routes/(API-päätepisteet) -
app.js(Expressin pääasiallinen määritys) -
package.json -
.env(ympäristömuuttujat)
Palveluiden välinen viestintä
Mikropalveluiden on viestittävä keskenään pyyntöjen käsittelemiseksi. Yleisiä menetelmiä ovat:
- HTTP/REST: Synkroniset kutsut palveluiden välillä. Yksi palvelu lähettää HTTP-pyynnön toiselle palvelulle.
- Viestijonot: Asynkroninen viestintä viestinvälittäjän (esim. RabbitMQ:n tai Kafkan) kautta. Palvelut julkaisevat tapahtumia ja tilaavat muiden palveluiden tapahtumia.
Tässä oppitunnissa keskitymme HTTP-viestintään sen yksinkertaisuuden vuoksi.
Käyttäjämikropalvelun rakentaminen
Luodaan yksinkertainen Users-mikropalvelu Expressin avulla. Tämä palvelu hallitsee käyttäjätietoja ja toimii portissa 3001.
Kokeile suorittaa tämä koodi:
const express = require('express');
const app = express();
const PORT = 3001;
app.use(express.json());
const users = [
{ id: 'u1', name: 'Alice', email: 'alice@example.com' },
{ id: 'u2', name: 'Bob', email: 'bob@example.com' }
];
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === req.params.id);
if (user) {
res.json(user);
} else {
res.status(404).send('User not found');
}
});
app.get('/users', (req, res) => {
res.json(users);
});
app.listen(PORT, () => {
console.log(`Users Service running on port ${PORT}`);
});Tuotemikropalvelun rakentaminen
Luodaan seuraavaksi erillinen Products-mikropalvelu. Tämä palvelu hallitsee tuotetietoja ja toimii portissa 3002.
Tämä on täysin itsenäinen sovellus:
const express = require('express');
const app = express();
const PORT = 3002;
app.use(express.json());
const products = [
{ id: 'p1', name: 'Laptop', price: 1200, ownerId: 'u1' },
{ id: 'p2', name: 'Mouse', price: 25, ownerId: 'u2' }
];
app.get('/products', (req, res) => {
res.json(products);
});
app.listen(PORT, () => {
console.log(`Products Service running on port ${PORT}`);
});Palveluiden välisen viestinnän simulointi
Miten Products-palvelu saisi tuotteen omistajan käyttäjätiedot? Se tekee HTTP-kutsun Users-palvelulle!
Tässä esimerkissä simuloimme samassa komentosarjassa sekä pienen palvelimen (käyttäjiä varten) että asiakkaan (käyttäjätietojen hakemista varten), jotta viestinnän kulku tulee näkyviin. Asiakasosa vastaa toimintoa, jonka Product-palvelusi suorittaisi.
const http = require('http');
// --- SIMULATED USER SERVICE (SERVER PART) ---
const users = {
'u1': { id: 'u1', name: 'Alice', email: 'alice@example.com' },
'u2': { id: 'u2', name: 'Bob', email: 'bob@example.com' }
};
const simulatedUserServer = http.createServer((req, res) => {
if (req.url.startsWith('/users/') && req.method === 'GET') {
const userId = req.url.split('/')[2];
if (users[userId]) {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(users[userId]));
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('User not found');
}
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not Found');
}
});
const SIMULATED_PORT = 3001;
simulatedUserServer.listen(SIMULATED_PORT, () => {
console.log(`Simulated User Service running on port ${SIMULATED_PORT}`);
});
// --- CLIENT PART (e.g., a Product Service trying to get user data) ---
async function fetchUserFromSimulatedService(userId) {
return new Promise((resolve, reject) => {
const options = {
hostname: 'localhost',
port: SIMULATED_PORT,
path: `/users/${userId}`,
method: 'GET'
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
if (res.statusCode === 200) {
resolve(JSON.parse(data));
} else {
reject(new Error(`Failed to fetch user: ${res.statusCode}`));
}
});
});
req.on('error', (e) => reject(e));
req.end();
});
}
console.log('\n--- Product Service fetching user data simulation ---');
fetchUserFromSimulatedService('u1')
.then(user => console.log('Fetched User:', user))
.catch(error => console.error('Error fetching user:', error.message))
.finally(() => {
// Important: close the simulated server after demonstration
simulatedUserServer.close(() => console.log('Simulated User Service stopped.'));
});
fetchUserFromSimulatedService('u3') // Try fetching a non-existent user
.then(user => console.log('Fetched User:', user))
.catch(error => console.error('Error fetching user:', error.message));Mikropalveluiden kompromissit
Tehokkuudestaan huolimatta mikropalveluihin liittyy kompromisseja:
- Lisääntynyt monimutkaisuus: Mitä enemmän palveluita on, sitä enemmän hallittavaa, käyttöönotettavaa ja valvottavaa on.
- Tietojen yhdenmukaisuus: Tietojen yhdenmukaisuuden säilyttäminen useiden tietokantojen välillä voi olla haastavaa.
- Hajautetut transaktiot: Usean palvelun kattavat operaatiot edellyttävät huolellista suunnittelua.
- Operatiivinen työmäärä: Tarvitaan vankat CI/CD- ja valvontatyökalut.
Pikatarkistus: mikropalveluiden hyödyt
Mitä olet oppinut, mikä seuraavista on mikropalveluarkkitehtuurin keskeinen hyöty?
Kertaus ja seuraavat vaiheet
Olemme käsitelleet Node.js-mikropalveluiden kehittämisen perusteita, niiden keskeisiä periaatteita ja niiden välistä viestintää. Näimme, miten pienet, tiettyyn toimialueeseen keskittyvät palvelut jäsennetään, ja simuloimme jopa palveluiden välistä viestintää.
Muista, että tehokkuudesta huolimatta monimutkaisuus tuo mukanaan kompromisseja. Seuraavaksi opit hallitsemaan asiakaspyyntöjä näihin palveluihin API Gatewayn avulla!
Opi JavaScript tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 22
- Oppitunnit
- 92
Usein kysytyt kysymykset
Onko oppitunti ”Node.js-mikropalveluiden kehittäminen” ilmainen?
Kyllä – oppitunnin ”Node.js-mikropalveluiden kehittäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Node.js-taustakehityksen bootcamp-kurssin, päivitä CoddyKit PROhon. Node.js-taustakehityksen bootcamp-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Node.js-mikropalveluiden kehittäminen”?
Rakentakaa toisistaan riippumattomia Node.js-palveluita, jotka viestivät keskenään, keskittyen toimialalähtöiseen suunnitteluun. Harjoittelet Node.js-taustakehityksen bootcamp-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Node.js-taustakehityksen bootcamp-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Node.js-taustakehityksen bootcamp-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Node.js-mikropalveluiden kehittäminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Node.js-taustakehityksen bootcamp-oppitunnilla?
Kyllä. Jokainen Node.js-taustakehityksen bootcamp-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Johdatus mikropalveluarkkitehtuuriin
- Node.js-mikropalveluiden kehittäminen
- API Gatewayn toteuttaminen
- Palveluiden välinen viestintä viestijonoilla