JavaScript 微服务:从 A 到 Z 的架构与实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么选择 JavaScript 微服务?

\n

现代 Web 开发正越来越多地从单体应用转向微服务架构。JavaScript,更确切地说是其服务器端环境 Node.js,凭借其异步性、事件驱动模型和庞大的生态系统社区,非常适合构建微服务。在本文中,我们将探讨如何设计、开发和部署 JavaScript 微服务——从理论到实用的代码示例。

\n\n

1. 微服务架构基础

\n

微服务架构是一种将应用程序拆分为小型、独立服务的方法。每个服务负责自己的业务逻辑,拥有自己的数据存储,并且可以独立部署、扩展和更新。

\n

Node.js 微服务的优势

\n
    \n
  • 可扩展性: Node.js 凭借其非阻塞 I/O,可以轻松处理数千个并发连接。
  • \n
  • 快速原型开发: npm 包和框架(Express、Fastify、NestJS)可以快速创建 REST/GraphQL API。
  • \n
  • 错误隔离: 一个服务的故障不会导致整个应用程序瘫痪。
  • \n
  • 技术灵活性: 不同的服务可以使用不同版本的 Node.js,甚至不同的语言。
  • \n
\n

关键组件

\n
    \n
  • API Gateway — 统一入口点,将请求路由到相应的服务。
  • \n
  • 消息代理(RabbitMQ、Redis、Kafka)— 用于异步数据交换。
  • \n
  • 服务注册中心(Consul、etcd)— 用于服务发现。
  • \n
  • 容器化(Docker、Kubernetes)— 用于环境标准化。
  • \n
\n\n

2. 实践:创建两个微服务

\n

让我们分析一个订单系统的示例。我们将有两个微服务:user-service(用户管理)和 order-service(订单管理)。它们将通过 REST API 和 RabbitMQ 进行异步通信。

\n\n

2.1. 基于 Express 的基础服务

\n

从 user-service 开始。安装依赖项:

\n
npm init -y\nnpm install express body-parser
\n

创建 index.js 文件:

\n
const express = require('express');\nconst bodyParser = require('body-parser');\nconst app = express();\nconst PORT = process.env.PORT || 3001;\n\napp.use(bodyParser.json());\n\nconst users = [];\n\napp.post('/users', (req, res) => {\n    const { name, email } = req.body;\n    const user = { id: users.length + 1, name, email };\n    users.push(user);\n    res.status(201).json(user);\n});\n\napp.get('/users/:id', (req, res) => {\n    const user = users.find(u => u.id === parseInt(req.params.id));\n    if (!user) return res.status(404).json({ error: 'User not found' });\n    res.json(user);\n});\n\napp.listen(PORT, () => {\n    console.log(`User service running on port ${PORT}`);\n});
\n

类似地,在端口 3002 上创建 order-service。它将包含一个订单数组和两个端点:POST /orders 和 GET /orders/:id。

\n\n

2.2. API Gateway

\n

让我们在端口 3000 上创建一个简单的网关,根据路径转发请求:

\n
const express = require('express');\nconst httpProxy = require('http-proxy-middleware');\nconst app = express();\n\napp.use('/users', httpProxy.createProxyMiddleware({ target: 'http://localhost:3001', changeOrigin: true }));\napp.use('/orders', httpProxy.createProxyMiddleware({ target: 'http://localhost:3002', changeOrigin: true }));\n\napp.listen(3000, () => console.log('API Gateway on port 3000'));
\n

现在,所有对 /users 的请求都转到 user-service,而对 /orders 的请求则转到 order-service。

\n\n

2.3. 使用 RabbitMQ 进行异步通信

\n

假设在创建订

博客

书籍推荐